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 0829ba25fcbc74826becac79ce44d6e2bf543782..0000000000000000000000000000000000000000 --- 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 8607426d785cab1d6c56af24a9c8722d7c6a0667..0000000000000000000000000000000000000000 --- 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 a0e6277d1e1afda1fff3ce3c1aa85ea07c97ed08..046e4127deaf45fc129049c17ad2c983e3cc5d14 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 68c3604297044f78cc96b1d64c3579d63fe58d26..ec24ad47c381d995c84daed290865078d9ef926b 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 37f6bae92d2773079afe6bf7fe0447d7da8055fb..effe283fda95133919fbec75eb0f5083ba8ac58f 100644 --- a/lib/manager/gitlabci-include/extract.ts +++ b/lib/manager/gitlabci-include/extract.ts @@ -3,8 +3,6 @@ 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 * as gitlabci from '../gitlabci/extract'; import type { ExtractConfig, PackageDependency, PackageFile } from '../types'; function extractDepFromIncludeFile(includeObj: { @@ -25,19 +23,11 @@ function extractDepFromIncludeFile(includeObj: { return dep; } -async function extractDepsFromIncludeLocal(includeObj: { - local: string; -}): Promise<PackageDependency[] | null> { - 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> { +): 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 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 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 0000000000000000000000000000000000000000..b977704c90999d8b8b5377b59f66924d7846785b --- /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 0000000000000000000000000000000000000000..76e4de4fa0e75499989852977a65a90ebca3c6eb --- /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 0000000000000000000000000000000000000000..a4c0bb2233106f9a81ebd2c6d5a432dec4d5c184 --- /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 cf7c455c59d31d5a9cf7bc91cb8b7f6299a7c02b..2e5af6d09286a3efe127424c3c550e0799820a59 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[`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[`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[`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 269e4d30e44be1e986ea854246286cbc2ea656f2..de512c94ef9d37580f1974ce7c18ee6523ea2561 100644 --- a/lib/manager/gitlabci/extract.spec.ts +++ b/lib/manager/gitlabci/extract.spec.ts @@ -1,34 +1,62 @@ -import { readFileSync } from 'fs'; -import { extractPackageFile } from './extract'; +import { getName } from '../../../test/util'; +import type { PackageDependency } from '../types'; +import { extractAllPackageFiles } 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' -); +describe(getName(__filename), () => { + 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); -describe('lib/manager/gitlabci/extract', () => { - describe('extractPackageFile()', () => { - it('returns null for empty', () => { - expect(extractPackageFile('nothing here')).toBeNull(); + 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 dcf7b896be6f7e4ad851366cb620f79437bfb6f5..72a42e9e5e488dcecb93592bbeb732ecdd981085 100644 --- a/lib/manager/gitlabci/extract.ts +++ b/lib/manager/gitlabci/extract.ts @@ -1,6 +1,9 @@ +import is from '@sindresorhus/is'; +import yaml from 'js-yaml'; import { logger } from '../../logger'; +import { readLocalFile } from '../../util/fs'; import { getDep } from '../dockerfile/extract'; -import type { PackageDependency, PackageFile } from '../types'; +import type { ExtractConfig, PackageDependency, PackageFile } from '../types'; function skipCommentLines( lines: string[], @@ -79,3 +82,49 @@ export function extractPackageFile(content: string): PackageFile | null { } return { deps }; } + +export async function extractAllPackageFiles( + config: ExtractConfig, + packageFiles: string[] +): Promise<PackageFile[] | null> { + const filesToExamine = new Set<string>(packageFiles); + const results: PackageFile[] = []; + + // extract all includes from the files + while (filesToExamine.size > 0) { + const file = filesToExamine.values().next().value; + filesToExamine.delete(file); + + 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) { + const fileObj = (includeObj.local as string).replace(/^\//, ''); + if (!filesToExamine.has(fileObj)) { + filesToExamine.add(fileObj); + } + } + } + } + + const result = extractPackageFile(content); + if (result !== null) { + results.push({ + packageFile: file, + deps: result.deps, + }); + } + } + + logger.trace( + { packageFiles, files: filesToExamine.entries() }, + 'extracted all GitLab CI files' + ); + + if (!results.length) { + return null; + } + + return results; +} diff --git a/lib/manager/gitlabci/index.ts b/lib/manager/gitlabci/index.ts index 3abbab03721ffae735e7d8c1483fa55c2a87100f..b5754fe7c9ea55deb0b3e4fe1cdfcb096f6d2c68 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$'],