fix: ensure pnpm bin link exists after npm ci

npm ci sometimes doesn't create the .bin/pnpm symlink for
@pnpm/exe (observed on Linux CI). Manually create the symlink
if it's missing after npm ci completes.

This fixes the case where standalone=true with no explicit version
(relying on packageManager field) — pnpm self-update wouldn't run,
leaving .bin empty and pnpm not found on PATH.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Zoltan Kochan
2026-03-17 12:33:11 +01:00
parent c3b2a5fad6
commit 1f69135d3d
2 changed files with 126 additions and 131 deletions

232
dist/index.js vendored

File diff suppressed because one or more lines are too long

View File

@@ -1,7 +1,7 @@
import { addPath, exportVariable } from '@actions/core'
import { spawn } from 'child_process'
import { rm, writeFile, mkdir } from 'fs/promises'
import { readFileSync } from 'fs'
import { rm, writeFile, mkdir, symlink } from 'fs/promises'
import { readFileSync, existsSync } from 'fs'
import path from 'path'
import util from 'util'
import { Inputs } from '../inputs'
@@ -30,22 +30,17 @@ export async function runSelfInstaller(inputs: Inputs): Promise<number> {
}
const pnpmHome = path.join(dest, 'node_modules', '.bin')
console.log(`Adding to PATH: ${pnpmHome}`)
addPath(pnpmHome)
exportVariable('PNPM_HOME', pnpmHome)
// Debug: list .bin contents
const { readdirSync, lstatSync } = await import('fs')
try {
const bins = readdirSync(pnpmHome)
console.log(`.bin contents: ${bins.join(', ')}`)
for (const bin of bins) {
const binPath = path.join(pnpmHome, bin)
const stat = lstatSync(binPath)
console.log(` ${bin}: symlink=${stat.isSymbolicLink()}, mode=${stat.mode.toString(8)}`)
}
} catch (e) {
console.log(`Failed to list .bin: ${e}`)
// Ensure pnpm bin link exists — npm ci sometimes doesn't create it
const pnpmBinLink = path.join(pnpmHome, 'pnpm')
if (!existsSync(pnpmBinLink)) {
await mkdir(pnpmHome, { recursive: true })
const target = standalone
? path.join('..', '@pnpm', 'exe', 'pnpm')
: path.join('..', 'pnpm', 'bin', 'pnpm.cjs')
await symlink(target, pnpmBinLink)
}
const bootstrapPnpm = standalone