Skip to content

Commit 3ceb622

Browse files
committed
fix(cache-repo): panic when using cache repo and fromImage directive
``` goroutine 1623 [running]: github.com/werf/werf/pkg/build/stage.(*BaseStage).getServiceMountsFromLabels(0xc0016ed300?, 0xc001b00100) /home/distorhead/werf/pkg/build/stage/base.go:283 +0xc4 github.com/werf/werf/pkg/build/stage.(*BaseStage).getServiceMounts(0xc000e50d80?, 0x3bde920?) /home/distorhead/werf/pkg/build/stage/base.go:274 +0x36 github.com/werf/werf/pkg/build/stage.(*FromStage).PrepareImage(0xc0014c5140, {0xc001508420?, 0x3be22c8?}, {0x3be06b0, 0xc0006ac2c0}, {0x3bde920, 0xc000f622e0}, 0x0?, 0xc001b01640) /home/distorhead/werf/pkg/build/stage/from.go:82 +0x194 github.com/werf/werf/pkg/build.(*BuildPhase).prepareStageInstructions(0xc00188a2d0, {0x3bcc730?, 0xc001858300}, 0xc001508420, {0x3be22c8, 0xc0014c5140}) /home/distorhead/werf/pkg/build/build_phase.go:693 +0xdff ... ``` Refactor the process of copying of stage-image descriptors objects into cache storage. Signed-off-by: Timofey Kirillov <timofey.kirillov@flant.com>
1 parent a6258e9 commit 3ceb622

File tree

6 files changed

+32
-13
lines changed

6 files changed

+32
-13
lines changed

