feat: add helm 4 --server-side flag support for diff and bump helm-diff to v3.15.10 (#2645)

Add appendServerSideFlagsForDiff to validate helm-diff plugin version
(v3.15.10+) before passing the --server-side flag to helm diff upgrade.
Extract resolveServerSideValue helper to share precedence logic between
upgrade and diff paths. Bump helm-diff recommended version to v3.15.10
across Dockerfiles, CI, and integration scripts.

Signed-off-by: yxxhero <aiopsclub@163.com>
This commit is contained in:
yxxhero
2026-06-17 09:07:44 +08:00
committed by GitHub
parent 6191f821eb
commit bbceb05b31
8 changed files with 50 additions and 21 deletions
+1 -1
View File
@@ -19,7 +19,7 @@ import (
const (
HelmRequiredVersion = "v3.18.6" // Minimum required version (supports Helm 3.x and 4.x)
HelmDiffRecommendedVersion = "v3.15.9"
HelmDiffRecommendedVersion = "v3.15.10"
HelmRecommendedVersion = "v4.2.1" // Recommended Helm 4 version
HelmSecretsRecommendedVersion = "v4.7.4" // v4.7.0+ works with both Helm 3 (single plugin) and Helm 4 (split plugin architecture)
HelmGitRecommendedVersion = "v1.3.0"
+17 -9
View File
@@ -357,6 +357,21 @@ func (st *HelmState) appendTakeOwnershipFlagsForUpgrade(flags []string, helm hel
// validServerSideValues are the allowed values for the helm 4 --server-side flag.
var validServerSideValues = map[string]struct{}{"true": {}, "false": {}, "auto": {}}
// resolveServerSideValue resolves the server-side value following precedence:
// release-level > CLI flag > helmDefaults. Returns empty string if no value is configured.
func (st *HelmState) resolveServerSideValue(release *ReleaseSpec, serverSide string) string {
switch {
case release.ServerSide != nil && *release.ServerSide != "":
return *release.ServerSide
case serverSide != "":
return serverSide
case st.HelmDefaults.ServerSide != nil && *st.HelmDefaults.ServerSide != "":
return *st.HelmDefaults.ServerSide
default:
return ""
}
}
// appendServerSideFlagsForUpgrade appends the helm 4 --server-side flag when appropriate.
// Precedence: release-level > CLI flag > helmDefaults.
func (st *HelmState) appendServerSideFlagsForUpgrade(flags []string, helm helmexec.Interface, release *ReleaseSpec, serverSide string) ([]string, error) {
@@ -372,15 +387,8 @@ func (st *HelmState) appendServerSideFlagsForUpgrade(flags []string, helm helmex
return flags, nil
}
var value string
switch {
case release.ServerSide != nil && *release.ServerSide != "":
value = *release.ServerSide
case serverSide != "":
value = serverSide
case st.HelmDefaults.ServerSide != nil && *st.HelmDefaults.ServerSide != "":
value = *st.HelmDefaults.ServerSide
default:
value := st.resolveServerSideValue(release, serverSide)
if value == "" {
return flags, nil
}
+22 -1
View File
@@ -4019,7 +4019,7 @@ func (st *HelmState) flagsForDiff(helm helmexec.Interface, release *ReleaseSpec,
}
// append server-side flag
flags, err = st.appendServerSideFlagsForUpgrade(flags, helm, release, serverSide)
flags, err = st.appendServerSideFlagsForDiff(flags, helm, release, serverSide, pluginsDir)
if err != nil {
return nil, nil, err
}
@@ -4058,6 +4058,27 @@ func (st *HelmState) appendTakeOwnershipFlagsForDiff(flags []string, release *Re
return flags, nil
}
// appendServerSideFlagsForDiff appends the helm 4 --server-side flag for helm-diff.
// It requires helm-diff plugin version v3.15.10 or later.
func (st *HelmState) appendServerSideFlagsForDiff(flags []string, helm helmexec.Interface, release *ReleaseSpec, serverSide string, pluginsDir string) ([]string, error) {
if helm.IsHelm4() {
value := st.resolveServerSideValue(release, serverSide)
if value != "" {
diffVersion, err := helmexec.GetPluginVersion("diff", pluginsDir)
if err != nil {
return flags, err
}
minVersion, _ := semver.NewVersion("v3.15.10")
if diffVersion.LessThan(minVersion) {
return flags, fmt.Errorf("server-side is not supported by helm-diff plugin version %s, please use at least v3.15.10", diffVersion)
}
}
}
return st.appendServerSideFlagsForUpgrade(flags, helm, release, serverSide)
}
func (st *HelmState) appendChartVersionFlags(flags []string, release *ReleaseSpec) []string {
version := release.Version
// Strip OCI digest from version (digest is handled in chart URL, not --version flag)