From a52991ae9bf9a83d2b9de11ca11ede3ea95d6297 Mon Sep 17 00:00:00 2001 From: Timofey Kirillov Date: Mon, 7 Nov 2022 19:54:47 +0300 Subject: [PATCH] fix(staged-dockerfile): changing FROM base image does not cause rebuilding refs https://github.com/werf/werf/issues/2215 Signed-off-by: Timofey Kirillov --- pkg/build/build_phase.go | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/pkg/build/build_phase.go b/pkg/build/build_phase.go index 47592064f2..bcc450c585 100644 --- a/pkg/build/build_phase.go +++ b/pkg/build/build_phase.go @@ -585,7 +585,13 @@ func (phase *BuildPhase) calculateStage(ctx context.Context, img *image.Image, s return false, nil, err } - stageDigest, err := calculateDigest(ctx, stage.GetLegacyCompatibleStageName(stg.Name()), stageDependencies, phase.StagesIterator.PrevNonEmptyStage, phase.Conveyor) + var opts calculateDigestOption + if img.IsDockerfileImage && img.DockerfileImageConfig.Staged { + if !stg.HasPrevStage() { + opts.BaseImage = img.GetBaseImageReference() + } + } + stageDigest, err := calculateDigest(ctx, stage.GetLegacyCompatibleStageName(stg.Name()), stageDependencies, phase.StagesIterator.PrevNonEmptyStage, phase.Conveyor, opts) if err != nil { return false, nil, err } @@ -614,7 +620,7 @@ func (phase *BuildPhase) calculateStage(ctx context.Context, img *image.Image, s } } - stageContentSig, err := calculateDigest(ctx, fmt.Sprintf("%s-content", stg.Name()), "", stg, phase.Conveyor) + stageContentSig, err := calculateDigest(ctx, fmt.Sprintf("%s-content", stg.Name()), "", stg, phase.Conveyor, calculateDigestOption{}) if err != nil { return false, phase.Conveyor.GetStageDigestMutex(stg.GetDigest()).Unlock, fmt.Errorf("unable to calculate stage %s content digest: %w", stg.Name(), err) } @@ -861,7 +867,11 @@ func introspectStage(ctx context.Context, s stage.Interface) error { }) } -func calculateDigest(ctx context.Context, stageName, stageDependencies string, prevNonEmptyStage stage.Interface, conveyor *Conveyor) (string, error) { +type calculateDigestOption struct { + BaseImage string +} + +func calculateDigest(ctx context.Context, stageName, stageDependencies string, prevNonEmptyStage stage.Interface, conveyor *Conveyor, opts calculateDigestOption) (string, error) { checksumArgs := []string{imagePkg.BuildCacheVersion, stageName, stageDependencies} if prevNonEmptyStage != nil { prevStageDependencies, err := prevNonEmptyStage.GetNextStageDependencies(ctx, conveyor) @@ -872,6 +882,10 @@ func calculateDigest(ctx context.Context, stageName, stageDependencies string, p checksumArgs = append(checksumArgs, prevNonEmptyStage.GetDigest(), prevStageDependencies) } + if opts.BaseImage != "" { + checksumArgs = append(checksumArgs, opts.BaseImage) + } + digest := util.Sha3_224Hash(checksumArgs...) blockMsg := fmt.Sprintf("Stage %s digest %s", stageName, digest) @@ -883,6 +897,11 @@ func calculateDigest(ctx context.Context, stageName, stageDependencies string, p "prevNonEmptyStage digest", "prevNonEmptyStage dependencies for next stage", } + + if opts.BaseImage != "" { + checksumArgsNames = append(checksumArgsNames, "baseImage") + } + for ind, checksumArg := range checksumArgs { logboek.Context(ctx).Debug().LogF("%s => %q\n", checksumArgsNames[ind], checksumArg) }