Fix missing or partial support for pattern substition in variable references with cache enabled (#2968)

This commit is contained in:
Kraev Sergei 2024-02-14 06:57:19 +04:00 committed by GitHub
parent 5e424c361c
commit da3878e16b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 31 additions and 7 deletions

View File

@ -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 {

View File

@ -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)