From 1abdf9d3e34f86fdc6fac011df5360dfb3c5698a Mon Sep 17 00:00:00 2001 From: Joey Stanford Date: Fri, 31 Jul 2026 15:12:34 -0600 Subject: [PATCH] fix(e2e): run CI env check after pnpm is available Pre-install check was failing the E2E workflow because pnpm and node_modules are required before setup/install. Gate pre-install with --skip-node-modules after the toolchain is on PATH. --- .github/workflows/e2e.yaml | 7 ++++--- docs/ci-cd.md | 2 +- scripts/check-environment.mjs | 16 +++++++++++++++- scripts/check-environment.test.mjs | 13 +++++++++++++ 4 files changed, 33 insertions(+), 5 deletions(-) diff --git a/.github/workflows/e2e.yaml b/.github/workflows/e2e.yaml index bcf0ee430..8faa1298e 100644 --- a/.github/workflows/e2e.yaml +++ b/.github/workflows/e2e.yaml @@ -32,9 +32,6 @@ jobs: with: persist-credentials: false - - name: Check environment (pre-pnpm) - run: node scripts/check-environment.mjs - - name: Setup pnpm uses: pnpm/action-setup@0ebf47130e4866e96fce0953f49152a61190b271 @@ -43,6 +40,10 @@ jobs: node-version: '22' cache: 'pnpm' + # After toolchain is on PATH; skip node_modules until install (still fatal on git/node/pnpm). + - name: Check environment (pre-install) + run: node scripts/check-environment.mjs --skip-node-modules + - name: Install dependencies run: pnpm install --frozen-lockfile diff --git a/docs/ci-cd.md b/docs/ci-cd.md index d57a50268..c7c6d2940 100644 --- a/docs/ci-cd.md +++ b/docs/ci-cd.md @@ -61,7 +61,7 @@ Test results are available as a downloadable artifact from the workflow run. Not a PR gate. Runs on a **daily schedule** (default branch only) and on **manual** `workflow_dispatch`: -1. Checkout (`persist-credentials: false`), `node scripts/check-environment.mjs`, setup pnpm + Node 22, `pnpm install --frozen-lockfile`, then `pnpm run check:environment` (`PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1`) +1. Checkout (`persist-credentials: false`), setup pnpm + Node 22, `node scripts/check-environment.mjs --skip-node-modules`, `pnpm install --frozen-lockfile`, then `pnpm run check:environment` (`PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1`) 2. Linux (`ubuntu-24.04`): install Electron runtime libraries (`libatk-bridge2.0-0t64`, `libgtk-3-0t64`, `libasound2t64`, …) + `xvfb` 3. `pnpm run build` (unpackaged `dist-electron` + renderer) 4. `pnpm run test:e2e` (Linux under `xvfb-run -a`; macOS/Windows plain) — Playwright launches the local Electron binary via `resolveLocalElectronBin()` with an isolated `--user-data-dir` diff --git a/scripts/check-environment.mjs b/scripts/check-environment.mjs index 86f632754..f9320c090 100644 --- a/scripts/check-environment.mjs +++ b/scripts/check-environment.mjs @@ -691,6 +691,16 @@ function checkLinuxDialout() { }; } +/** + * @param {string[]} argv + * @returns {{ skipNodeModules: boolean }} + */ +export function parseCheckEnvironmentArgs(argv = process.argv.slice(2)) { + return { + skipNodeModules: argv.includes('--skip-node-modules'), + }; +} + /** * @returns {CheckResult[]} */ @@ -745,9 +755,13 @@ function printSummary(checks) { function main() { const platformLabel = PLATFORM_LABELS[process.platform] ?? process.platform; + const args = parseCheckEnvironmentArgs(); console.log(`Mesh Client environment check (platform: ${platformLabel})\n`); + if (args.skipNodeModules) { + console.log('(skipping node_modules check — pre-install mode)\n'); + } - const checks = runChecks(); + const checks = runChecks({ skipNodeModules: args.skipNodeModules }); for (const check of checks) { for (const line of formatCheckResult(check)) { diff --git a/scripts/check-environment.test.mjs b/scripts/check-environment.test.mjs index ac751bc09..191cc016d 100644 --- a/scripts/check-environment.test.mjs +++ b/scripts/check-environment.test.mjs @@ -6,11 +6,24 @@ import { formatLocalActDockerNote, evaluateContainerEngineCheck, evaluatePlaywrightCheck, + parseCheckEnvironmentArgs, parseVersion, resolveExitCode, versionGte, } from './check-environment.mjs'; +describe('check-environment parseCheckEnvironmentArgs', () => { + it('defaults skipNodeModules to false', () => { + expect(parseCheckEnvironmentArgs([])).toEqual({ skipNodeModules: false }); + }); + + it('enables skipNodeModules for --skip-node-modules', () => { + expect(parseCheckEnvironmentArgs(['--skip-node-modules'])).toEqual({ + skipNodeModules: true, + }); + }); +}); + describe('check-environment parseVersion', () => { it('parses v-prefixed semver strings', () => { expect(parseVersion('v22.13.0')).toEqual({ major: 22, minor: 13, patch: 0 });