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
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 50 additions and 21 deletions

View File

@ -96,35 +96,35 @@ jobs:
- helm-version: v3.18.6
kustomize-version: v5.8.0
plugin-secrets-version: 4.7.4
plugin-diff-version: 3.15.9
plugin-diff-version: 3.15.10
extra-helmfile-flags: ''
# In case you need to test some optional helmfile features,
# enable it via extra-helmfile-flags below.
- helm-version: v3.18.6
kustomize-version: v5.8.0
plugin-secrets-version: 4.7.4
plugin-diff-version: 3.15.9
plugin-diff-version: 3.15.10
extra-helmfile-flags: '--enable-live-output'
- helm-version: v3.21.1
kustomize-version: v5.8.0
plugin-secrets-version: 4.7.4
plugin-diff-version: 3.15.9
plugin-diff-version: 3.15.10
extra-helmfile-flags: ''
- helm-version: v3.21.1
kustomize-version: v5.8.0
plugin-secrets-version: 4.7.4
plugin-diff-version: 3.15.9
plugin-diff-version: 3.15.10
extra-helmfile-flags: '--enable-live-output'
# Helmfile now supports both Helm 3.x and Helm 4.x
- helm-version: v4.2.1
kustomize-version: v5.8.0
plugin-secrets-version: 4.7.4
plugin-diff-version: 3.15.9
plugin-diff-version: 3.15.10
extra-helmfile-flags: ''
- helm-version: v4.2.1
kustomize-version: v5.8.0
plugin-secrets-version: 4.7.4
plugin-diff-version: 3.15.9
plugin-diff-version: 3.15.10
extra-helmfile-flags: '--enable-live-output'
steps:
- uses: actions/checkout@v6

View File

@ -95,7 +95,7 @@ RUN set -x && \
[ "$(age-keygen --version)" = "${AGE_VERSION}" ]
ARG HELM_SECRETS_VERSION="4.7.4"
RUN helm plugin install https://github.com/databus23/helm-diff --version v3.15.9 --verify=false && \
RUN helm plugin install https://github.com/databus23/helm-diff --version v3.15.10 --verify=false && \
helm plugin install https://github.com/jkroepke/helm-secrets/releases/download/v${HELM_SECRETS_VERSION}/secrets-${HELM_SECRETS_VERSION}.tgz --verify=false && \
helm plugin install https://github.com/jkroepke/helm-secrets/releases/download/v${HELM_SECRETS_VERSION}/secrets-getter-${HELM_SECRETS_VERSION}.tgz --verify=false && \
helm plugin install https://github.com/jkroepke/helm-secrets/releases/download/v${HELM_SECRETS_VERSION}/secrets-post-renderer-${HELM_SECRETS_VERSION}.tgz --verify=false && \

View File

@ -104,7 +104,7 @@ RUN set -x && \
[ "$(age-keygen --version)" = "${AGE_VERSION}" ]
ARG HELM_SECRETS_VERSION="4.7.4"
RUN helm plugin install https://github.com/databus23/helm-diff --version v3.15.9 --verify=false && \
RUN helm plugin install https://github.com/databus23/helm-diff --version v3.15.10 --verify=false && \
helm plugin install https://github.com/jkroepke/helm-secrets/releases/download/v${HELM_SECRETS_VERSION}/secrets-${HELM_SECRETS_VERSION}.tgz --verify=false && \
helm plugin install https://github.com/jkroepke/helm-secrets/releases/download/v${HELM_SECRETS_VERSION}/secrets-getter-${HELM_SECRETS_VERSION}.tgz --verify=false && \
helm plugin install https://github.com/jkroepke/helm-secrets/releases/download/v${HELM_SECRETS_VERSION}/secrets-post-renderer-${HELM_SECRETS_VERSION}.tgz --verify=false && \

View File

@ -104,7 +104,7 @@ RUN set -x && \
[ "$(age-keygen --version)" = "${AGE_VERSION}" ]
ARG HELM_SECRETS_VERSION="4.7.4"
RUN helm plugin install https://github.com/databus23/helm-diff --version v3.15.9 --verify=false && \
RUN helm plugin install https://github.com/databus23/helm-diff --version v3.15.10 --verify=false && \
helm plugin install https://github.com/jkroepke/helm-secrets/releases/download/v${HELM_SECRETS_VERSION}/secrets-${HELM_SECRETS_VERSION}.tgz --verify=false && \
helm plugin install https://github.com/jkroepke/helm-secrets/releases/download/v${HELM_SECRETS_VERSION}/secrets-getter-${HELM_SECRETS_VERSION}.tgz --verify=false && \
helm plugin install https://github.com/jkroepke/helm-secrets/releases/download/v${HELM_SECRETS_VERSION}/secrets-post-renderer-${HELM_SECRETS_VERSION}.tgz --verify=false && \

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"

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
}

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)

View File

@ -27,7 +27,7 @@ export HELM_DATA_HOME="${helm_dir}/data"
export HELM_HOME="${HELM_DATA_HOME}"
export HELM_PLUGINS="${HELM_DATA_HOME}/plugins"
export HELM_CONFIG_HOME="${helm_dir}/config"
HELM_DIFF_VERSION="${HELM_DIFF_VERSION:-3.15.9}"
HELM_DIFF_VERSION="${HELM_DIFF_VERSION:-3.15.10}"
HELM_GIT_VERSION="${HELM_GIT_VERSION:-1.4.1}"
HELM_SECRETS_VERSION="${HELM_SECRETS_VERSION:-4.7.4}"
export GNUPGHOME="${PWD}/${dir}/.gnupg"