Closed
Description
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:
Lines 622 to 630 in 79cd4dd
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