Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 10 additions & 7 deletions internal/oci/push.go
Original file line number Diff line number Diff line change
Expand Up @@ -94,26 +94,29 @@ func DescriptorForEnvFile(path string, content []byte) v1.Descriptor {
}
}

func PushManifest(ctx context.Context, resolver remotes.Resolver, named reference.Named, layers []v1.Descriptor, ociVersion api.OCIVersion) (v1.Descriptor, error) {
// PushManifest pushes the manifest for a Compose OCI artifact and returns
// the OCI version actually used.
func PushManifest(ctx context.Context, resolver remotes.Resolver, named reference.Named, layers []v1.Descriptor, ociVersion api.OCIVersion) (v1.Descriptor, api.OCIVersion, error) {
// Check if we need an extra empty layer for the manifest config
if ociVersion == api.OCIVersion1_1 || ociVersion == "" {
err := push(ctx, resolver, named, v1.DescriptorEmptyJSON)
if err != nil {
return v1.Descriptor{}, err
return v1.Descriptor{}, "", err
}
}
// prepare to push the manifest by pushing the layers
layerDescriptors := make([]v1.Descriptor, len(layers))
for i := range layers {
layerDescriptors[i] = layers[i]
if err := push(ctx, resolver, named, layers[i]); err != nil {
return v1.Descriptor{}, err
return v1.Descriptor{}, "", err
}
}

if ociVersion != "" {
// if a version was explicitly specified, use it
return createAndPushManifest(ctx, resolver, named, layerDescriptors, ociVersion)
descriptor, err := createAndPushManifest(ctx, resolver, named, layerDescriptors, ociVersion)
return descriptor, ociVersion, err
}

// try to push in the OCI 1.1 format but fallback to OCI 1.0 on 4xx errors
Expand All @@ -122,10 +125,10 @@ func PushManifest(ctx context.Context, resolver remotes.Resolver, named referenc
descriptor, err := createAndPushManifest(ctx, resolver, named, layerDescriptors, api.OCIVersion1_1)
var pushErr pusherrors.ErrUnexpectedStatus
if errors.As(err, &pushErr) && isNonAuthClientError(pushErr.StatusCode) {
// TODO(milas): show a warning here (won't work with logrus)
return createAndPushManifest(ctx, resolver, named, layerDescriptors, api.OCIVersion1_0)
descriptor, err = createAndPushManifest(ctx, resolver, named, layerDescriptors, api.OCIVersion1_0)
return descriptor, api.OCIVersion1_0, err
}
return descriptor, err
return descriptor, api.OCIVersion1_1, err
}

func push(ctx context.Context, resolver remotes.Resolver, ref reference.Named, descriptor v1.Descriptor) error {
Expand Down
5 changes: 4 additions & 1 deletion pkg/compose/publish.go
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@ func (s *composeService) pushComposeArtifact(ctx context.Context, project *types

resolver := oci.NewResolver(s.configFile(), desktop.ProxyTransportFor(ctx, s.apiClient()), insecureRegistries...)

descriptor, err := oci.PushManifest(ctx, resolver, named, layers, options.OCIVersion)
descriptor, usedOCIVersion, err := oci.PushManifest(ctx, resolver, named, layers, options.OCIVersion)
if err != nil {
s.events.On(api.Resource{
ID: repository,
Expand All @@ -128,6 +128,9 @@ func (s *composeService) pushComposeArtifact(ctx context.Context, project *types
})
return err
}
if options.OCIVersion == "" && usedOCIVersion == api.OCIVersion1_0 {
logrus.Warn("registry does not support OCI 1.1 artifacts; falling back to OCI 1.0 format")
}

if options.Application {
return pushApplicationIndex(ctx, resolver, named, descriptor, project)
Expand Down