diff --git a/lib/manager/dockerfile/extract.spec.ts b/lib/manager/dockerfile/extract.spec.ts index 6861578bd3842ed7ec7555b025ee2b6e6ee024ab..cbb52f1229d970d0bd0701d08812ec79a5bff347 100644 --- a/lib/manager/dockerfile/extract.spec.ts +++ b/lib/manager/dockerfile/extract.spec.ts @@ -665,5 +665,53 @@ Object { } `); }); + + it('skips depName containing a non default variable at start', () => { + const res = getDep('$CI_REGISTRY/alpine:3.15'); + expect(res).toMatchInlineSnapshot(` + Object { + "autoReplaceStringTemplate": "{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}", + "datasource": "docker", + "replaceString": "$CI_REGISTRY/alpine:3.15", + "skipReason": "contains-variable", + } + `); + }); + + it('skips depName containing a non default variable with brackets at start', () => { + const res = getDep('${CI_REGISTRY}/alpine:3.15'); + expect(res).toMatchInlineSnapshot(` + Object { + "autoReplaceStringTemplate": "{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}", + "datasource": "docker", + "replaceString": "\${CI_REGISTRY}/alpine:3.15", + "skipReason": "contains-variable", + } + `); + }); + + it('skips depName containing a non default variable', () => { + const res = getDep('docker.io/$PREFIX/alpine:3.15'); + expect(res).toMatchInlineSnapshot(` + Object { + "autoReplaceStringTemplate": "{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}", + "datasource": "docker", + "replaceString": "docker.io/$PREFIX/alpine:3.15", + "skipReason": "contains-variable", + } + `); + }); + + it('skips depName containing a non default variable with brackets', () => { + const res = getDep('docker.io/${PREFIX}/alpine:3.15'); + expect(res).toMatchInlineSnapshot(` + Object { + "autoReplaceStringTemplate": "{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}", + "datasource": "docker", + "replaceString": "docker.io/\${PREFIX}/alpine:3.15", + "skipReason": "contains-variable", + } + `); + }); }); }); diff --git a/lib/manager/dockerfile/extract.ts b/lib/manager/dockerfile/extract.ts index 242d3c02cf713e2eaea5048d43b8233476d034e0..1a7e973460850a874695582f4bce47fe6218a38d 100644 --- a/lib/manager/dockerfile/extract.ts +++ b/lib/manager/dockerfile/extract.ts @@ -56,7 +56,14 @@ export function splitImageParts(currentFrom: string): PackageDependency { depName = depTagSplit.join(':'); } - if (currentValue && currentValue.indexOf(variableMarker) !== -1) { + if (depName?.includes(variableMarker)) { + // If depName contains a variable, after cleaning, e.g. "$REGISTRY/alpine", we currently not support this. + return { + skipReason: 'contains-variable', + }; + } + + if (currentValue?.includes(variableMarker)) { // If tag contains a variable, e.g. "5.0${VERSION_SUFFIX}", we do not support this. return { skipReason: 'contains-variable', diff --git a/lib/manager/gitlabci/__fixtures__/gitlab-ci.7.yaml b/lib/manager/gitlabci/__fixtures__/gitlab-ci.7.yaml new file mode 100644 index 0000000000000000000000000000000000000000..bb9b9c49895f6df25ea3cff58bc5077987b712df --- /dev/null +++ b/lib/manager/gitlabci/__fixtures__/gitlab-ci.7.yaml @@ -0,0 +1,17 @@ +image: + # comment + name: $VARIABLE/renovate/renovate:31.65.1-slim + +services: + # comment + - name: $VARIABLE/other/image1:1.0.0 + alias: imagealias1 + # comment + - name: ${VARIABLE}/other/image1:2.0.0 + alias: imagealias2 + # comment + - name: docker.io/$VARIABLE/image1:3.0.0 + alias: imagealias1 + # comment + - name: docker.io/${VARIABLE}/image1:4.0.0 + alias: imagealias2 diff --git a/lib/manager/gitlabci/extract.spec.ts b/lib/manager/gitlabci/extract.spec.ts index 89f161453e0250399d66736641c6b69a08a13a47..ef55412f49c2de9f08889a18b64de8e3c3a6539b 100644 --- a/lib/manager/gitlabci/extract.spec.ts +++ b/lib/manager/gitlabci/extract.spec.ts @@ -101,5 +101,58 @@ describe('manager/gitlabci/extract', () => { expect(res).toBeNull(); expect(logger.logger.warn).toHaveBeenCalled(); }); + + it('skips images with variables', async () => { + const res = await extractAllPackageFiles(config, [ + 'lib/manager/gitlabci/__fixtures__/gitlab-ci.7.yaml', + ]); + expect(res).toEqual([ + { + deps: [ + { + autoReplaceStringTemplate: + '{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}', + datasource: 'docker', + depType: 'image-name', + replaceString: '$VARIABLE/renovate/renovate:31.65.1-slim', + skipReason: 'contains-variable', + }, + { + autoReplaceStringTemplate: + '{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}', + datasource: 'docker', + depType: 'service-image', + replaceString: '$VARIABLE/other/image1:1.0.0', + skipReason: 'contains-variable', + }, + { + autoReplaceStringTemplate: + '{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}', + datasource: 'docker', + depType: 'service-image', + replaceString: '${VARIABLE}/other/image1:2.0.0', + skipReason: 'contains-variable', + }, + { + autoReplaceStringTemplate: + '{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}', + datasource: 'docker', + depType: 'service-image', + replaceString: 'docker.io/$VARIABLE/image1:3.0.0', + skipReason: 'contains-variable', + }, + { + autoReplaceStringTemplate: + '{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}', + datasource: 'docker', + depType: 'service-image', + replaceString: 'docker.io/${VARIABLE}/image1:4.0.0', + skipReason: 'contains-variable', + }, + ], + packageFile: 'lib/manager/gitlabci/__fixtures__/gitlab-ci.7.yaml', + }, + ]); + }); }); });