Skip to content

v3.15.14 tarball layout change (diff/ → helm-diff-<os>-<arch>/) breaks helm plugin update diff for existing installs #1076

Description

@goldserg

What happened

v3.15.14 (via #1072, "fix: make release tarballs installable offline by helm 4") renamed the top-level directory inside release archives from diff/ to helm-diff-<os>-<arch>/. This breaks helm plugin update diff on any machine where the plugin was installed with a pre-3.15.14 release.

Reason: for existing installs the update hook runs the already-installed copy of install-binary.sh (platformHooks.update → ${HELM_PLUGIN_DIR}/install-binary.sh -u), which is the old pre-3.15.14 script. The old script's installFile() hardcodes HELM_TMP_BIN="$HELM_TMP/diff/bin/diff", while in update mode it always downloads releases/latest — which is now the v3.15.14 archive with the new layout:

Downloading https://github.com/databus23/helm-diff/releases/latest/download/helm-diff-linux-amd64.tgz
Preparing to install into /root/.local/share/helm/plugins/helm-diff
Failed to install helm-diff
	For support, go to https://github.com/databus23/helm-diff.

STDERR:
  cp: cannot stat '/tmp/helm-diff-6OmpsW/diff/bin/diff': No such file or directory
  Error: Failed to update plugin diff, got error (plugin update hook for "diff" exited with error)

This hits CI pipelines that reuse containers with a cached plugin — in our case helmfile init --force → helm plugin update diff → helmfile panics with helmexec.ExitError.

A fresh install works fine, because the v3.15.14 install-binary.sh handles both layouts (explicit fallback to $HELM_TMP/diff/bin/$bin).

Verified by diffing the archives:

# v3.15.13
diff/plugin.yaml
diff/install-binary.sh
diff/bin/diff

# v3.15.14
helm-diff-linux-amd64/plugin.yaml
helm-diff-linux-amd64/install-binary.sh
helm-diff-linux-amd64/bin/diff

Affected

Every install of helm-diff < 3.15.14 on helm plugin update diff. Until the affected machine reinstalls the plugin, every update attempt fails.

Possible directions

  • Revert the layout rename so old update hooks keep working (helm 4 offline-install compat would then need another approach).
  • Or, minimally, document that pre-3.15.14 installs need a one-time helm plugin uninstall diff + reinstall, since the layout rename cannot be picked up by the already-installed update hook.

Activity

  1. yxxhero commented on Sep 26, 2026

    @yxxhero
    Collaborator

    @goldserg thanks for you issue. I will try solve this.

  2. yxxhero commented on Sep 26, 2026

    @yxxhero
    Collaborator

    Thanks for the detailed report — the root-cause analysis is exactly right: helm plugin update runs the already installed copy of install-binary.sh, which hardcodes $HELM_TMP/diff/bin/diff, and 3.15.14's archive layout change broke it for every pre-3.15.14 install.

    Fix is up in #1077. Rather than reverting the helm 4 offline-install support from #1071 (or requiring a one-time reinstall), the next release will:

    • wrap all release archives in diff/ again — the layout every released install/update hook expects — so helm plugin update diff starts working again on existing installs, including installs on 3.15.14 (its hook falls back to diff/bin/diff);
    • additionally publish each platform under a versioned name, diff-<version>-<os>-<arch>.tgz (byte-identical content, own .prov). Helm 4 derives the directory it expects inside a locally installed tarball from the tarball file name (stripping a -<version> component), so diff-3.15.15-linux-amd64.tgz → diff/ keeps the Offline install not working in helm 4 unless you --verify=false #1071 offline/verified-install flow working; the historical helm-diff-<os>-<arch>.tgz name can never satisfy that flow because it has no version component to strip.

    If you're blocked before the next release lands, the one-time workaround is as you described: helm plugin uninstall diff && helm plugin install https://github.com/databus23/helm-diff.

  3. added a commit that references this issue on Sep 26, 2026
    c43e3e4
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions