From 213697364fc6f5320a7cbff48010e24600d80147 Mon Sep 17 00:00:00 2001 From: Emanuel Bennici Date: Mon, 22 Feb 2021 16:31:49 +0100 Subject: [PATCH] fix(manager/gitlabci): Update local include files If local files are imported from the GitLab CI YAML file, the dependencies will be recognized but not updated by renovate. Renovate needs to respect the 'include:local' imports and update the depedependencies in those files. `extractPackageFile` is replaced by `extractAllPackageFiles` since the functionality of those two functions are the same. Related to #6745 Fixes #6713 --- .../__fixtures__/gitlab-ci.2.yaml | 5 - .../__fixtures__/gitlab-ci.3.yaml | 6 - .../__snapshots__/extract.spec.ts.snap | 38 --- lib/manager/gitlabci-include/extract.spec.ts | 35 +-- lib/manager/gitlabci-include/extract.ts | 21 +- .../gitlabci/__fixtures__/gitlab-ci.2.yaml | 0 .../gitlabci/__fixtures__/gitlab-ci.3.yaml | 13 + .../gitlabci/__fixtures__/include.1.yml | 5 + lib/manager/gitlabci/__fixtures__/include.yml | 5 + .../__snapshots__/extract.spec.ts.snap | 240 ++++++++++++------ lib/manager/gitlabci/extract.spec.ts | 79 ++++-- lib/manager/gitlabci/extract.ts | 51 +++- lib/manager/gitlabci/index.ts | 4 +- 13 files changed, 294 insertions(+), 208 deletions(-) delete mode 100644 lib/manager/gitlabci-include/__fixtures__/gitlab-ci.2.yaml delete mode 100644 lib/manager/gitlabci-include/__fixtures__/gitlab-ci.3.yaml create mode 100644 lib/manager/gitlabci/__fixtures__/gitlab-ci.2.yaml create mode 100644 lib/manager/gitlabci/__fixtures__/gitlab-ci.3.yaml create mode 100644 lib/manager/gitlabci/__fixtures__/include.1.yml create mode 100644 lib/manager/gitlabci/__fixtures__/include.yml diff --git a/lib/manager/gitlabci-include/__fixtures__/gitlab-ci.2.yaml b/lib/manager/gitlabci-include/__fixtures__/gitlab-ci.2.yaml deleted file mode 100644 index 0829ba25fcbc74..00000000000000 --- a/lib/manager/gitlabci-include/__fixtures__/gitlab-ci.2.yaml +++ /dev/null @@ -1,5 +0,0 @@ -include: -- local: 'lib/manager/gitlabci-include/__fixtures__/include.1.yml' - -stages: -- test diff --git a/lib/manager/gitlabci-include/__fixtures__/gitlab-ci.3.yaml b/lib/manager/gitlabci-include/__fixtures__/gitlab-ci.3.yaml deleted file mode 100644 index 8607426d785cab..00000000000000 --- a/lib/manager/gitlabci-include/__fixtures__/gitlab-ci.3.yaml +++ /dev/null @@ -1,6 +0,0 @@ -include: -- local: 'lib/manager/gitlabci-include/__fixtures__/include.1.yml' -- local: 'lib/manager/gitlabci-include/__fixtures__/include.2.yml' - -stages: -- test diff --git a/lib/manager/gitlabci-include/__snapshots__/extract.spec.ts.snap b/lib/manager/gitlabci-include/__snapshots__/extract.spec.ts.snap index a0e6277d1e1afd..046e4127deaf45 100644 --- a/lib/manager/gitlabci-include/__snapshots__/extract.spec.ts.snap +++ b/lib/manager/gitlabci-include/__snapshots__/extract.spec.ts.snap @@ -1,19 +1,5 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`lib/manager/gitlabci-include/extract extractPackageFile() extracts local include block 1`] = ` -Array [ - Object { - "autoReplaceStringTemplate": "{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}", - "currentDigest": undefined, - "currentValue": "3.11", - "datasource": "docker", - "depName": "alpine", - "depType": "image", - "replaceString": "alpine:3.11", - }, -] -`; - exports[`lib/manager/gitlabci-include/extract extractPackageFile() extracts multiple include blocks 1`] = ` Array [ Object { @@ -36,27 +22,3 @@ Array [ }, ] `; - -exports[`lib/manager/gitlabci-include/extract extractPackageFile() extracts multiple local include blocks 1`] = ` -Array [ - Object { - "autoReplaceStringTemplate": "{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}", - "currentDigest": undefined, - "currentValue": "3.11", - "datasource": "docker", - "depName": "alpine", - "depType": "image", - "replaceString": "alpine:3.11", - }, - Object { - "autoReplaceStringTemplate": "{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}", - "commitMessageTopic": "Node.js", - "currentDigest": undefined, - "currentValue": "12", - "datasource": "docker", - "depName": "node", - "depType": "image", - "replaceString": "node:12", - }, -] -`; diff --git a/lib/manager/gitlabci-include/extract.spec.ts b/lib/manager/gitlabci-include/extract.spec.ts index 68c3604297044f..ec24ad47c381d9 100644 --- a/lib/manager/gitlabci-include/extract.spec.ts +++ b/lib/manager/gitlabci-include/extract.spec.ts @@ -5,50 +5,27 @@ const yamlFile = fs.readFileSync( 'lib/manager/gitlabci-include/__fixtures__/gitlab-ci.1.yaml', 'utf8' ); -const yamlLocal = fs.readFileSync( - 'lib/manager/gitlabci-include/__fixtures__/gitlab-ci.2.yaml', - 'utf8' -); - -const yamlLocalBlock = fs.readFileSync( - 'lib/manager/gitlabci-include/__fixtures__/gitlab-ci.3.yaml', - 'utf8' -); describe('lib/manager/gitlabci-include/extract', () => { describe('extractPackageFile()', () => { - it('returns null for empty', async () => { + it('returns null for empty', () => { expect( - await extractPackageFile('nothing here', '.gitlab-ci.yml', {}) + extractPackageFile('nothing here', '.gitlab-ci.yml', {}) ).toBeNull(); }); - it('extracts multiple include blocks', async () => { - const res = await extractPackageFile(yamlFile, '.gitlab-ci.yml', {}); + it('extracts multiple include blocks', () => { + const res = extractPackageFile(yamlFile, '.gitlab-ci.yml', {}); expect(res.deps).toMatchSnapshot(); expect(res.deps).toHaveLength(3); }); - it('extracts local include block', async () => { - const res = await extractPackageFile(yamlLocal, '.gitlab-ci.yml', {}); - expect(res.deps).toMatchSnapshot(); - expect(res.deps).toHaveLength(1); - }); - it('extracts multiple local include blocks', async () => { - const res = await extractPackageFile( - yamlLocalBlock, - '.gitlab-ci.yml', - {} - ); - expect(res.deps).toMatchSnapshot(); - expect(res.deps).toHaveLength(2); - }); - it('normalizes configured endpoints', async () => { + it('normalizes configured endpoints', () => { const endpoints = [ 'http://gitlab.test/api/v4', 'http://gitlab.test/api/v4/', ]; for (const endpoint of endpoints) { - const res = await extractPackageFile(yamlFile, '.gitlab-ci.yml', { + const res = extractPackageFile(yamlFile, '.gitlab-ci.yml', { endpoint, }); expect(res.deps[0].registryUrls[0]).toEqual('http://gitlab.test'); diff --git a/lib/manager/gitlabci-include/extract.ts b/lib/manager/gitlabci-include/extract.ts index 702081356dde09..2d5b6c0cf76467 100644 --- a/lib/manager/gitlabci-include/extract.ts +++ b/lib/manager/gitlabci-include/extract.ts @@ -3,9 +3,7 @@ import yaml from 'js-yaml'; import * as datasourceGitlabTags from '../../datasource/gitlab-tags'; import { logger } from '../../logger'; import { SkipReason } from '../../types'; -import { readLocalFile } from '../../util/fs'; import { ExtractConfig, PackageDependency, PackageFile } from '../common'; -import * as gitlabci from '../gitlabci/extract'; function extractDepFromIncludeFile(includeObj: { file: any; @@ -25,19 +23,11 @@ function extractDepFromIncludeFile(includeObj: { return dep; } -async function extractDepsFromIncludeLocal(includeObj: { - local: string; -}): Promise { - const content = await readLocalFile(includeObj.local, 'utf8'); - const deps = gitlabci.extractPackageFile(content)?.deps; - return deps; -} - -export async function extractPackageFile( +export function extractPackageFile( content: string, _packageFile: string, config: ExtractConfig -): Promise { +): PackageFile | null { const deps: PackageDependency[] = []; try { // TODO: fix me @@ -50,13 +40,6 @@ export async function extractPackageFile( dep.registryUrls = [config.endpoint.replace(/\/api\/v4\/?/, '')]; } deps.push(dep); - } else if (includeObj.local) { - const includedDeps = await extractDepsFromIncludeLocal(includeObj); - if (includedDeps) { - for (const includedDep of includedDeps) { - deps.push(includedDep); - } - } } } } diff --git a/lib/manager/gitlabci/__fixtures__/gitlab-ci.2.yaml b/lib/manager/gitlabci/__fixtures__/gitlab-ci.2.yaml new file mode 100644 index 00000000000000..e69de29bb2d1d6 diff --git a/lib/manager/gitlabci/__fixtures__/gitlab-ci.3.yaml b/lib/manager/gitlabci/__fixtures__/gitlab-ci.3.yaml new file mode 100644 index 00000000000000..b977704c90999d --- /dev/null +++ b/lib/manager/gitlabci/__fixtures__/gitlab-ci.3.yaml @@ -0,0 +1,13 @@ +image: + # comment + name: renovate/renovate:19.70.8-slim + +services: + # comment + - mariadb:10.4.11 + # another comment + - other/image:1.0.0 + +include: + - local: 'lib/manager/gitlabci/__fixtures__/include.yml' + - local: 'lib/manager/gitlabci/__fixtures__/include.1.yml' diff --git a/lib/manager/gitlabci/__fixtures__/include.1.yml b/lib/manager/gitlabci/__fixtures__/include.1.yml new file mode 100644 index 00000000000000..76e4de4fa0e754 --- /dev/null +++ b/lib/manager/gitlabci/__fixtures__/include.1.yml @@ -0,0 +1,5 @@ +test: + stage: test + image: node:12 + script: + - echo test diff --git a/lib/manager/gitlabci/__fixtures__/include.yml b/lib/manager/gitlabci/__fixtures__/include.yml new file mode 100644 index 00000000000000..a4c0bb2233106f --- /dev/null +++ b/lib/manager/gitlabci/__fixtures__/include.yml @@ -0,0 +1,5 @@ +test: + stage: test + image: alpine:3.11 + script: + - echo test diff --git a/lib/manager/gitlabci/__snapshots__/extract.spec.ts.snap b/lib/manager/gitlabci/__snapshots__/extract.spec.ts.snap index cf7c455c59d31d..49c21dc44194a2 100644 --- a/lib/manager/gitlabci/__snapshots__/extract.spec.ts.snap +++ b/lib/manager/gitlabci/__snapshots__/extract.spec.ts.snap @@ -1,101 +1,177 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`lib/manager/gitlabci/extract extractPackageFile() extracts multiple image lines 1`] = ` +exports[`lib/manager/gitlabci/extract extractAllPackageFiles() extracts multiple image lines 1`] = ` Array [ Object { - "autoReplaceStringTemplate": "{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}", - "currentDigest": undefined, - "currentValue": "2.5.0", - "datasource": "docker", - "depName": "ruby", - "depType": "image", - "replaceString": "ruby:2.5.0", - }, - Object { - "autoReplaceStringTemplate": "{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}", - "currentDigest": undefined, - "currentValue": "latest", - "datasource": "docker", - "depName": "hadolint/hadolint", - "depType": "image", - "replaceString": "hadolint/hadolint:latest", - }, - Object { - "autoReplaceStringTemplate": "{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}", - "currentDigest": undefined, - "currentValue": "latest", - "datasource": "docker", - "depName": "docker", - "depType": "image", - "replaceString": "docker:latest", - }, - Object { - "autoReplaceStringTemplate": "{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}", - "currentDigest": undefined, - "currentValue": "dind", - "datasource": "docker", - "depName": "docker", - "depType": "service-image", - "replaceString": "docker:dind", - }, - Object { - "autoReplaceStringTemplate": "{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}", - "currentDigest": undefined, - "currentValue": "latest", - "datasource": "docker", - "depName": "docker", - "depType": "image", - "replaceString": "docker:latest", - }, - Object { - "autoReplaceStringTemplate": "{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}", - "currentDigest": undefined, - "currentValue": "dind", - "datasource": "docker", - "depName": "docker", - "depType": "service-image", - "replaceString": "docker:dind", + "deps": Array [ + Object { + "autoReplaceStringTemplate": "{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}", + "currentDigest": undefined, + "currentValue": "2.5.0", + "datasource": "docker", + "depName": "ruby", + "depType": "image", + "replaceString": "ruby:2.5.0", + }, + Object { + "autoReplaceStringTemplate": "{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}", + "currentDigest": undefined, + "currentValue": "latest", + "datasource": "docker", + "depName": "hadolint/hadolint", + "depType": "image", + "replaceString": "hadolint/hadolint:latest", + }, + Object { + "autoReplaceStringTemplate": "{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}", + "currentDigest": undefined, + "currentValue": "latest", + "datasource": "docker", + "depName": "docker", + "depType": "image", + "replaceString": "docker:latest", + }, + Object { + "autoReplaceStringTemplate": "{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}", + "currentDigest": undefined, + "currentValue": "dind", + "datasource": "docker", + "depName": "docker", + "depType": "service-image", + "replaceString": "docker:dind", + }, + Object { + "autoReplaceStringTemplate": "{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}", + "currentDigest": undefined, + "currentValue": "latest", + "datasource": "docker", + "depName": "docker", + "depType": "image", + "replaceString": "docker:latest", + }, + Object { + "autoReplaceStringTemplate": "{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}", + "currentDigest": undefined, + "currentValue": "dind", + "datasource": "docker", + "depName": "docker", + "depType": "service-image", + "replaceString": "docker:dind", + }, + Object { + "autoReplaceStringTemplate": "{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}", + "currentDigest": undefined, + "currentValue": "1.15", + "datasource": "docker", + "depName": "image-name-test", + "depType": "image-name", + "replaceString": "image-name-test:1.15", + }, + ], + "packageFile": "lib/manager/gitlabci/__fixtures__/gitlab-ci.yaml", }, +] +`; + +exports[`lib/manager/gitlabci/extract extractAllPackageFiles() extracts multiple image lines with comments 1`] = ` +Array [ Object { - "autoReplaceStringTemplate": "{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}", - "currentDigest": undefined, - "currentValue": "1.15", - "datasource": "docker", - "depName": "image-name-test", - "depType": "image-name", - "replaceString": "image-name-test:1.15", + "deps": Array [ + Object { + "autoReplaceStringTemplate": "{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}", + "currentDigest": undefined, + "currentValue": "19.70.8-slim", + "datasource": "docker", + "depName": "renovate/renovate", + "depType": "image-name", + "replaceString": "renovate/renovate:19.70.8-slim", + }, + Object { + "autoReplaceStringTemplate": "{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}", + "currentDigest": undefined, + "currentValue": "10.4.11", + "datasource": "docker", + "depName": "mariadb", + "depType": "service-image", + "replaceString": "mariadb:10.4.11", + }, + Object { + "autoReplaceStringTemplate": "{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}", + "currentDigest": undefined, + "currentValue": "1.0.0", + "datasource": "docker", + "depName": "other/image", + "depType": "service-image", + "replaceString": "other/image:1.0.0", + }, + ], + "packageFile": "lib/manager/gitlabci/__fixtures__/gitlab-ci.1.yaml", }, ] `; -exports[`lib/manager/gitlabci/extract extractPackageFile() extracts multiple image lines with comments 1`] = ` +exports[`lib/manager/gitlabci/extract extractAllPackageFiles() extracts multiple included image lines 1`] = ` Array [ Object { - "autoReplaceStringTemplate": "{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}", - "currentDigest": undefined, - "currentValue": "19.70.8-slim", - "datasource": "docker", - "depName": "renovate/renovate", - "depType": "image-name", - "replaceString": "renovate/renovate:19.70.8-slim", + "deps": Array [ + Object { + "autoReplaceStringTemplate": "{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}", + "currentDigest": undefined, + "currentValue": "19.70.8-slim", + "datasource": "docker", + "depName": "renovate/renovate", + "depType": "image-name", + "replaceString": "renovate/renovate:19.70.8-slim", + }, + Object { + "autoReplaceStringTemplate": "{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}", + "currentDigest": undefined, + "currentValue": "10.4.11", + "datasource": "docker", + "depName": "mariadb", + "depType": "service-image", + "replaceString": "mariadb:10.4.11", + }, + Object { + "autoReplaceStringTemplate": "{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}", + "currentDigest": undefined, + "currentValue": "1.0.0", + "datasource": "docker", + "depName": "other/image", + "depType": "service-image", + "replaceString": "other/image:1.0.0", + }, + ], + "packageFile": "lib/manager/gitlabci/__fixtures__/gitlab-ci.3.yaml", }, Object { - "autoReplaceStringTemplate": "{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}", - "currentDigest": undefined, - "currentValue": "10.4.11", - "datasource": "docker", - "depName": "mariadb", - "depType": "service-image", - "replaceString": "mariadb:10.4.11", + "deps": Array [ + Object { + "autoReplaceStringTemplate": "{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}", + "currentDigest": undefined, + "currentValue": "3.11", + "datasource": "docker", + "depName": "alpine", + "depType": "image", + "replaceString": "alpine:3.11", + }, + ], + "packageFile": "lib/manager/gitlabci/__fixtures__/include.yml", }, Object { - "autoReplaceStringTemplate": "{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}", - "currentDigest": undefined, - "currentValue": "1.0.0", - "datasource": "docker", - "depName": "other/image", - "depType": "service-image", - "replaceString": "other/image:1.0.0", + "deps": Array [ + Object { + "autoReplaceStringTemplate": "{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}", + "commitMessageTopic": "Node.js", + "currentDigest": undefined, + "currentValue": "12", + "datasource": "docker", + "depName": "node", + "depType": "image", + "replaceString": "node:12", + }, + ], + "packageFile": "lib/manager/gitlabci/__fixtures__/include.1.yml", }, ] `; diff --git a/lib/manager/gitlabci/extract.spec.ts b/lib/manager/gitlabci/extract.spec.ts index 269e4d30e44be1..6242d45e0499e5 100644 --- a/lib/manager/gitlabci/extract.spec.ts +++ b/lib/manager/gitlabci/extract.spec.ts @@ -1,34 +1,61 @@ -import { readFileSync } from 'fs'; -import { extractPackageFile } from './extract'; - -const yamlFile = readFileSync( - 'lib/manager/gitlabci/__fixtures__/gitlab-ci.yaml', - 'utf8' -); - -const yamlFile1 = readFileSync( - 'lib/manager/gitlabci/__fixtures__/gitlab-ci.1.yaml', - 'utf8' -); +import { PackageDependency } from '../common'; +import { extractAllPackageFiles } from './extract'; describe('lib/manager/gitlabci/extract', () => { - describe('extractPackageFile()', () => { - it('returns null for empty', () => { - expect(extractPackageFile('nothing here')).toBeNull(); + describe('extractAllPackageFiles()', () => { + it('returns null for empty', async () => { + expect( + await extractAllPackageFiles({}, [ + 'lib/manager/gitlabci/__fixtures__/gitlab-ci.2.yaml', + ]) + ).toBeNull(); + }); + it('extracts multiple included image lines', async () => { + const res = await extractAllPackageFiles({}, [ + 'lib/manager/gitlabci/__fixtures__/gitlab-ci.3.yaml', + ]); + expect(res).toMatchSnapshot(); + expect(res).toHaveLength(3); + + const deps: PackageDependency[] = []; + res.forEach((e) => { + e.deps.forEach((d) => { + deps.push(d); + }); + }); + expect(deps).toHaveLength(5); }); - it('extracts multiple image lines', () => { - const res = extractPackageFile(yamlFile); - expect(res.deps).toMatchSnapshot(); - expect(res.deps).toHaveLength(7); - expect(res.deps.some((dep) => dep.currentValue.includes("'"))).toBe( - false - ); + it('extracts multiple image lines', async () => { + const res = await extractAllPackageFiles({}, [ + 'lib/manager/gitlabci/__fixtures__/gitlab-ci.yaml', + ]); + expect(res).toMatchSnapshot(); + expect(res).toHaveLength(1); + + const deps: PackageDependency[] = []; + res.forEach((e) => { + e.deps.forEach((d) => { + deps.push(d); + }); + }); + expect(deps).toHaveLength(7); + + expect(deps.some((dep) => dep.currentValue.includes("'"))).toBe(false); }); + it('extracts multiple image lines with comments', async () => { + const res = await extractAllPackageFiles({}, [ + 'lib/manager/gitlabci/__fixtures__/gitlab-ci.1.yaml', + ]); + expect(res).toMatchSnapshot(); + expect(res).toHaveLength(1); - it('extracts multiple image lines with comments', () => { - const res = extractPackageFile(yamlFile1); - expect(res.deps).toMatchSnapshot(); - expect(res.deps).toHaveLength(3); + const deps: PackageDependency[] = []; + res.forEach((e) => { + e.deps.forEach((d) => { + deps.push(d); + }); + }); + expect(deps).toHaveLength(3); }); }); }); diff --git a/lib/manager/gitlabci/extract.ts b/lib/manager/gitlabci/extract.ts index b3361db186db30..7357a965b9412b 100644 --- a/lib/manager/gitlabci/extract.ts +++ b/lib/manager/gitlabci/extract.ts @@ -1,5 +1,8 @@ +import is from '@sindresorhus/is'; +import yaml from 'js-yaml'; import { logger } from '../../logger'; -import { PackageDependency, PackageFile } from '../common'; +import { readLocalFile } from '../../util/fs'; +import { ExtractConfig, PackageDependency, PackageFile } from '../common'; import { getDep } from '../dockerfile/extract'; function skipCommentLines( @@ -79,3 +82,49 @@ export function extractPackageFile(content: string): PackageFile | null { } return { deps }; } + +export async function extractAllPackageFiles( + config: ExtractConfig, + packageFiles: string[] +): Promise { + const filesToExamine = new Set(packageFiles); + const results: PackageFile[] = []; + + // extract all includes from the files + for (const file of packageFiles) { + const content = await readLocalFile(file, 'utf8'); + const doc = yaml.safeLoad(content, { json: true }) as any; + if (doc?.include && is.array(doc.include)) { + for (const includeObj of doc.include) { + if (includeObj.local) { + filesToExamine.add((includeObj.local as string).replace(/^\//, '')); + } + } + } + } + + logger.trace( + { packageFiles, files: filesToExamine.entries() }, + 'extracted all GitLab CI files' + ); + + while (filesToExamine.size > 0) { + const packageFile = filesToExamine.values().next().value; + filesToExamine.delete(packageFile); + + const content = await readLocalFile(packageFile, 'utf8'); + const result = extractPackageFile(content); + if (result !== null) { + results.push({ + packageFile, + deps: result.deps, + }); + } + } + + if (!results.length) { + return null; + } + + return results; +} diff --git a/lib/manager/gitlabci/index.ts b/lib/manager/gitlabci/index.ts index a37df1e2146725..9facb5581a6d13 100644 --- a/lib/manager/gitlabci/index.ts +++ b/lib/manager/gitlabci/index.ts @@ -1,9 +1,9 @@ import { LANGUAGE_DOCKER } from '../../constants/languages'; -import { extractPackageFile } from './extract'; +import { extractAllPackageFiles, extractPackageFile } from './extract'; const language = LANGUAGE_DOCKER; -export { extractPackageFile, language }; +export { extractAllPackageFiles, extractPackageFile, language }; export const defaultConfig = { fileMatch: ['^\\.gitlab-ci\\.yml$'],