From 6f51e58a4c19bf773d9de1142ef0030441258710 Mon Sep 17 00:00:00 2001 From: Zoltan Kochan Date: Mon, 11 May 2026 13:34:47 +0200 Subject: [PATCH] fix: self-update bootstrap to packageManager-pinned version (#233) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- .github/workflows/test.yaml | 46 ++++++++++++++++++++++++++++ dist/index.js | Bin 1385204 -> 1385461 bytes src/install-pnpm/run.ts | 59 ++++++++++++++++++++++++++---------- 3 files changed, 89 insertions(+), 16 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index bd024e7..6299b63 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -194,6 +194,52 @@ 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"}}' + + 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..ddb8afe6c798f5729ddb907b6b33d080e175789c 100644 GIT binary patch delta 18355 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�@8UPt(2wMJqCp#FJ3kV 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[+]` 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 +159,27 @@ 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@')) { + // 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. devEngines.packageManager.version + // can be a semver range; `pnpm self-update` needs a specific version, so + // for ranges we fall through to the bootstrap auto-switch path. + if (devEngines?.packageManager?.name === 'pnpm') { + const v = devEngines.packageManager.version + if (v != null && isExactSemver(v)) { + return v + } return undefined } - if (devEngines?.packageManager?.name === 'pnpm' && devEngines.packageManager.version) { - return undefined + if (packageManagerVersion) { + return packageManagerVersion } if (!GITHUB_WORKSPACE) { @@ -173,6 +196,10 @@ Please specify it by one of the following ways: - in the package.json with the key "devEngines.packageManager"`) } +function isExactSemver(v: string): boolean { + return /^\d+\.\d+\.\d+(?:-[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?(?:\+[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?$/.test(v) +} + function getSystemNodeVersion(): Promise<{ major: number; minor: number }> { return new Promise((resolve) => { const cp = spawn('node', ['--version'], { stdio: ['pipe', 'pipe', 'pipe'], shell: process.platform === 'win32' })