From be21d44700d267bba3967093a91bb02ca2f5b8ec Mon Sep 17 00:00:00 2001 From: Johannes Feichtner Date: Mon, 7 Nov 2022 23:54:37 +0100 Subject: [PATCH] fix(docker): ensure digest is updated only once with ARG and multiple FROM statements (#18061) --- .../manager/dockerfile/extract.spec.ts | 28 +++++++++---------- lib/modules/manager/dockerfile/extract.ts | 4 +++ 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/lib/modules/manager/dockerfile/extract.spec.ts b/lib/modules/manager/dockerfile/extract.spec.ts index 7a67c8db7c..440ff68212 100644 --- a/lib/modules/manager/dockerfile/extract.spec.ts +++ b/lib/modules/manager/dockerfile/extract.spec.ts @@ -750,13 +750,13 @@ describe('modules/manager/dockerfile/extract', () => { expect(res).toEqual([ { autoReplaceStringTemplate: - 'FROM nginx:{{#if newValue}}{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}${patch1}$patch2', + 'FROM nginx:{{#if newValue}}{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}${patch1}$patch2\n', currentDigest: undefined, currentValue: '1.20', datasource: 'docker', depName: 'nginx', depType: 'final', - replaceString: 'FROM nginx:1.20${patch1}$patch2', + replaceString: 'FROM nginx:1.20${patch1}$patch2\n', }, ]); }); @@ -770,13 +770,13 @@ describe('modules/manager/dockerfile/extract', () => { expect(res).toEqual([ { autoReplaceStringTemplate: - 'ARG\tVARIANT="{{#if newValue}}{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}" ', + 'ARG\tVARIANT="{{#if newValue}}{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}" \n', currentDigest: undefined, currentValue: '1.60.0-bullseye', datasource: 'docker', depName: 'rust', depType: 'final', - replaceString: 'ARG\tVARIANT="1.60.0-bullseye" ', + replaceString: 'ARG\tVARIANT="1.60.0-bullseye" \n', }, ]); }); @@ -790,12 +790,12 @@ describe('modules/manager/dockerfile/extract', () => { expect(res).toEqual([ { autoReplaceStringTemplate: - 'ARG IMAGE_VERSION=${IMAGE_VERSION:-ubuntu:{{#if newValue}}{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}}', + 'ARG IMAGE_VERSION=${IMAGE_VERSION:-ubuntu:{{#if newValue}}{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}}\n', currentValue: 'xenial', datasource: 'docker', depName: 'ubuntu', depType: 'final', - replaceString: 'ARG IMAGE_VERSION=${IMAGE_VERSION:-ubuntu:xenial}', + replaceString: 'ARG IMAGE_VERSION=${IMAGE_VERSION:-ubuntu:xenial}\n', versioning: 'ubuntu', }, ]); @@ -833,23 +833,23 @@ describe('modules/manager/dockerfile/extract', () => { expect(res).toEqual([ { autoReplaceStringTemplate: - 'ARG base=nginx:{{#if newValue}}{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}', + 'ARG base=nginx:{{#if newValue}}{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}\n', currentDigest: undefined, currentValue: '1.19', datasource: 'docker', depName: 'nginx', depType: 'stage', - replaceString: 'ARG base=nginx:1.19', + replaceString: 'ARG base=nginx:1.19\n', }, { autoReplaceStringTemplate: - 'ARG base=nginx:{{#if newValue}}{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}', + 'ARG base=nginx:{{#if newValue}}{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}\n', currentDigest: undefined, currentValue: '1.20', datasource: 'docker', depName: 'nginx', depType: 'final', - replaceString: 'ARG base=nginx:1.20', + replaceString: 'ARG base=nginx:1.20\n', }, ]); }); @@ -890,7 +890,7 @@ describe('modules/manager/dockerfile/extract', () => { autoReplaceStringTemplate: ' ARG \\\n' + '\t# multi-line arg\n' + - ' ALPINE_VERSION=alpine:{{#if newValue}}{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}', + ' ALPINE_VERSION=alpine:{{#if newValue}}{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}\n', currentDigest: undefined, currentValue: '3.15.4', datasource: 'docker', @@ -899,7 +899,7 @@ describe('modules/manager/dockerfile/extract', () => { replaceString: ' ARG \\\n' + '\t# multi-line arg\n' + - ' ALPINE_VERSION=alpine:3.15.4', + ' ALPINE_VERSION=alpine:3.15.4\n', }, { autoReplaceStringTemplate: @@ -951,7 +951,7 @@ describe('modules/manager/dockerfile/extract', () => { autoReplaceStringTemplate: ' ARG `\n' + '\t# multi-line arg\n' + - ' ALPINE_VERSION=alpine:{{#if newValue}}{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}', + ' ALPINE_VERSION=alpine:{{#if newValue}}{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}\n', currentDigest: undefined, currentValue: '3.15.4', datasource: 'docker', @@ -960,7 +960,7 @@ describe('modules/manager/dockerfile/extract', () => { replaceString: ' ARG `\n' + '\t# multi-line arg\n' + - ' ALPINE_VERSION=alpine:3.15.4', + ' ALPINE_VERSION=alpine:3.15.4\n', }, { autoReplaceStringTemplate: diff --git a/lib/modules/manager/dockerfile/extract.ts b/lib/modules/manager/dockerfile/extract.ts index 1628125d48..c13f4fd93a 100644 --- a/lib/modules/manager/dockerfile/extract.ts +++ b/lib/modules/manager/dockerfile/extract.ts @@ -89,6 +89,10 @@ function processDepForAutoReplace( .map((lineNumber) => lines[lineNumber]) .join(linefeed); + if (!dep.currentDigest) { + dep.replaceString += linefeed; + } + dep.autoReplaceStringTemplate = getAutoReplaceTemplate(dep); }