mirror of
https://github.com/helmfile/helmfile.git
synced 2026-10-22 10:24:35 +02:00
Fix 2337 helm4 stale repo indexes (#2369)
* fix: add --force-update flag for Helm 4 to prevent stale repository indexes Fixes #2337 Problem: Helmfile with Helm v4 doesn't update repository indexes when adding repos, leading to stale indexes and errors like: "chart matching version not found in example index. (try 'helm repo update')" This happens because Helm 4 changed behavior compared to Helm 3: - Helm 3: Always downloads index when running "helm repo add", even if repo exists - Helm 4: Skips downloading index if repo already exists with same config (see: https://github.com/helm/helm/blob/v4.0.4/pkg/cmd/repo_add.go#L200) Without --force-update, helmfile only works initially because Helm 4 downloads index on fresh repo setup, but subsequent "helmfile repos" commands result in stale indexes. Root Cause: The code only added --force-update for Helm 3.3.2+, but not for Helm 4, since it was believed to be default behavior in Helm 4. However, Helm 4 requires explicit --force-update flag to update indexes for existing repos. Solution: Add --force-update flag for Helm 4 in AddRepo function to ensure repository indexes are updated even when repository already exists. Refactoring: Simplified the conditional logic from nested if statements to a single readable condition using existing IsVersionAtLeast() helper: if !helm.options.DisableForceUpdate && (helm.IsHelm4() || helm.IsVersionAtLeast("3.3.2")) { args = append(args, "--force-update") } Changes: - pkg/helmexec/exec.go: Add --force-update for Helm 4 - pkg/helmexec/exec_test.go: Update test expectations for both Helm 3.3.2+ and Helm 4 - AGENTS.md: Add development guide for the repository Testing: - All helmexec package tests pass - Verified build succeeds - Tested against Helm 3.2.0 (no force-update) - Tested against Helm 3.3.2+ (with force-update) - Tested against Helm 4.0.1 (with force-update) Signed-off-by: opencode <opencode@users.noreply.github.com> Signed-off-by: yxxhero <aiopsclub@163.com> * test: update expected output for Helm 4 repo add message Update integration test expectations to match Helm 4 behavior with --force-update flag. When --force-update is used, Helm 4 now outputs "has been added to your repositories" instead of "already exists with the same configuration, skipping", because it forcibly updates the repository index. Related to #2337 Signed-off-by: opencode <opencode@users.noreply.github.com> Signed-off-by: yxxhero <aiopsclub@163.com> --------- Signed-off-by: opencode <opencode@users.noreply.github.com> Signed-off-by: yxxhero <aiopsclub@163.com>
This commit is contained in:
@@ -211,16 +211,11 @@ func (helm *execer) AddRepo(name, repository, cafile, certfile, keyfile, usernam
|
||||
case "":
|
||||
args = append(args, "repo", "add", name, repository)
|
||||
|
||||
// --force-update is the default behavior in Helm 4, but needs to be explicit in Helm 3
|
||||
// --force-update is needed for both Helm 3.3.2+ and Helm 4
|
||||
// to ensure repository indexes are updated when a repository already exists
|
||||
// See https://github.com/helm/helm/pull/8777
|
||||
if helm.IsHelm3() {
|
||||
if cons, err := semver.NewConstraint(">= 3.3.2"); err == nil {
|
||||
if !helm.options.DisableForceUpdate && cons.Check(helm.version) {
|
||||
args = append(args, "--force-update")
|
||||
}
|
||||
} else {
|
||||
panic(err)
|
||||
}
|
||||
if !helm.options.DisableForceUpdate && (helm.IsHelm4() || helm.IsVersionAtLeast("3.3.2")) {
|
||||
args = append(args, "--force-update")
|
||||
}
|
||||
|
||||
if certfile != "" && keyfile != "" {
|
||||
|
||||
@@ -147,9 +147,17 @@ exec: helm --kubeconfig config --kube-context dev repo add myRepo https://repo.e
|
||||
`,
|
||||
},
|
||||
{
|
||||
name: "Helm 4.0.1 (force-update is default)",
|
||||
name: "Helm 4.0.1 (force-update needed)",
|
||||
version: "4.0.1",
|
||||
expected: `Adding repo myRepo https://repo.example.com/
|
||||
exec: helm --kubeconfig config --kube-context dev repo add myRepo https://repo.example.com/ --force-update --cert-file cert.pem --key-file key.pem
|
||||
`,
|
||||
},
|
||||
{
|
||||
name: "Helm 4.0.1 (force-update disabled)",
|
||||
version: "4.0.1",
|
||||
disableForceUpdate: true,
|
||||
expected: `Adding repo myRepo https://repo.example.com/
|
||||
exec: helm --kubeconfig config --kube-context dev repo add myRepo https://repo.example.com/ --cert-file cert.pem --key-file key.pem
|
||||
`,
|
||||
},
|
||||
@@ -188,7 +196,7 @@ func Test_AddRepo(t *testing.T) {
|
||||
buffer.Reset()
|
||||
err = helm.AddRepo("myRepo", "https://repo.example.com/", "", "cert.pem", "key.pem", "", "", "", false, false)
|
||||
expected := `Adding repo myRepo https://repo.example.com/
|
||||
exec: helm --kubeconfig config --kube-context dev repo add myRepo https://repo.example.com/ --cert-file cert.pem --key-file key.pem
|
||||
exec: helm --kubeconfig config --kube-context dev repo add myRepo https://repo.example.com/ --force-update --cert-file cert.pem --key-file key.pem
|
||||
`
|
||||
if err != nil {
|
||||
t.Errorf("unexpected error: %v", err)
|
||||
@@ -202,7 +210,7 @@ exec: helm --kubeconfig config --kube-context dev repo add myRepo https://repo.e
|
||||
buffer.Reset()
|
||||
err = helm.AddRepo("myRepo", "https://repo.example.com/", "ca.crt", "", "", "", "", "", false, false)
|
||||
expected = `Adding repo myRepo https://repo.example.com/
|
||||
exec: helm --kubeconfig config --kube-context dev repo add myRepo https://repo.example.com/ --ca-file ca.crt
|
||||
exec: helm --kubeconfig config --kube-context dev repo add myRepo https://repo.example.com/ --force-update --ca-file ca.crt
|
||||
`
|
||||
if err != nil {
|
||||
t.Errorf("unexpected error: %v", err)
|
||||
@@ -216,7 +224,7 @@ exec: helm --kubeconfig config --kube-context dev repo add myRepo https://repo.e
|
||||
buffer.Reset()
|
||||
err = helm.AddRepo("myRepo", "https://repo.example.com/", "", "", "", "", "", "", false, false)
|
||||
expected = `Adding repo myRepo https://repo.example.com/
|
||||
exec: helm --kubeconfig config --kube-context dev repo add myRepo https://repo.example.com/
|
||||
exec: helm --kubeconfig config --kube-context dev repo add myRepo https://repo.example.com/ --force-update
|
||||
`
|
||||
if err != nil {
|
||||
t.Errorf("unexpected error: %v", err)
|
||||
@@ -257,11 +265,12 @@ exec: az acr helm repo add --name acrRepo:
|
||||
buffer.Reset()
|
||||
err = helm.AddRepo("myRepo", "https://repo.example.com/", "", "", "", "example_user", "example_password", "", false, false)
|
||||
expected = `Adding repo myRepo https://repo.example.com/
|
||||
exec: helm --kubeconfig config --kube-context dev repo add myRepo https://repo.example.com/ --username example_user --password-stdin
|
||||
exec: helm --kubeconfig config --kube-context dev repo add myRepo https://repo.example.com/ --force-update --username example_user --password-stdin
|
||||
`
|
||||
if err != nil {
|
||||
t.Errorf("unexpected error: %v", err)
|
||||
}
|
||||
|
||||
if buffer.String() != expected {
|
||||
t.Errorf("helmexec.AddRepo()\nactual = %v\nexpect = %v", buffer.String(), expected)
|
||||
}
|
||||
@@ -270,7 +279,7 @@ exec: helm --kubeconfig config --kube-context dev repo add myRepo https://repo.e
|
||||
buffer.Reset()
|
||||
err = helm.AddRepo("myRepo", "https://repo.example.com/", "", "", "", "example_user", "example_password", "", true, false)
|
||||
expected = `Adding repo myRepo https://repo.example.com/
|
||||
exec: helm --kubeconfig config --kube-context dev repo add myRepo https://repo.example.com/ --pass-credentials --username example_user --password-stdin
|
||||
exec: helm --kubeconfig config --kube-context dev repo add myRepo https://repo.example.com/ --force-update --pass-credentials --username example_user --password-stdin
|
||||
`
|
||||
if err != nil {
|
||||
t.Errorf("unexpected error: %v", err)
|
||||
@@ -285,8 +294,8 @@ exec: helm --kubeconfig config --kube-context dev repo add myRepo https://repo.e
|
||||
buffer.Reset()
|
||||
err = helm.AddRepo("myRepo", "https://repo.example.com/", "", "", "", "", "", "", false, true)
|
||||
expected = `Adding repo myRepo https://repo.example.com/
|
||||
exec: helm --kubeconfig config --kube-context dev repo add myRepo https://repo.example.com/ --insecure-skip-tls-verify
|
||||
`
|
||||
exec: helm --kubeconfig config --kube-context dev repo add myRepo https://repo.example.com/ --force-update --insecure-skip-tls-verify
|
||||
`
|
||||
if err != nil {
|
||||
t.Errorf("unexpected error: %v", err)
|
||||
}
|
||||
@@ -1174,7 +1183,7 @@ exec: helm --kubeconfig config --kube-context dev chart export chart --destinati
|
||||
|
||||
var logLevelTests = map[string]string{
|
||||
"debug": `Adding repo myRepo https://repo.example.com/
|
||||
exec: helm repo add myRepo https://repo.example.com/ --username example_user --password example_password
|
||||
exec: helm repo add myRepo https://repo.example.com/ --force-update --username example_user --password-stdin
|
||||
`,
|
||||
"info": `Adding repo myRepo https://repo.example.com/
|
||||
`,
|
||||
|
||||
Reference in New Issue
Block a user