make cache tests more strict - fail on layer digest diff

This commit is contained in:
Martin Zihlmann 2025-05-26 11:24:05 +01:00
parent e4a5153d8b
commit 3dc21dd665
No known key found for this signature in database
GPG Key ID: 0F7784F41354DE99
1 changed files with 51 additions and 0 deletions

View File

@ -35,6 +35,7 @@ import (
"time" "time"
"github.com/google/go-containerregistry/pkg/name" "github.com/google/go-containerregistry/pkg/name"
v1 "github.com/google/go-containerregistry/pkg/v1"
"github.com/google/go-containerregistry/pkg/v1/daemon" "github.com/google/go-containerregistry/pkg/v1/daemon"
"github.com/google/go-containerregistry/pkg/v1/remote" "github.com/google/go-containerregistry/pkg/v1/remote"
"github.com/pkg/errors" "github.com/pkg/errors"
@ -742,6 +743,7 @@ func verifyBuildWith(t *testing.T, cache, dockerfile string) {
expected := fmt.Sprintf(emptyContainerDiff, kanikoVersion0, kanikoVersion1, kanikoVersion0, kanikoVersion1) expected := fmt.Sprintf(emptyContainerDiff, kanikoVersion0, kanikoVersion1, kanikoVersion0, kanikoVersion1)
checkContainerDiffOutput(t, diff, expected) checkContainerDiffOutput(t, diff, expected)
layerDiff(t, kanikoVersion0, kanikoVersion1)
} }
func TestRelativePaths(t *testing.T) { func TestRelativePaths(t *testing.T) {
@ -957,6 +959,39 @@ func filterFileDiff(f []fileDiff) []fileDiff {
return newDiffs return newDiffs
} }
func layerDiff(t *testing.T, image1, image2 string) {
t.Helper()
layers1, err := getImageLayers(image1)
if err != nil {
t.Fatalf("Couldn't get details from image reference for (%s): %s", image1, err)
}
layers2, err := getImageLayers(image2)
if err != nil {
t.Fatalf("Couldn't get details from image reference for (%s): %s", image2, err)
}
for idx := range min(len(layers1), len(layers2)) {
l1d, err := layers1[idx].Digest()
if err != nil {
t.Fatalf("Couldn't get digest from image layer (%s #%d): %s", image1, idx, err)
}
l2d, err := layers2[idx].Digest()
if err != nil {
t.Fatalf("Couldn't get digest from image layer (%s #%d): %s", image2, idx, err)
}
if l1d != l2d {
t.Errorf("Image Layers #%d differ %s != %s", idx, l1d, l2d)
}
}
if len(layers1) != len(layers2) {
t.Errorf("Image Layer count differs %d != %d", len(layers1), len(layers2))
}
}
func checkLayers(t *testing.T, image1, image2 string, offset int) { func checkLayers(t *testing.T, image1, image2 string, offset int) {
t.Helper() t.Helper()
img1, err := getImageDetails(image1) img1, err := getImageDetails(image1)
@ -975,6 +1010,22 @@ func checkLayers(t *testing.T, image1, image2 string, offset int) {
} }
} }
func getImageLayers(image string) ([]v1.Layer, error) {
ref, err := name.ParseReference(image, name.WeakValidation)
if err != nil {
return nil, fmt.Errorf("Couldn't parse referance to image %s: %w", image, err)
}
imgRef, err := daemon.Image(ref)
if err != nil {
return nil, fmt.Errorf("Couldn't get reference to image %s from daemon: %w", image, err)
}
layers, err := imgRef.Layers()
if err != nil {
return nil, fmt.Errorf("Error getting layers for image %s: %w", image, err)
}
return layers, nil
}
func getImageDetails(image string) (*imageDetails, error) { func getImageDetails(image string) (*imageDetails, error) {
ref, err := name.ParseReference(image, name.WeakValidation) ref, err := name.ParseReference(image, name.WeakValidation)
if err != nil { if err != nil {