The first pnpm 12 beta release used pnpm 12.0.0-alpha.21 to publish a wrapper whose workspace name is `pacquet`. That version predates `publishConfig.name`, so npm trusted publishing was attempted for `pacquet` instead of `pnpm` and the root package failed after all native packages had already been published. Use pnpm 11.18.0, the released TypeScript CLI that supports `publishConfig.name`, for release tooling. Update every `pnpm/setup` consumer to the revision that can install v11 from GitHub release archives. Make the Rust publishing loop query each effective published name and skip versions already on npm, while preserving hard failures for registry errors other than 404. This allows a moved beta tag to resume the partial release and reach the dependent GitHub release job.
121 lines
4.4 KiB
YAML
121 lines
4.4 KiB
YAML
name: Ecosystem E2E
|
|
|
|
# Installs real-world JS stacks (Next.js, Vite, …) with both the pnpm CLI
|
|
# and pacquet, under both the default isolated layout and the global virtual
|
|
# store, then builds and serves each app. The binary axis catches pnpm↔pacquet
|
|
# parity gaps; the layout axis catches breakage introduced by the global
|
|
# virtual store. Runs on a daily cron rather than per-PR — the installs are
|
|
# slow and track upstream framework releases, so a red cell is investigated,
|
|
# not treated as a merge blocker.
|
|
|
|
permissions:
|
|
contents: read
|
|
|
|
on:
|
|
workflow_dispatch:
|
|
schedule:
|
|
- cron: '0 6 * * *'
|
|
|
|
concurrency:
|
|
group: ${{ github.workflow }}-${{ github.ref }}
|
|
cancel-in-progress: true
|
|
|
|
jobs:
|
|
# Compile pacquet, the harness, and the pnpm bundle once, then share them
|
|
# with every stack job — building them per stack would repeat the same
|
|
# multi-minute Rust and bundle builds across the whole matrix.
|
|
build:
|
|
if: github.repository == 'pnpm/pnpm' # Only run on the main repository, not forks
|
|
name: Ecosystem E2E / Build
|
|
runs-on: blacksmith-8vcpu-ubuntu-2404
|
|
timeout-minutes: 30
|
|
steps:
|
|
- name: Checkout
|
|
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
with:
|
|
persist-credentials: false
|
|
|
|
- name: Install pnpm
|
|
uses: pnpm/setup@6523ce966bcf7a1061ce6401e5c6e0b60466bd31
|
|
|
|
- name: Setup Rust toolchain
|
|
uses: ./.github/actions/rustup
|
|
|
|
- name: Build pnpm and the harness
|
|
run: cargo build --release --bin pnpm --bin ecosystem-e2e
|
|
|
|
- name: Build the pnpm CLI bundle
|
|
run: |
|
|
pnpm install --frozen-lockfile
|
|
pnpm --filter 'pnpm' run compile
|
|
|
|
- name: Upload build outputs
|
|
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
|
with:
|
|
name: ecosystem-e2e-build
|
|
path: |
|
|
target/release/pnpm
|
|
target/release/ecosystem-e2e
|
|
pnpm11/pnpm/dist
|
|
retention-days: 1
|
|
if-no-files-found: error
|
|
|
|
ecosystem-e2e:
|
|
if: github.repository == 'pnpm/pnpm' # Only run on the main repository, not forks
|
|
name: Ecosystem E2E / ${{ matrix.stack }}
|
|
needs: build
|
|
runs-on: blacksmith-8vcpu-ubuntu-2404
|
|
# Bound the blast radius: a hung build or serve subprocess can't pin a
|
|
# runner indefinitely.
|
|
timeout-minutes: 60
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
# One stack per job so a slow or flaky stack can't mask the others
|
|
# and each gets its own log artifact.
|
|
stack: [next, vite-react, angular, astro, sveltekit, nuxt, react-router]
|
|
steps:
|
|
# The pnpm shim launches the repo's committed `pnpm11/pnpm/bin/pnpm.cjs`, so the
|
|
# checkout is still needed alongside the downloaded `pnpm11/pnpm/dist` bundle.
|
|
- name: Checkout
|
|
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
with:
|
|
persist-credentials: false
|
|
|
|
- name: Download build outputs
|
|
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
|
with:
|
|
name: ecosystem-e2e-build
|
|
path: .
|
|
|
|
- name: Restore executable bits
|
|
# Artifacts don't preserve the executable bit.
|
|
run: chmod +x target/release/pnpm target/release/ecosystem-e2e
|
|
|
|
- name: Wrap the built pnpm bundle as an executable
|
|
# The harness takes a single executable for --pnpm; the launcher is a
|
|
# .cjs that needs `node`. Wrap the repo's bin entry (which loads
|
|
# dist/pnpm.mjs) so the run tests this repo's pnpm, not a system one.
|
|
run: |
|
|
printf '#!/usr/bin/env bash\nexec node "%s/pnpm11/pnpm/bin/pnpm.cjs" "$@"\n' "$PWD" > pnpm-built
|
|
chmod +x pnpm-built
|
|
|
|
- name: Run ecosystem E2E
|
|
run: |
|
|
./target/release/ecosystem-e2e \
|
|
--pnpm "$PWD/pnpm-built" \
|
|
--pacquet "$PWD/target/release/pnpm" \
|
|
--binary both \
|
|
--layout both \
|
|
--stack ${{ matrix.stack }} \
|
|
--work-dir "$RUNNER_TEMP/ecosystem-e2e-work"
|
|
|
|
- name: Upload cell logs
|
|
if: always()
|
|
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
|
with:
|
|
name: ecosystem-e2e-logs-${{ matrix.stack }}
|
|
path: ${{ runner.temp }}/ecosystem-e2e-work/**/*.log
|
|
retention-days: 7
|
|
if-no-files-found: ignore
|