diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 1cad720f..45375dc0 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -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 diff --git a/Dockerfile b/Dockerfile index c1d83ef4..46730681 100644 --- a/Dockerfile +++ b/Dockerfile @@ -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 && \ diff --git a/Dockerfile.debian-stable-slim b/Dockerfile.debian-stable-slim index e33e6bd1..16625a8d 100644 --- a/Dockerfile.debian-stable-slim +++ b/Dockerfile.debian-stable-slim @@ -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 && \ diff --git a/Dockerfile.ubuntu b/Dockerfile.ubuntu index 34934e39..6a41a2ae 100644 --- a/Dockerfile.ubuntu +++ b/Dockerfile.ubuntu @@ -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 && \ diff --git a/pkg/app/init.go b/pkg/app/init.go index f46eafe1..9afd341e 100644 --- a/pkg/app/init.go +++ b/pkg/app/init.go @@ -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" diff --git a/pkg/state/helmx.go b/pkg/state/helmx.go index a849bdd8..900e8213 100644 --- a/pkg/state/helmx.go +++ b/pkg/state/helmx.go @@ -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 } diff --git a/pkg/state/state.go b/pkg/state/state.go index acabe468..b243a3df 100644 --- a/pkg/state/state.go +++ b/pkg/state/state.go @@ -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) diff --git a/test/integration/run.sh b/test/integration/run.sh index a3f7bced..36faea29 100755 --- a/test/integration/run.sh +++ b/test/integration/run.sh @@ -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"