From ba7df3f0f7ee63e6350d5fbdddc8ed945a6b141d Mon Sep 17 00:00:00 2001 From: morluto <76467478+morluto@users.noreply.github.com> Date: Sun, 11 Oct 2026 19:11:10 +0800 Subject: [PATCH] perf(ci): share bytecode across fresh Apple artifact subprocesses --- .github/workflows/ci.yml | 2 ++ docs/testing.md | 7 +++++++ scripts/lib/artifact-e2e.mjs | 24 +++++++++++++++++------- 3 files changed, 26 insertions(+), 7 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index bc2e7e28f..5e35e443e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -378,6 +378,8 @@ jobs: cache: npm - run: npm ci - name: Verify Apple artifact formats and metadata + env: + REA_ARTIFACT_NODE_COMPILE_CACHE: ${{ runner.temp }}/rea-artifact-node-cache run: | npm run verify:keyed-archive npm run verify:asset-catalog diff --git a/docs/testing.md b/docs/testing.md index 3fa490e4f..71c356cc7 100644 --- a/docs/testing.md +++ b/docs/testing.md @@ -991,6 +991,13 @@ the fixture cache. These subprocesses are outside aggregate Vitest coverage; subprocess coverage attachment remains disabled. Cold-start import checks launch independently without this fixture cache. +The Apple artifact verifier step shares a job-temporary bytecode cache among +its fresh CLI/MCP children via `REA_ARTIFACT_NODE_COMPILE_CACHE`. The artifact +helper maps this setting to child `NODE_COMPILE_CACHE`; npm, Turbo, and nested +Vitest runs do not inherit that setting. Explicit `NODE_COMPILE_CACHE` takes +precedence, and coverage collection or `NODE_DISABLE_COMPILE_CACHE=1` disables +the helper's cache. The cache is discarded with the CI job. + To evaluate persistent compile caching for repeated local runs, opt in for both cold and warm measurements with an isolated cache: diff --git a/scripts/lib/artifact-e2e.mjs b/scripts/lib/artifact-e2e.mjs index e0ad66506..b0ee1c2c1 100644 --- a/scripts/lib/artifact-e2e.mjs +++ b/scripts/lib/artifact-e2e.mjs @@ -5,13 +5,23 @@ import { fileURLToPath } from "node:url"; import { Client } from "@modelcontextprotocol/client"; import { StdioClientTransport } from "@modelcontextprotocol/client/stdio"; -const environment = () => ({ - PATH: process.env.PATH ?? "/usr/bin:/bin", - REA_LOG_LEVEL: "silent", - REA_ANALYSIS_PROVIDER: "auto", - // Artifact workflows have no deep-provider prerequisite or GUI authority. - HOPPER_LAUNCHER_PATH: "/rea-unconfigured-deep-provider/hopper", -}); +const environment = () => { + const compileCache = + process.env.NODE_COMPILE_CACHE ?? + process.env.REA_ARTIFACT_NODE_COMPILE_CACHE; + return { + PATH: process.env.PATH ?? "/usr/bin:/bin", + ...(compileCache && + process.env.NODE_V8_COVERAGE === undefined && + process.env.NODE_DISABLE_COMPILE_CACHE !== "1" + ? { NODE_COMPILE_CACHE: compileCache } + : {}), + REA_LOG_LEVEL: "silent", + REA_ANALYSIS_PROVIDER: "auto", + // Artifact workflows have no deep-provider prerequisite or GUI authority. + HOPPER_LAUNCHER_PATH: "/rea-unconfigured-deep-provider/hopper", + }; +}; /** Execute the compiled CLI with production providers and no test adapters. */ export async function artifactCli(