fix(publish): report OCI fallback as a bool, not the OCI version

Signed-off-by: hiroto.toyoda <[email protected]>
This commit is contained in:
hiroto.toyoda
2026-09-15 14:54:03 +02:00
committed by Nicolas De loof
parent f8e64299b4
commit 548be16595
2 changed files with 14 additions and 13 deletions
+11 -10
View File
@@ -94,14 +94,15 @@ func DescriptorForEnvFile(path string, content []byte) v1.Descriptor {
}
}
// 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) {
// PushManifest pushes the manifest for a Compose OCI artifact. The returned
// bool reports whether the push fell back from OCI 1.1 to OCI 1.0; it is
// only meaningful when err == nil.
func PushManifest(ctx context.Context, resolver remotes.Resolver, named reference.Named, layers []v1.Descriptor, ociVersion api.OCIVersion) (v1.Descriptor, bool, 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{}, false, err
}
}
// prepare to push the manifest by pushing the layers
@@ -109,26 +110,26 @@ func PushManifest(ctx context.Context, resolver remotes.Resolver, named referenc
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{}, false, err
}
}
if ociVersion != "" {
// if a version was explicitly specified, use it
descriptor, err := createAndPushManifest(ctx, resolver, named, layerDescriptors, ociVersion)
return descriptor, ociVersion, err
return descriptor, false, err
}
// try to push in the OCI 1.1 format but fallback to OCI 1.0 on 4xx errors
// (other than auth) since it's most likely the result of the registry not
// having support
// (other than auth) since it's most likely the result of the registry
// rejecting the OCI 1.1 request
descriptor, err := createAndPushManifest(ctx, resolver, named, layerDescriptors, api.OCIVersion1_1)
var pushErr pusherrors.ErrUnexpectedStatus
if errors.As(err, &pushErr) && isNonAuthClientError(pushErr.StatusCode) {
descriptor, err = createAndPushManifest(ctx, resolver, named, layerDescriptors, api.OCIVersion1_0)
return descriptor, api.OCIVersion1_0, err
return descriptor, true, err
}
return descriptor, api.OCIVersion1_1, err
return descriptor, false, err
}
func push(ctx context.Context, resolver remotes.Resolver, ref reference.Named, descriptor v1.Descriptor) error {
+3 -3
View File
@@ -120,7 +120,7 @@ func (s *composeService) pushComposeArtifact(ctx context.Context, project *types
resolver := oci.NewResolver(s.configFile(), desktop.ProxyTransportFor(ctx, s.apiClient()), insecureRegistries...)
descriptor, usedOCIVersion, err := oci.PushManifest(ctx, resolver, named, layers, options.OCIVersion)
descriptor, didFallback, err := oci.PushManifest(ctx, resolver, named, layers, options.OCIVersion)
if err != nil {
s.events.On(api.Resource{
ID: repository,
@@ -129,8 +129,8 @@ 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 didFallback {
logrus.Warn("registry rejected the OCI 1.1 artifact push; falling back to OCI 1.0 format")
}
if options.Application {