Skip to content

Commit a52991a

Browse files
committed
fix(staged-dockerfile): changing FROM base image does not cause rebuilding
refs #2215 Signed-off-by: Timofey Kirillov <timofey.kirillov@flant.com>
1 parent 8faf229 commit a52991a

File tree

1 file changed

+22
-3
lines changed

1 file changed

+22
-3
lines changed

pkg/build/build_phase.go

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -585,7 +585,13 @@ func (phase *BuildPhase) calculateStage(ctx context.Context, img *image.Image, s
585585
return false, nil, err
586586
}
587587

588-
stageDigest, err := calculateDigest(ctx, stage.GetLegacyCompatibleStageName(stg.Name()), stageDependencies, phase.StagesIterator.PrevNonEmptyStage, phase.Conveyor)
588+
var opts calculateDigestOption
589+
if img.IsDockerfileImage && img.DockerfileImageConfig.Staged {
590+
if !stg.HasPrevStage() {
591+
opts.BaseImage = img.GetBaseImageReference()
592+
}
593+
}
594+
stageDigest, err := calculateDigest(ctx, stage.GetLegacyCompatibleStageName(stg.Name()), stageDependencies, phase.StagesIterator.PrevNonEmptyStage, phase.Conveyor, opts)
589595
if err != nil {
590596
return false, nil, err
591597
}
@@ -614,7 +620,7 @@ func (phase *BuildPhase) calculateStage(ctx context.Context, img *image.Image, s
614620
}
615621
}
616622

617-
stageContentSig, err := calculateDigest(ctx, fmt.Sprintf("%s-content", stg.Name()), "", stg, phase.Conveyor)
623+
stageContentSig, err := calculateDigest(ctx, fmt.Sprintf("%s-content", stg.Name()), "", stg, phase.Conveyor, calculateDigestOption{})
618624
if err != nil {
619625
return false, phase.Conveyor.GetStageDigestMutex(stg.GetDigest()).Unlock, fmt.Errorf("unable to calculate stage %s content digest: %w", stg.Name(), err)
620626
}
@@ -861,7 +867,11 @@ func introspectStage(ctx context.Context, s stage.Interface) error {
861867
})
862868
}
863869

864-
func calculateDigest(ctx context.Context, stageName, stageDependencies string, prevNonEmptyStage stage.Interface, conveyor *Conveyor) (string, error) {
870+
type calculateDigestOption struct {
871+
BaseImage string
872+
}
873+
874+
func calculateDigest(ctx context.Context, stageName, stageDependencies string, prevNonEmptyStage stage.Interface, conveyor *Conveyor, opts calculateDigestOption) (string, error) {
865875
checksumArgs := []string{imagePkg.BuildCacheVersion, stageName, stageDependencies}
866876
if prevNonEmptyStage != nil {
867877
prevStageDependencies, err := prevNonEmptyStage.GetNextStageDependencies(ctx, conveyor)
@@ -872,6 +882,10 @@ func calculateDigest(ctx context.Context, stageName, stageDependencies string, p
872882
checksumArgs = append(checksumArgs, prevNonEmptyStage.GetDigest(), prevStageDependencies)
873883
}
874884

885+
if opts.BaseImage != "" {
886+
checksumArgs = append(checksumArgs, opts.BaseImage)
887+
}
888+
875889
digest := util.Sha3_224Hash(checksumArgs...)
876890

877891
blockMsg := fmt.Sprintf("Stage %s digest %s", stageName, digest)
@@ -883,6 +897,11 @@ func calculateDigest(ctx context.Context, stageName, stageDependencies string, p
883897
"prevNonEmptyStage digest",
884898
"prevNonEmptyStage dependencies for next stage",
885899
}
900+
901+
if opts.BaseImage != "" {
902+
checksumArgsNames = append(checksumArgsNames, "baseImage")
903+
}
904+
886905
for ind, checksumArg := range checksumArgs {
887906
logboek.Context(ctx).Debug().LogF("%s => %q\n", checksumArgsNames[ind], checksumArg)
888907
}

0 commit comments

Comments
 (0)