diff --git a/cache/remotecache/v1/chains_test.go b/cache/remotecache/v1/chains_test.go index 9182639e89ad..6c07affdf043 100644 --- a/cache/remotecache/v1/chains_test.go +++ b/cache/remotecache/v1/chains_test.go @@ -6,6 +6,7 @@ import ( "testing" "time" + "github.com/containerd/containerd/v2/core/images" "github.com/moby/buildkit/solver" digest "github.com/opencontainers/go-digest" ocispecs "github.com/opencontainers/image-spec/specs-go/v1" @@ -105,6 +106,60 @@ func TestSimpleMarshal(t *testing.T) { require.Equal(t, 4, len(cfg.Records)) } +func TestMarshalLayerMediaTypes(t *testing.T) { + for _, tc := range []struct { + name string + descs []ocispecs.Descriptor + expected map[digest.Digest]string + }{ + { + name: "docker", + descs: []ocispecs.Descriptor{ + {Digest: dgst("d0"), MediaType: images.MediaTypeDockerSchema2Layer}, + {Digest: dgst("d1"), MediaType: images.MediaTypeDockerSchema2LayerGzip}, + {Digest: dgst("d2"), MediaType: images.MediaTypeDockerSchema2LayerZstd}, + }, + expected: map[digest.Digest]string{ + dgst("d0"): ocispecs.MediaTypeImageLayer, + dgst("d1"): ocispecs.MediaTypeImageLayerGzip, + dgst("d2"): ocispecs.MediaTypeImageLayerZstd, + }, + }, + { + name: "oci", + descs: []ocispecs.Descriptor{ + {Digest: dgst("d0"), MediaType: ocispecs.MediaTypeImageLayer}, + {Digest: dgst("d1"), MediaType: ocispecs.MediaTypeImageLayerGzip}, + {Digest: dgst("d2"), MediaType: ocispecs.MediaTypeImageLayerZstd}, + }, + expected: map[digest.Digest]string{ + dgst("d0"): ocispecs.MediaTypeImageLayer, + dgst("d1"): ocispecs.MediaTypeImageLayerGzip, + dgst("d2"): ocispecs.MediaTypeImageLayerZstd, + }, + }, + } { + t.Run(tc.name, func(t *testing.T) { + cc := NewCacheChains() + _, ok, err := cc.Add(outputKey(dgst("foo"), 0), nil, []solver.CacheExportResult{{ + CreatedAt: time.Now(), + Result: &solver.Remote{ + Descriptors: tc.descs, + }, + }}) + require.NoError(t, err) + require.True(t, ok) + + _, descPairs, err := cc.Marshal(t.Context()) + require.NoError(t, err) + + for dgst, mediaType := range tc.expected { + require.Equal(t, mediaType, descPairs[dgst].Descriptor.MediaType) + } + }) + } +} + func dgst(s string) digest.Digest { return digest.FromBytes([]byte(s)) } diff --git a/cache/remotecache/v1/utils.go b/cache/remotecache/v1/utils.go index 0c481fbd6239..4f8ca753341f 100644 --- a/cache/remotecache/v1/utils.go +++ b/cache/remotecache/v1/utils.go @@ -10,6 +10,7 @@ import ( cerrdefs "github.com/containerd/errdefs" cacheimporttypes "github.com/moby/buildkit/cache/remotecache/v1/types" "github.com/moby/buildkit/solver" + "github.com/moby/buildkit/util/compression" digest "github.com/opencontainers/go-digest" "github.com/pkg/errors" ) @@ -152,6 +153,9 @@ func marshalRemote(ctx context.Context, r *solver.Remote, state *marshalState) s parentID = marshalRemote(ctx, r2, state) } desc := r.Descriptors[len(r.Descriptors)-1] + if desc.MediaType != "" { + desc = compression.ConvertAllLayerMediaTypes(ctx, true, desc)[0] + } state.descriptors[desc.Digest] = DescriptorProviderPair{ Descriptor: desc,