From 3b9c2f124e16120151a0180962c7db710088b19e Mon Sep 17 00:00:00 2001 From: Mathieu Kniewallner Date: Wed, 11 Sep 2024 23:30:28 +0200 Subject: [PATCH 1/3] test(manager/docker): add key-only argument test --- .../manager/dockerfile/extract.spec.ts | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/lib/modules/manager/dockerfile/extract.spec.ts b/lib/modules/manager/dockerfile/extract.spec.ts index b7934f840b663e..3159dd88c9b4e3 100644 --- a/lib/modules/manager/dockerfile/extract.spec.ts +++ b/lib/modules/manager/dockerfile/extract.spec.ts @@ -1,3 +1,4 @@ +import { codeBlock } from 'common-tags'; import { Fixtures } from '../../../../test/fixtures'; import type { PackageDependency } from '../types'; import { extractVariables, getDep } from './extract'; @@ -395,6 +396,29 @@ describe('modules/manager/dockerfile/extract', () => { ]); }); + it('handles COPY --link --from', () => { + const res = extractPackageFile( + codeBlock` + FROM scratch + COPY --link --from=gcr.io/k8s-skaffold/skaffold:v0.11.0 /usr/bin/skaffold /usr/bin/skaffold + `, + '', + {}, + )?.deps; + expect(res).toEqual([ + { + autoReplaceStringTemplate: + '{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}', + currentDigest: undefined, + currentValue: 'v0.11.0', + datasource: 'docker', + depName: 'gcr.io/k8s-skaffold/skaffold', + depType: 'final', + replaceString: 'gcr.io/k8s-skaffold/skaffold:v0.11.0', + }, + ]); + }); + it('skips named multistage COPY --from tags', () => { const res = extractPackageFile( 'FROM node:6.12.3 as frontend\n\n# comment\nENV foo=bar\nCOPY --from=frontend /usr/bin/node /usr/bin/node\n', From 5a02b94f5afcc44cd8a6f4e666f091f96babbbf0 Mon Sep 17 00:00:00 2001 From: Mathieu Kniewallner Date: Wed, 11 Sep 2024 23:31:22 +0200 Subject: [PATCH 2/3] fix(manager/docker): accept key-only arguments in `COPY --from` --- lib/modules/manager/dockerfile/extract.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/modules/manager/dockerfile/extract.ts b/lib/modules/manager/dockerfile/extract.ts index 53dd5550248558..1395dbcc1e57cb 100644 --- a/lib/modules/manager/dockerfile/extract.ts +++ b/lib/modules/manager/dockerfile/extract.ts @@ -385,7 +385,7 @@ export function extractPackageFile( const copyFromRegex = new RegExp( '^[ \\t]*COPY(?:' + escapeChar + - '[ \\t]*\\r?\\n| |\\t|#.*?\\r?\\n|--[a-z]+=[a-zA-Z0-9_.:-]+?)+--from=(?\\S+)', + '[ \\t]*\\r?\\n| |\\t|#.*?\\r?\\n|--[a-z]+(?:=[a-zA-Z0-9_.:-]+?)?)+--from=(?\\S+)', 'im', ); // TODO #12875 complex for re2 has too many not supported groups const copyFromMatch = instruction.match(copyFromRegex); From cfe29a1d4c729ff7ce61ad71e16828a5266b5358 Mon Sep 17 00:00:00 2001 From: Mathieu Kniewallner Date: Thu, 12 Sep 2024 13:09:22 +0200 Subject: [PATCH 3/3] test(manager/docker): match full object Co-authored-by: Michael Kriese --- .../manager/dockerfile/extract.spec.ts | 28 ++++++++++--------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/lib/modules/manager/dockerfile/extract.spec.ts b/lib/modules/manager/dockerfile/extract.spec.ts index 3159dd88c9b4e3..ce1faec854d533 100644 --- a/lib/modules/manager/dockerfile/extract.spec.ts +++ b/lib/modules/manager/dockerfile/extract.spec.ts @@ -404,19 +404,21 @@ describe('modules/manager/dockerfile/extract', () => { `, '', {}, - )?.deps; - expect(res).toEqual([ - { - autoReplaceStringTemplate: - '{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}', - currentDigest: undefined, - currentValue: 'v0.11.0', - datasource: 'docker', - depName: 'gcr.io/k8s-skaffold/skaffold', - depType: 'final', - replaceString: 'gcr.io/k8s-skaffold/skaffold:v0.11.0', - }, - ]); + ); + expect(res).toEqual({ + deps: [ + { + autoReplaceStringTemplate: + '{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}', + currentDigest: undefined, + currentValue: 'v0.11.0', + datasource: 'docker', + depName: 'gcr.io/k8s-skaffold/skaffold', + depType: 'final', + replaceString: 'gcr.io/k8s-skaffold/skaffold:v0.11.0', + }, + ], + }); }); it('skips named multistage COPY --from tags', () => {