mirror of
https://github.com/stablyai/orca.git
synced 2026-10-31 00:57:45 +00:00
* build: share one pnpm virtual store across worktrees, off under CI
Each worktree carried a full node_modules; the global virtual store links
one slot per package version instead. pnpm keeps an explicit setting on
under CI, so a pnpmfile hook turns it off there: CI packages from,
caches and verifies a project-local node_modules.
* fix(build): keep shared electron and windows-process-tree dirs untouched under GVS
Every worktree runs Electron from the one shared electron package, so the
per-repo dist cache must not swap that dist and a foreign-arch install must
not land in it. The relay addon builder now repairs and compiles a private
copy instead of the shared windows-process-tree dir.
* fix(build): accept CLI runtime imports reached through an in-artifact store link
Under the global virtual store node_modules/<pkg> realpaths into a store
outside the repo. The check still rejects anything not reached through a
node_modules link inside the artifact, such as a stray ~/node_modules.
* docs: explain the global virtual store layout and the ~/node_modules hazard
* test: compare CLI closure paths with POSIX separators so the suite passes on Windows
* build: keep Windows on the normal pnpm layout unless ORCA_PNPM_GLOBAL_VIRTUAL_STORE=1
Store links are true symlinks on Windows, and installs without admin or
Developer Mode are unverified; CI still forces the normal layout first.
* fix(build): close the remaining shared-slot gaps under the global virtual store
- verify-skills-cli-runtime resolves each import from the importer's realpath,
as Node does, so an artifact-local copy can't mask a ~/node_modules load.
- A concurrent sibling install of the shared Electron dist is kept, not swapped out.
- rebuild:node goes through ensure-native-runtime, which builds a shared
node-pty beside the slot instead of node-gyp cleaning its build/ dir.
* fix(build): keep pnpm rebuild:node a forced rebuild
It replaced pnpm rebuild node-pty, which always rebuilt; without --force it
only rebuilt a node-pty that failed to load.
* docs: note that the store switches must stay set, since pnpm run relinks
* build: move the pnpmfile under config/ to keep the repo root allowlisted
pnpm-workspace.yaml points pnpm at it; the lockfile checksum is unchanged
because the content is.
* fix(build): enable the global virtual store from the pnpmfile, not the workspace file
pnpm exec derives NODE_PATH from the file setting, so even with the store
forced off under CI every child process got the root node_modules on its
NODE_PATH; a Windows rebuild fixture then resolved the real
@orca/windows-registry it deliberately omits. The hook now sets the store
both ways, and ORCA_PNPM_GLOBAL_VIRTUAL_STORE=0/1 is the one switch.
* test(pty): keep F3's concurrent spawns on the node-pty mock
Two concurrent first import('node-pty') calls race vitest's mock registry
and the loser loads the real addon under the mocked linux platform. It
passed only where a platform-agnostic build/Release happened to exist,
so it failed on every shared-store worktree.
* ci: fail PRs whose packages need a dependency they never declared
A new dependency_isolation job installs with the global virtual store
forced on (ORCA_PNPM_FORCE_GLOBAL_VIRTUAL_STORE_IN_CI), HOME and the store
in an empty temp dir, then runs pnpm tc and the undeclared-dependency test.
Postinstall now warns when a node_modules above the shared store, such as
~/node_modules, would mask the same class of bug locally.
* ci: set the isolation job's HOME and store through GITHUB_ENV
Job-level env cannot read the runner context, which made pr.yml invalid.
104 lines
3.9 KiB
YAML
104 lines
3.9 KiB
YAML
name: Warm shared CI caches
|
|
|
|
on:
|
|
# Cache-input pushes seed immediately; this schedule repairs eviction and image changes.
|
|
schedule:
|
|
- cron: '41 */6 * * *'
|
|
workflow_dispatch:
|
|
push:
|
|
branches: [main]
|
|
paths:
|
|
- '.github/workflows/ci-cache-warmup.yml'
|
|
- '.github/workflows/ci-cache-warmup-platform-jobs.yml'
|
|
- '.github/workflows/ci-cache-warmup-platforms.yml'
|
|
- '.github/actions/install-node-dependencies/**'
|
|
- '.github/actions/restore-pnpm-verification/**'
|
|
- '.github/actions/prepare-native-runtime/**'
|
|
- '.github/actions/prepare-windows-cli-launcher/**'
|
|
- '.github/actions/prepare-git-compatibility/**'
|
|
- '.github/actions/prepare-headless-compiler/**'
|
|
- 'config/scripts/headless-detector-compiler-cache.mjs'
|
|
- '.github/actions/prepare-linux-package-fixture/**'
|
|
- '.github/actions/prepare-wayland-clipboard/**'
|
|
- 'native/wayland-clipboard/**'
|
|
- 'config/scripts/build-wayland-clipboard.mjs'
|
|
- 'config/docker/headless-serve-shutdown/**'
|
|
- 'config/docker/cli-launch-contract/**'
|
|
- 'config/docker/daemon-shutdown-descendants/**'
|
|
- 'package.json'
|
|
- 'pnpm-lock.yaml'
|
|
- 'pnpm-workspace.yaml'
|
|
- '.npmrc'
|
|
- 'config/pnpmfile.cjs'
|
|
- 'config/scripts/ensure-native-runtime.mjs'
|
|
- 'config/scripts/initialize-windows-native-toolchain.mjs'
|
|
- 'config/scripts/capture-windows-native-environment.cmd'
|
|
- 'config/scripts/rebuild-native-deps.mjs'
|
|
- 'config/scripts/node-pty-job-ownership.cjs'
|
|
- 'config/scripts/windows-pe-machine.cjs'
|
|
- 'config/scripts/windows-process-tree-gyp-rebuild.mjs'
|
|
- 'config/scripts/windows-process-tree-creation-time.cjs'
|
|
- 'config/scripts/install-electron-package-binary.mjs'
|
|
- 'config/scripts/electron-platform-path.mjs'
|
|
- 'config/scripts/zip-extractor-command.mjs'
|
|
- 'src/shared/zip-extractor-command.ts'
|
|
- 'config/scripts/shared-electron-dist-cache.mjs'
|
|
- 'config/scripts/space-sharing-copy.mjs'
|
|
- 'config/patches/**'
|
|
- 'native/windows-registry/**'
|
|
- 'native/windows-security/**'
|
|
pull_request:
|
|
types: [opened, synchronize, reopened, ready_for_review, converted_to_draft]
|
|
paths:
|
|
- '.github/workflows/ci-cache-warmup.yml'
|
|
- '.github/actions/prepare-headless-compiler/**'
|
|
- 'config/scripts/headless-detector-compiler-cache.mjs'
|
|
- '.github/actions/prepare-wayland-clipboard/**'
|
|
|
|
permissions:
|
|
contents: read
|
|
|
|
concurrency:
|
|
group: ci-cache-warmup-${{ github.event.pull_request.number || github.run_id }}
|
|
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
|
|
|
|
jobs:
|
|
warm:
|
|
if: github.event_name != 'pull_request' || github.event.pull_request.draft != true
|
|
concurrency:
|
|
group: ci-cache-warmup-linux-x64-${{ github.event.pull_request.number || github.ref }}
|
|
cancel-in-progress: ${{ github.event_name != 'schedule' }}
|
|
runs-on: ubuntu-latest
|
|
timeout-minutes: 10
|
|
env:
|
|
ORCA_BACKGROUND_LAUNCH: '1'
|
|
steps:
|
|
- uses: actions/checkout@v6
|
|
with:
|
|
persist-credentials: false
|
|
|
|
# Default-branch caches can be restored by every PR; PR caches cannot.
|
|
- uses: ./.github/actions/install-node-dependencies
|
|
with:
|
|
native-runtime: node
|
|
node-version: '24'
|
|
cache-electron-package: 'true'
|
|
cache-pnpm-store-lookup-only: 'true'
|
|
|
|
- uses: ./.github/actions/prepare-headless-compiler
|
|
with:
|
|
seed: 'true'
|
|
|
|
- name: Populate shared Electron archive
|
|
run: node config/scripts/install-electron-package-binary.mjs
|
|
|
|
- uses: ./.github/actions/prepare-git-compatibility
|
|
|
|
- uses: ./.github/actions/prepare-wayland-clipboard
|
|
with:
|
|
save-cache: 'true'
|
|
|
|
warm-platforms:
|
|
if: github.event_name == 'schedule' || github.event_name == 'workflow_dispatch'
|
|
uses: ./.github/workflows/ci-cache-warmup-platform-jobs.yml
|