8000 Error pulling latest chart from OCI registry if semver version has a v prefix · Issue #11107 · helm/helm · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content
Error pulling latest chart from OCI registry if semver version has a v prefix  #11107
Closed
@wallrj

Description

@wallrj

If a Helm chart is in an OCI registry and has a version with v prefix before the semver, many of the helm subcommands can not find it.

I think the problem is caused by the use of StrictNewVersion vs NewVersion here in the registry/client.go file:

helm/pkg/registry/client.go

Lines 622 to 630 in 79cd4dd

877C
var tagVersions []*semver.Version
for _, tag := range registryTags {
// Change underscore (_) back to plus (+) for Helm
// See https://github.com/helm/helm/issues/10166
tagVersion, err := semver.StrictNewVersion(strings.ReplaceAll(tag, "_", "+"))
if err == nil {
tagVersions = append(tagVersions, tagVersion)
}
}

Elsewhere in the Helm code, the more lenient semver.NewVersion is used:

$ git grep 'semver\.\(Strict\)\?NewVersion'
cmd/helm/search/search.go:              v1, err := semver.NewVersion(first.Chart.Version)
cmd/helm/search/search.go:              v2, err := semver.NewVersion(second.Chart.Version)
cmd/helm/search_repo.go:                v, err := semver.NewVersion(r.Chart.Version)
internal/resolver/resolver.go:                  v, err := semver.NewVersion(ch.Metadata.Version)
internal/resolver/resolver.go:                  _, err := semver.NewVersion(version)
internal/resolver/resolver.go:                  v, err := semver.NewVersion(ver.Version)
pkg/action/dependency.go:                       if _, err := semver.StrictNewVersion(maybeVersion); err == nil {
pkg/action/dependency.go:               v, err := semver.NewVersion(depChart.Metadata.Version)
pkg/action/dependency.go:                       v, err := semver.NewVersion(c.Metadata.Version)
pkg/action/package.go:  if _, err := semver.NewVersion(ver); err != nil {
pkg/chart/metadata.go:  _, err := semver.NewVersion(v)
pkg/chartutil/capabilities.go:  sv, err := semver.NewVersion(version)
pkg/chartutil/compatible.go:    sv, err := semver.NewVersion(ver)
pkg/downloader/chart_downloader.go:     _, errSemVer := semver.NewVersion(version)
pkg/downloader/manager.go:                      v, err := semver.NewVersion(ch.Metadata.Version)
pkg/downloader/manager.go:      sv1, err := semver.NewVersion(v1)
pkg/downloader/manager.go:      sv2, err := semver.NewVersion(v2)
pkg/downloader/manager.go:      v, err := semver.NewVersion(ch.Metadata.Version)
pkg/lint/rules/chartfile.go:    version, err := semver.NewVersion(cf.Version)
pkg/plugin/installer/vcs_installer.go:          if v, err := semver.NewVersion(r); err == nil {
pkg/registry/client.go:         tagVersion, err := semver.StrictNewVersion(strings.ReplaceAll(tag, "_", "+"))
pkg/registry/util.go:           test, err := semver.NewVersion(v)
pkg/repo/index.go:      i, err := semver.NewVersion(c[a].Version)
pkg/repo/index.go:      j, err := semver.NewVersion(c[b].Version)
pkg/repo/index.go:              test, err := semver.NewVersion(ver.Version)

For example:

With a strict semver versioned chart, as used for testing pkg/registry/client.go, both push and pull work with an OCI registry:

$ helm push pkg/downloader/testdata/local-subchart-0.1.0.tgz oci://gcr.io/jetstack-richard/test-chart
Pushed: gcr.io/jetstack-richard/test-chart/local-subchart:0.1.0
Digest: sha256:7cfc000b6a983861357c02832022aa907d5fa614730f3e4a2daf8872f00c32c7

$ helm pull oci://gcr.io/jetstack-richard/test-chart/local-subchart
Pulled: gcr.io/jetstack-richard/test-chart/local-subchart:0.1.0
Digest: sha256:7cfc000b6a983861357c02832022aa907d5fa614730f3e4a2daf8872f00c32c7

But with the Helm chart for cert-manager which uses a vX.Y.Z version number:

$ helm show chart ./cert-manager-v1.8.2.tgz 
...
apiVersion: v1
appVersion: v1.8.2
version: v1.8.2
...

Push it to an OCI registry:

$ helm push cert-manager-v1.8.2.tgz oci://gcr.io/jetstack-richard/cert-manager-chart
Pushed: gcr.io/jetstack-richard/cert-manager-chart/cert-manager:v1.8.2
Digest: sha256:5dd707dbffebc478d1005016674bdb8484a52b64355486c3afd8d350bf8c0578

helm pull fails, without specifying a version:

$ helm pull oci://gcr.io/jetstack-richard/cert-manager-chart/cert-manager
Error: Unable to locate any tags in provided repository: oci://gcr.io/jetstack-richard/cert-manager-chart/cert-manager

helm pull succeeds when a --version is supplied:

$ helm pull oci://gcr.io/jetstack-richard/cert-manager-chart/cert-manager --version v1.8.2
Pulled: gcr.io/jetstack-richard/cert-manager-chart/cert-manager:v1.8.2
Digest: sha256:5dd707dbffebc478d1005016674bdb8484a52b64355486c3afd8d350bf8c0578

xref:

Helm version info

$ helm version
version.BuildInfo{Version:"v3.9.0", GitCommit:"7ceeda6c585217a19a1131663d8cd1f7d641b2a7", GitTreeState:"clean", GoVersion:"go1.17.5"}
$ kubectl version --output=yaml
clientVersion:
  buildDate: "2022-05-03T13:46:05Z"
  compiler: gc
  gitCommit: 4ce5a8954017644c5420bae81d72b09b735c21f0
  gitTreeState: clean
  gitVersion: v1.24.0
  goVersion: go1.18.1
  major: "1"
  minor: "24"
  platform: linux/amd64
kustomizeVersion: v4.5.4

Metadata

Metadata

Assignees

No one assigned

    Labels

    StalebugCategorizes issue or PR as related to a bug.ociRelated to Helm OCI feature

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions

      0