pkg/build/build_phase.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -800,20 +800,21 @@ func (phase *BuildPhase) atomicBuildStageImage(ctx context.Context, img *Image,
800800

801801
// use newly built image
802802
newStageImageName, uniqueID := phase.Conveyor.StorageManager.GenerateStageUniqueID(stg.GetDigest(), stages)
803-
stageImageObj := phase.Conveyor.GetStageImage(stageImage.Image.Name())
804-
phase.Conveyor.UnsetStageImage(stageImageObj.Image.Name())
805-
stageImageObj.Image.SetName(newStageImageName)
806-
phase.Conveyor.SetStageImage(stageImageObj)
803+
phase.Conveyor.UnsetStageImage(stageImage.Image.Name())
804+
stageImage.Image.SetName(newStageImageName)
805+
phase.Conveyor.SetStageImage(stageImage)
807806

808807
if err := logboek.Context(ctx).Default().LogProcess("Store stage into %s", phase.Conveyor.StorageManager.GetStagesStorage().String()).DoError(func() error {
809808
if err := phase.Conveyor.StorageManager.GetStagesStorage().StoreImage(ctx, stageImage.Image); err != nil {
810809
return fmt.Errorf("unable to store stage %s digest %s image %s into repo %s: %w", stg.LogDetailedName(), stg.GetDigest(), stageImage.Image.Name(), phase.Conveyor.StorageManager.GetStagesStorage().String(), err)
811810
}
811+
812812
if desc, err := phase.Conveyor.StorageManager.GetStagesStorage().GetStageDescription(ctx, phase.Conveyor.projectName(), stg.GetDigest(), uniqueID); err != nil {
813813
return fmt.Errorf("unable to get stage %s digest %s image %s description from repo %s after stages has been stored into repo: %w", stg.LogDetailedName(), stg.GetDigest(), stageImage.Image.Name(), phase.Conveyor.StorageManager.GetStagesStorage().String(), err)
814814
} else {
815-
stageImageObj.Image.SetStageDescription(desc)
815+
stageImage.Image.SetStageDescription(desc)
816816
}
817+
817818
return nil
818819
}); err != nil {
819820
return err
@@ -824,7 +825,6 @@ func (phase *BuildPhase) atomicBuildStageImage(ctx context.Context, img *Image,
824825
if err := phase.Conveyor.StorageManager.CopyStageIntoCacheStorages(ctx, stg, phase.Conveyor.ContainerBackend); err != nil {
825826
return fmt.Errorf("unable to copy stage %s into cache storages: %w", stageImage.Image.GetStageDescription().StageID.String(), err)
826827
}
827-
828828
return nil
829829
}
830830
}

pkg/build/image.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ func (i *Image) SetupBaseImage(c *Conveyor) {
126126
if i.baseImageImageName != "" {
127127
i.baseImageType = StageAsBaseImage
128128
i.stageAsBaseImage = c.GetImage(i.baseImageImageName).GetLastNonEmptyStage()
129-
i.baseImage = c.GetOrCreateStageImage(nil, i.stageAsBaseImage.GetStageImage().Image.Name())
129+
i.baseImage = i.stageAsBaseImage.GetStageImage()
130130
} else {
131131
i.baseImageType = ImageFromRegistryAsBaseImage
132132
i.baseImage = c.GetOrCreateStageImage(nil, i.baseImageName)

pkg/container_backend/buildah_backend.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -613,9 +613,11 @@ func (runtime *BuildahBackend) RenameImage(ctx context.Context, img LegacyImageI
613613

614614
desc := img.GetStageDescription()
615615

616-
repository, tag := image.ParseRepositoryAndTag(newImageName)
617-
desc.Info.Repository = repository
618-
desc.Info.Tag = tag
616+
if desc != nil {
617+
repository, tag := image.ParseRepositoryAndTag(newImageName)
618+
desc.Info.Repository = repository
619+
desc.Info.Tag = tag
620+
}
619621

620622
return nil
621623
}

pkg/container_backend/legacy_interface.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ type LegacyImageInterface interface {
3737

3838
SetStageDescription(stage *image.StageDescription)
3939
GetStageDescription() *image.StageDescription
40+
41+
GetCopy() LegacyImageInterface
4042
}
4143

4244
type LegacyContainer interface {

pkg/container_backend/legacy_stage_image.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,19 @@ func NewLegacyStageImage(fromImage *LegacyStageImage, name string, containerBack
2929
return stage
3030
}
3131

32+
func (i *LegacyStageImage) GetCopy() LegacyImageInterface {
33+
ni := NewLegacyStageImage(i.fromImage, i.name, i.ContainerBackend)
34+
35+
if info := i.GetInfo(); info != nil {
36+
ni.SetInfo(info)
37+
}
38+
if desc := i.GetStageDescription(); desc != nil {
39+
ni.SetStageDescription(desc)
40+
}
41+
42+
return ni
43+
}
44+
3245
func (i *LegacyStageImage) BuilderContainer() LegacyBuilderContainer {
3346
return &LegacyStageImageBuilderContainer{i}
3447
}

pkg/storage/manager/storage_manager.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -383,17 +383,19 @@ func doFetchStage(ctx context.Context, projectName string, stagesStorage storage
383383
}
384384

385385
func copyStageIntoStagesStorage(ctx context.Context, projectName string, stageID image.StageID, img container_backend.LegacyImageInterface, stagesStorage storage.StagesStorage, containerBackend container_backend.ContainerBackend) error {
386+
newImg := img.GetCopy()
387+
386388
targetStagesStorageImageName := stagesStorage.ConstructStageImageName(projectName, stageID.Digest, stageID.UniqueID)
387389

388-
if err := containerBackend.RenameImage(ctx, img, targetStagesStorageImageName, false); err != nil {
390+
if err := containerBackend.RenameImage(ctx, newImg, targetStagesStorageImageName, false); err != nil {
389391
return fmt.Errorf("unable to rename image %s to %s: %w", img.Name(), targetStagesStorageImageName, err)
390392
}
391393

392-
if err := stagesStorage.StoreImage(ctx, img); err != nil {
394+
if err := stagesStorage.StoreImage(ctx, newImg); err != nil {
393395
return fmt.Errorf("unable to store stage %s into the cache stages storage %s: %w", stageID.String(), stagesStorage.String(), err)
394396
}
395397

396-
if err := storeStageDescriptionIntoLocalManifestCache(ctx, projectName, stageID, stagesStorage, convertStageDescriptionForStagesStorage(img.GetStageDescription(), stagesStorage)); err != nil {
398+
if err := storeStageDescriptionIntoLocalManifestCache(ctx, projectName, stageID, stagesStorage, convertStageDescriptionForStagesStorage(newImg.GetStageDescription(), stagesStorage)); err != nil {
397399
return fmt.Errorf("error storing stage %s description into local manifest cache: %w", targetStagesStorageImageName, err)
398400
}
399401

0 commit comments

Comments
 (0)