mirror of
https://github.com/stablyai/orca.git
synced 2026-11-06 03:57:35 +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.
129 lines
6.4 KiB
YAML
129 lines
6.4 KiB
YAML
name: Prepare native runtime
|
|
description: Restore and probe source-built native modules for the requested runtime.
|
|
|
|
inputs:
|
|
native-runtime:
|
|
description: Native runtime to prepare (none, node, or electron).
|
|
required: false
|
|
default: none
|
|
node-version:
|
|
description: Resolved Node.js version provided by setup-node.
|
|
required: true
|
|
persist-native-cache:
|
|
description: Save native modules at job end unless a later step changes their ABI.
|
|
required: false
|
|
default: 'true'
|
|
|
|
outputs:
|
|
cache-scope:
|
|
description: Operating-system image scope used by the native module cache.
|
|
value: ${{ steps.native-cache-scope.outputs.scope }}
|
|
cache-key:
|
|
description: Exact key requested for this runtime, independent of whether restoration succeeds.
|
|
value: ${{ steps.native-cache-scope.outputs.key }}
|
|
cache-path:
|
|
description: Native build directories covered by the requested cache.
|
|
value: ${{ steps.native-cache-scope.outputs.path }}
|
|
cache-hit:
|
|
description: Whether compiled native modules were restored under the exact requested key.
|
|
value: ${{ steps.native-cache-restore.outputs.cache-hit || steps.native-cache-restore-only.outputs.cache-hit }}
|
|
|
|
runs:
|
|
using: composite
|
|
steps:
|
|
- name: Validate native runtime
|
|
shell: bash
|
|
env:
|
|
NATIVE_RUNTIME: ${{ inputs.native-runtime }}
|
|
NODE_VERSION: ${{ inputs.node-version }}
|
|
run: |
|
|
case "$NATIVE_RUNTIME" in
|
|
none) ;;
|
|
node|electron) test -n "$NODE_VERSION" ;;
|
|
*)
|
|
echo "::error::native-runtime must be none, node, or electron"
|
|
exit 2
|
|
;;
|
|
esac
|
|
|
|
# Exact keys separate runtime, architecture and host libc; every restored addon is probed.
|
|
- name: Resolve native cache scope
|
|
id: native-cache-scope
|
|
if: inputs.native-runtime != 'none'
|
|
shell: bash
|
|
env:
|
|
NATIVE_RUNTIME: ${{ inputs.native-runtime }}
|
|
NODE_VERSION: ${{ inputs.node-version }}
|
|
NATIVE_SOURCE_HASH: ${{ hashFiles('pnpm-lock.yaml', 'pnpm-workspace.yaml', '.npmrc', 'config/pnpmfile.cjs', '.github/actions/prepare-native-runtime/action.yml', '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/node-pty@1.1.0.patch', 'config/patches/@vscode__windows-process-tree@0.8.0.patch', 'native/windows-registry/src/addon.cc', 'native/windows-registry/binding.gyp', 'native/windows-registry/package.json', 'native/windows-registry/index.js', 'native/windows-security/src/addon.cc', 'native/windows-security/binding.gyp', 'native/windows-security/package.json', 'native/windows-security/index.js') }}
|
|
run: |
|
|
scope="${ImageOS:-$RUNNER_OS}"
|
|
if [ -r /etc/os-release ]; then
|
|
. /etc/os-release
|
|
scope="${ID:-linux}-${VERSION_ID:-unknown}"
|
|
fi
|
|
pnpm_version="$(pnpm --version)"
|
|
test -n "$pnpm_version"
|
|
printf 'scope=%s\n' "$scope" >> "$GITHUB_OUTPUT"
|
|
printf 'key=native-modules-%s-%s-%s-%s-node%s-pnpm%s-%s\n' "$RUNNER_OS" "$scope" "$RUNNER_ARCH" "$NATIVE_RUNTIME" "$NODE_VERSION" "$pnpm_version" "$NATIVE_SOURCE_HASH" >> "$GITHUB_OUTPUT"
|
|
cat >> "$GITHUB_OUTPUT" <<'ORCA_NATIVE_CACHE_PATHS'
|
|
path<<ORCA_NATIVE_BUILD_DIRECTORIES
|
|
node_modules/.pnpm/node-pty@*/node_modules/node-pty/build
|
|
native/windows-registry/build
|
|
native/windows-security/build
|
|
node_modules/.pnpm/@vscode+windows-process-tre*/node_modules/@vscode/windows-process-tree/build
|
|
ORCA_NATIVE_BUILD_DIRECTORIES
|
|
ORCA_NATIVE_CACHE_PATHS
|
|
|
|
- name: Restore compiled native modules
|
|
id: native-cache-restore
|
|
if: inputs.native-runtime != 'none' && inputs.persist-native-cache != 'false'
|
|
uses: actions/cache@v5
|
|
with:
|
|
# Post-job saving cannot resolve nested composite step outputs.
|
|
path: |
|
|
node_modules/.pnpm/node-pty@*/node_modules/node-pty/build
|
|
native/windows-registry/build
|
|
native/windows-security/build
|
|
node_modules/.pnpm/@vscode+windows-process-tre*/node_modules/@vscode/windows-process-tree/build
|
|
key: ${{ steps.native-cache-scope.outputs.key }}
|
|
|
|
- name: Restore compiled native modules without saving
|
|
id: native-cache-restore-only
|
|
if: inputs.native-runtime != 'none' && inputs.persist-native-cache == 'false'
|
|
uses: actions/cache/restore@v5
|
|
with:
|
|
path: |
|
|
node_modules/.pnpm/node-pty@*/node_modules/node-pty/build
|
|
native/windows-registry/build
|
|
native/windows-security/build
|
|
node_modules/.pnpm/@vscode+windows-process-tre*/node_modules/@vscode/windows-process-tree/build
|
|
key: ${{ steps.native-cache-scope.outputs.key }}
|
|
|
|
# pnpm's bundled gyp_main.py is not executable; Electron rebuild uses its own node-gyp API.
|
|
- name: Use external node-gyp
|
|
if: runner.os == 'Linux' && inputs.native-runtime == 'node'
|
|
shell: bash
|
|
env:
|
|
NATIVE_RUNTIME: ${{ inputs.native-runtime }}
|
|
NATIVE_CACHE_HIT: ${{ steps.native-cache-restore.outputs.cache-hit || steps.native-cache-restore-only.outputs.cache-hit }}
|
|
run: |
|
|
# A cache hit can contain unusable addons; probe before skipping the rebuild toolchain.
|
|
if [ "$NATIVE_RUNTIME" = node ] && [ "$NATIVE_CACHE_HIT" = true ] &&
|
|
node config/scripts/ensure-native-runtime.mjs --check-only; then
|
|
exit 0
|
|
fi
|
|
npm install -g node-gyp@11.5.0
|
|
echo "npm_config_node_gyp=$(npm root -g)/node-gyp/bin/node-gyp.js" >> "$GITHUB_ENV"
|
|
|
|
- name: Prepare native runtime
|
|
if: inputs.native-runtime != 'none'
|
|
shell: bash
|
|
env:
|
|
NATIVE_RUNTIME: ${{ inputs.native-runtime }}
|
|
run: |
|
|
if [ "$RUNNER_OS" = Windows ] && [ "$NATIVE_RUNTIME" = node ]; then
|
|
node config/scripts/initialize-windows-native-toolchain.mjs
|
|
else
|
|
node config/scripts/ensure-native-runtime.mjs --runtime="$NATIVE_RUNTIME"
|
|
fi
|