From 739bfe42ca9233c5e6aca07c1a25a9d34aca49b0 Mon Sep 17 00:00:00 2001 From: Zoltan Kochan Date: Mon, 11 May 2026 14:06:33 +0200 Subject: [PATCH] fix: self-update bootstrap to packageManager-pinned version (#233) (#256) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: self-update bootstrap to packageManager-pinned version (#233) When package.json pins pnpm via `packageManager` or an exact `devEngines.packageManager.version`, self-update the bootstrap up front. The bootstrap's `pnpm store path` skips pnpm's auto-switch (the `store` command sets `skipPackageManagerCheck = true`), so it reports the bootstrap's `STORE_VERSION` while the user's actual install runs under the pinned version and writes to a different STORE_VERSION — breaking `cache: true` and `setup-node`'s `cache: pnpm` on cold caches. * fix: check bin/ dir instead of pnpm.exe for self-update detection On Windows pnpm self-update writes `.bin/bin/pnpm` (a JS launcher), not `.bin/bin/pnpm.exe`, so the previous existsSync probe always fell back to pnpmHome and the bin_dest output pointed at the bootstrap pnpm. Check whether the `bin` directory itself exists. * fix: self-update accepts ranges; drop exact-semver gate `pnpm self-update` resolves semver ranges to a specific version, so `devEngines.packageManager.version: ">=10 <11"` can also go through the self-update path. That makes readTargetVersion total — it always returns a string or throws — so the runtime auto-switch fallback (and the `pnpm_config_pm_on_fail=download` export from #252) is no longer reachable and gets removed. Adds a range case to the cache_store_path matrix. --- .github/workflows/test.yaml | 48 +++++++++++++++++++++++ dist/index.js | Bin 1385204 -> 1385162 bytes src/install-pnpm/run.ts | 74 +++++++++++++++++++----------------- 3 files changed, 88 insertions(+), 34 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index bd024e7..38d72a4 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -194,6 +194,54 @@ jobs: pnpm add is-odd shell: bash + cache_store_path: + # Regression guard for #233. When package.json pins a pnpm major that + # differs from the bootstrap pnpm's major, the bootstrap reports its + # own STORE_VERSION from `pnpm store path` (the `store` command skips + # pnpm's auto-switch). The user's actual `pnpm install` runs under the + # pinned version and writes to a different STORE_VERSION, so the post + # step's saveCache then fails with "Path Validation Error". The fix is + # to self-update the bootstrap to the pinned version up front. + name: 'Cache store path matches install (#233): ${{ matrix.label }}' + + runs-on: ubuntu-latest + + strategy: + fail-fast: false + matrix: + include: + - label: 'packageManager pnpm@10.33.0' + manifest: '{"packageManager":"pnpm@10.33.0","dependencies":{"is-odd":"3.0.1"}}' + - label: 'devEngines exact pnpm@10.33.0' + manifest: '{"devEngines":{"packageManager":{"name":"pnpm","version":"10.33.0"}},"dependencies":{"is-odd":"3.0.1"}}' + - label: 'devEngines range >=10 <11' + manifest: '{"devEngines":{"packageManager":{"name":"pnpm","version":">=10 <11"}},"dependencies":{"is-odd":"3.0.1"}}' + + steps: + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 + + - name: Set up package.json + run: echo '${{ matrix.manifest }}' > package.json + shell: bash + + - id: pnpm + uses: ./ + with: + cache: true + run_install: | + - args: [--no-frozen-lockfile] + + - name: 'Test: store path computed by the action exists on disk' + run: | + set -e + actual="$(pnpm store path --silent)" + echo "pnpm store path: ${actual}" + if [ ! -d "${actual}" ]; then + echo "Expected store path to exist on disk; cache save would fail" + exit 1 + fi + shell: bash + run_install: name: 'run_install (${{ matrix.run_install.name }})' diff --git a/dist/index.js b/dist/index.js index 4c2ed42a3a0d7adb92995d0c37cec41baa029efb..c6757859a871e81903a6bfeeae5ea3470f6f01d4 100644 GIT binary patch delta 28506 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 delta 28495 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 JQ>F9K{|8`n>?i;L diff --git a/src/install-pnpm/run.ts b/src/install-pnpm/run.ts index ffcf3b8..3c1ccea 100644 --- a/src/install-pnpm/run.ts +++ b/src/install-pnpm/run.ts @@ -84,37 +84,31 @@ export async function runSelfInstaller(inputs: Inputs): Promise[+]` per spec. + // Strip the integrity hash for self-update. + const packageManagerVersion = + typeof packageManager === 'string' && packageManager.startsWith('pnpm@') + ? packageManager.slice('pnpm@'.length).split('+')[0] + : undefined + if (version) { - if ( - typeof packageManager === 'string' && - packageManager.startsWith('pnpm@') && - packageManager.replace('pnpm@', '') !== version - ) { + if (packageManagerVersion && packageManagerVersion !== version) { throw new Error(`Multiple versions of pnpm specified: - version ${version} in the GitHub Action config with the key "version" - version ${packageManager} in the package.json with the key "packageManager" @@ -150,13 +147,22 @@ Remove one of these versions to avoid version mismatch errors like ERR_PNPM_BAD_ return version } - // pnpm will automatically download and switch to the right version - if (typeof packageManager === 'string' && packageManager.startsWith('pnpm@')) { - return undefined + // Self-update the bootstrap pnpm to the version pinned in package.json so + // PATH-resolved `pnpm` (and the bin_dest output) reflect the target + // version. Without this, `pnpm store path` runs as the bootstrap and + // reports a different STORE_VERSION than the one the user's actual + // install writes to — breaking cache: true and actions/setup-node's + // `cache: pnpm` on cold caches (issue #233). + // + // devEngines.packageManager takes priority over packageManager, matching + // pnpm's getWantedPackageManager logic. `pnpm self-update` accepts both + // exact versions and semver ranges, so we pass either through directly. + if (devEngines?.packageManager?.name === 'pnpm' && devEngines.packageManager.version) { + return devEngines.packageManager.version } - if (devEngines?.packageManager?.name === 'pnpm' && devEngines.packageManager.version) { - return undefined + if (packageManagerVersion) { + return packageManagerVersion } if (!GITHUB_WORKSPACE) {