From d206fb9e640f6cbcef09a5e563ee391bff7e6d92 Mon Sep 17 00:00:00 2001 From: Sergei Kraev Date: Thu, 25 Jan 2024 11:09:37 +0400 Subject: [PATCH] Fix missing or partial support for pattern substition in variable references with cache enabled --- pkg/executor/build.go | 6 +----- pkg/executor/build_test.go | 32 ++++++++++++++++++++++++++++++-- 2 files changed, 31 insertions(+), 7 deletions(-) diff --git a/pkg/executor/build.go b/pkg/executor/build.go index d88727d385..73b2f0df23 100644 --- a/pkg/executor/build.go +++ b/pkg/executor/build.go @@ -204,10 +204,6 @@ func (s *stageBuilder) populateCompositeKey(command commands.DockerCommand, file // The sort order of `replacementEnvs` is basically undefined, sort it // so we can ensure a stable cache key. sort.Strings(replacementEnvs) - resolvedCmd, err := util.ResolveEnvironmentReplacement(command.String(), replacementEnvs, false) - if err != nil { - return compositeKey, err - } // Use the special argument "|#" at the start of the args array. This will // avoid conflicts with any RUN command since commands can not // start with | (vertical bar). The "#" (number of build envs) is there to @@ -221,7 +217,7 @@ func (s *stageBuilder) populateCompositeKey(command commands.DockerCommand, file } // Add the next command to the cache key. - compositeKey.AddKey(resolvedCmd) + compositeKey.AddKey(command.String()) for _, f := range files { if err := compositeKey.AddPath(f, s.fileContext); err != nil { diff --git a/pkg/executor/build_test.go b/pkg/executor/build_test.go index 86489f93ff..7065b86288 100644 --- a/pkg/executor/build_test.go +++ b/pkg/executor/build_test.go @@ -770,6 +770,34 @@ func Test_stageBuilder_populateCompositeKey(t *testing.T) { []string{"ENV=1"}, ), }, + { + description: "cache key for command [RUN] with same env values [check that variable no interpolate in RUN command]", + cmd1: newStageContext( + "RUN echo $ENV > test", + map[string]string{"ARG": "foo"}, + []string{"ENV=1"}, + ), + cmd2: newStageContext( + "RUN echo 1 > test", + map[string]string{"ARG": "foo"}, + []string{"ENV=1"}, + ), + shdEqual: false, + }, + { + description: "cache key for command [RUN] with different env values [check that variable no interpolate in RUN command]", + cmd1: newStageContext( + "RUN echo ${APP_VERSION%.*} ${APP_VERSION%-*} > test", + map[string]string{"ARG": "foo"}, + []string{"ENV=1"}, + ), + cmd2: newStageContext( + "RUN echo ${APP_VERSION%.*} ${APP_VERSION%-*} > test", + map[string]string{"ARG": "foo"}, + []string{"ENV=2"}, + ), + shdEqual: false, + }, func() testcase { dir, files := tempDirAndFile(t) file := files[0] @@ -1331,7 +1359,7 @@ RUN foobar ch := NewCompositeCache("") ch.AddKey("|1") ch.AddKey("arg=value") - ch.AddKey("RUN value") + ch.AddKey("RUN $arg") hash, err := ch.Hash() if err != nil { t.Errorf("couldn't create hash %v", err) @@ -1376,7 +1404,7 @@ RUN foobar ch2 := NewCompositeCache("") ch2.AddKey("|1") ch2.AddKey("arg=anotherValue") - ch2.AddKey("RUN anotherValue") + ch2.AddKey("RUN $arg") hash2, err := ch2.Hash() if err != nil { t.Errorf("couldn't create hash %v", err)