From 465eca2b93f860b212a2911f93dc9547876f898a Mon Sep 17 00:00:00 2001 From: Jason Hall Date: Tue, 5 Oct 2021 11:58:31 -0400 Subject: [PATCH] Always produce OCI images and indexes (#449) * Always produce OCI images and indexes * test each constituent manifest's mediatype --- pkg/build/gobuild.go | 27 ++++++++++++--------------- pkg/build/gobuild_test.go | 29 +++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 15 deletions(-) diff --git a/pkg/build/gobuild.go b/pkg/build/gobuild.go index cff0a712f2..07b2023830 100644 --- a/pkg/build/gobuild.go +++ b/pkg/build/gobuild.go @@ -701,6 +701,9 @@ func (g *gobuild) configForImportPath(ip string) Config { func (g *gobuild) buildOne(ctx context.Context, refStr string, base v1.Image, platform *v1.Platform) (v1.Image, error) { ref := newRef(refStr) + // Always produce OCI images, even if the base image isn't an OCI image. + base = mutate.MediaType(base, types.OCIManifestSchema1) + cf, err := base.ConfigFile() if err != nil { return nil, err @@ -877,16 +880,15 @@ func (g *gobuild) Build(ctx context.Context, s string) (Result, error) { } // Annotate the image or index with base image information. - // (Docker manifest lists don't support annotations) - if mt != types.DockerManifestList { - anns := map[string]string{ - specsv1.AnnotationBaseImageDigest: baseDigest.String(), - } - if _, ok := baseRef.(name.Tag); ok { - anns[specsv1.AnnotationBaseImageName] = baseRef.Name() - } - res = mutate.Annotations(res, anns).(Result) + // If the result is an Index, it should be an OCI index that supports + // annotations. + anns := map[string]string{ + specsv1.AnnotationBaseImageDigest: baseDigest.String(), + } + if _, ok := baseRef.(name.Tag); ok { + anns[specsv1.AnnotationBaseImageName] = baseRef.Name() } + res = mutate.Annotations(res, anns).(Result) return res, nil } @@ -922,18 +924,13 @@ func (g *gobuild) buildAll(ctx context.Context, ref string, baseIndex v1.ImageIn Add: img, Descriptor: v1.Descriptor{ URLs: desc.URLs, - MediaType: desc.MediaType, Annotations: desc.Annotations, Platform: desc.Platform, }, }) } - baseType, err := baseIndex.MediaType() - if err != nil { - return nil, err - } - idx := mutate.IndexMediaType(mutate.AppendManifests(empty.Index, adds...), baseType) + idx := mutate.IndexMediaType(mutate.AppendManifests(empty.Index, adds...), types.OCIImageIndex) return idx, nil } diff --git a/pkg/build/gobuild_test.go b/pkg/build/gobuild_test.go index a271364a71..a90e99d387 100644 --- a/pkg/build/gobuild_test.go +++ b/pkg/build/gobuild_test.go @@ -36,6 +36,7 @@ import ( "github.com/google/go-containerregistry/pkg/v1/empty" "github.com/google/go-containerregistry/pkg/v1/mutate" "github.com/google/go-containerregistry/pkg/v1/random" + "github.com/google/go-containerregistry/pkg/v1/types" specsv1 "github.com/opencontainers/image-spec/specs-go/v1" ) @@ -420,6 +421,17 @@ func TestGoBuildNoKoData(t *testing.T) { t.Errorf("created = %v, want %v", actual, creationTime) } }) + + t.Run("check OCI media type", func(t *testing.T) { + mt, err := img.MediaType() + if err != nil { + t.Errorf("MediaType() = %v", err) + } + + if got, want := mt, types.OCIManifestSchema1; got != want { + t.Errorf("mediaType = %v, want %v", got, want) + } + }) } func validateImage(t *testing.T, img v1.Image, baseLayers int64, creationTime v1.Time, checkAnnotations bool) { @@ -731,6 +743,23 @@ func TestGoBuildIndex(t *testing.T) { t.Errorf("Digest mismatch: %s != %s", d1, d2) } }) + + t.Run("check OCI media type", func(t *testing.T) { + mt, err := idx.MediaType() + if err != nil { + t.Fatalf("MediaType() = %v", err) + } + + if got, want := mt, types.OCIImageIndex; got != want { + t.Errorf("mediaType = %v, want %v", got, want) + } + + for i, mf := range im.Manifests { + if got, want := mf.MediaType, types.OCIManifestSchema1; got != want { + t.Errorf("manifest[%d] mediaType = %s, want %s", i, got, want) + } + } + }) } func TestNestedIndex(t *testing.T) {