diff --git a/lib/manager/gitlabci/__fixtures__/gitlab-ci.6.yaml b/lib/manager/gitlabci/__fixtures__/gitlab-ci.6.yaml new file mode 100644 index 0000000000000000000000000000000000000000..e3dc68bfe881d619b245463af3e4fe94a3006ef3 --- /dev/null +++ b/lib/manager/gitlabci/__fixtures__/gitlab-ci.6.yaml @@ -0,0 +1,11 @@ +image: + # comment + name: renovate/renovate:19.70.8-slim + +services: + # comment + - name: other/image1:1.0.0 + alias: imagealias1 + # another comment + - alias: imagealias2 + name: other/image2:1.0.0 diff --git a/lib/manager/gitlabci/__snapshots__/extract.spec.ts.snap b/lib/manager/gitlabci/__snapshots__/extract.spec.ts.snap index ebfa7c1717853fe462e5bb118ba67fe407c12bb1..138f50d667bb7e68a4765538f7f35fa9a98da75c 100644 --- a/lib/manager/gitlabci/__snapshots__/extract.spec.ts.snap +++ b/lib/manager/gitlabci/__snapshots__/extract.spec.ts.snap @@ -184,6 +184,43 @@ Array [ ] `; +exports[`manager/gitlabci/extract extractAllPackageFiles() extracts multiple named services 1`] = ` +Array [ + Object { + "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": "1.0.0", + "datasource": "docker", + "depName": "other/image1", + "depType": "service-image", + "replaceString": "other/image1:1.0.0", + }, + Object { + "autoReplaceStringTemplate": "{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}", + "currentDigest": undefined, + "currentValue": "1.0.0", + "datasource": "docker", + "depName": "other/image2", + "depType": "service-image", + "replaceString": "other/image2:1.0.0", + }, + ], + "packageFile": "lib/manager/gitlabci/__fixtures__/gitlab-ci.6.yaml", + }, +] +`; + exports[`manager/gitlabci/extract extractAllPackageFiles() extracts named services 1`] = ` Array [ Object { diff --git a/lib/manager/gitlabci/extract.spec.ts b/lib/manager/gitlabci/extract.spec.ts index ca18521d5c0a71700f5fe869afb560d9a2c20605..89f161453e0250399d66736641c6b69a08a13a47 100644 --- a/lib/manager/gitlabci/extract.spec.ts +++ b/lib/manager/gitlabci/extract.spec.ts @@ -51,6 +51,15 @@ describe('manager/gitlabci/extract', () => { expect(res[0].deps).toHaveLength(3); }); + it('extracts multiple named services', async () => { + const res = await extractAllPackageFiles(config, [ + 'lib/manager/gitlabci/__fixtures__/gitlab-ci.6.yaml', + ]); + expect(res).toMatchSnapshot(); + expect(res).toHaveLength(1); + expect(res[0].deps).toHaveLength(3); + }); + it('extracts multiple image lines', async () => { const res = await extractAllPackageFiles(config, [ 'lib/manager/gitlabci/__fixtures__/gitlab-ci.yaml', diff --git a/lib/manager/gitlabci/extract.ts b/lib/manager/gitlabci/extract.ts index 7fe6b85617dfe31c4a524d8c9e79b3172c75e704..af6b4e2026cd2e2d42fea4bcbfade7c204730a83 100644 --- a/lib/manager/gitlabci/extract.ts +++ b/lib/manager/gitlabci/extract.ts @@ -9,20 +9,24 @@ import type { GitlabPipeline } from './types'; import { replaceReferenceTags } from './utils'; const commentsRe = regEx(/^\s*#/); +const aliasesRe = regEx(`^\\s*-?\\s*alias:`); const whitespaceRe = regEx(`^(?<whitespace>\\s*)`); const imageRe = regEx( `^(?<whitespace>\\s*)image:(?:\\s+['"]?(?<image>[^\\s'"]+)['"]?)?\\s*$` ); const nameRe = regEx(`^\\s*name:\\s+['"]?(?<depName>[^\\s'"]+)['"]?\\s*$`); const serviceRe = regEx( - `^\\s*-\\s*(?:name:\\s+)?['"]?(?<depName>[^\\s'"]+)['"]?\\s*$` + `^\\s*-?\\s*(?:name:\\s+)?['"]?(?<depName>[^\\s'"]+)['"]?\\s*$` ); -function skipCommentLines( +function skipCommentAndAliasLines( lines: string[], lineNumber: number ): { lineNumber: number; line: string } { let ln = lineNumber; - while (ln < lines.length - 1 && commentsRe.test(lines[ln])) { + while ( + ln < lines.length - 1 && + (commentsRe.test(lines[ln]) || aliasesRe.test(lines[ln])) + ) { ln += 1; } return { line: lines[ln], lineNumber: ln }; @@ -71,7 +75,10 @@ export function extractPackageFile(content: string): PackageFile | null { let foundImage: boolean; do { foundImage = false; - const serviceImageLine = skipCommentLines(lines, lineNumber + 1); + const serviceImageLine = skipCommentAndAliasLines( + lines, + lineNumber + 1 + ); logger.trace(`serviceImageLine: "${serviceImageLine.line}"`); const serviceImageMatch = serviceRe.exec(serviceImageLine.line); if (serviceImageMatch) {