helm/helm · error

errMissingName

errMissingName

Error message

no name provided

What it means

ChartUploader.UploadTo (pkg/uploader/chart_uploader.go:47) requires the remote to carry a URL scheme because it dispatches to a pusher via c.Pushers.ByScheme(u.Scheme). url.Parse succeeds on bare hosts, so a scheme-less remote like registry.example.com/myrepo parses fine but has an empty Scheme, triggering this error which suggests the OCI form oci://.

Source

Thrown at internal/chart/v3/util/validate_name.go:39

	"fmt"
	"regexp"
)

// validName is a regular expression for resource names.
//
// According to the Kubernetes help text, the regular expression it uses is:
//
//	[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*
//
// This follows the above regular expression (but requires a full string match, not partial).
//
// The Kubernetes documentation is here, though it is not entirely correct:
// https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
var validName = regexp.MustCompile(`^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$`)

var (
	// errMissingName indicates that a release (name) was not provided.
	errMissingName = errors.New("no name provided")

	// errInvalidName indicates that an invalid release name was provided
	errInvalidName = fmt.Errorf(
		"invalid release name, must match regex %s and the length must not be longer than 53",
		validName.String())

	// errInvalidKubernetesName indicates that the name does not meet the Kubernetes
	// restrictions on metadata names.
	errInvalidKubernetesName = fmt.Errorf(
		"invalid metadata name, must match regex %s and the length must not be longer than 253",
		validName.String())
)

const (
	// According to the Kubernetes docs (https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#rfc-1035-label-names)
	// some resource names have a max length of 63 characters while others have a max
	// length of 253 characters. As we cannot be sure the resources used in a chart, we
	// therefore need to limit it to 63 chars and reserve 10 chars for additional part to name

View on GitHub (pinned to 2a29f1770b)

Solutions

  1. Prefix the remote with oci:// — the full form is oci://<registry-host>/<path>
  2. For non-OCI HTTP chart repos, use helm's repo/upload tooling that accepts a repo name instead of ChartUploader with a bare host
  3. Validate the scheme before calling UploadTo and fail fast with a targeted message

Example fix

# before
helm push mychart-1.0.0.tgz registry.example.com/myrepo
# after
helm push mychart-1.0.0.tgz oci://registry.example.com/myrepo
Defensive patterns

Strategy: validation

Validate before calling

func remoteHasScheme(remote string) error {
    u, err := url.Parse(remote)
    if err != nil { return err }
    if u.Scheme == "" { return fmt.Errorf("remote %q must include a scheme such as oci://", remote) }
    return nil
}

Try / catch

if err := c.UploadTo(ref, remote); err != nil && strings.Contains(err.Error(), "scheme prefix missing") {
    remote = "oci://" + remote // only if host was bare by construction
}

Prevention

When it happens

Trigger: uploader.ChartUploader{...}.UploadTo("mychart-1.0.0.tgz", "registry.example.com/charts") — Docker-style reference without a scheme. Any 'helm push chart.tgz <remote>' where <remote> lacks the oci:// prefix.

Common situations: Muscle memory from docker push / helm's legacy repo push where the remote was a repo name, not a URL; scripts upgraded from chart-repo (http) workflows to OCI registries without adding the scheme.

Related errors


AI-assisted analysis of helm/helm@2a29f1770b (2026-08-15). Data as JSON: /api/errors/67fc00bfe98a0956. Report an issue: GitHub.