mirror of
https://github.com/stablyai/orca.git
synced 2026-10-03 00:02:19 +00:00
Free PR CI capacity by avoiding repeated setup and real-time test waits (#24355)
* Reduce repeated PR setup and transcript timing waits; add hosted comparisons * Align parallelism contract with Node-only external rebuild toolchain * Record hosted coverage and launch package, store, and cancellation comparisons * Apply hosted Windows setup savings and remove measured test waits * Keep measured PR package gains and remove completed comparison jobs * Report measured test counts with precise units
This commit is contained in:
@@ -13,6 +13,7 @@ on:
|
||||
- '.github/actions/prepare-linux-package-fixture/**'
|
||||
- 'config/docker/headless-serve-shutdown/**'
|
||||
- 'config/docker/cli-launch-contract/**'
|
||||
- 'config/docker/daemon-shutdown-descendants/**'
|
||||
- 'package.json'
|
||||
- 'pnpm-lock.yaml'
|
||||
- 'pnpm-workspace.yaml'
|
||||
@@ -29,6 +30,7 @@ on:
|
||||
- '.github/actions/prepare-linux-package-fixture/**'
|
||||
- 'config/docker/headless-serve-shutdown/**'
|
||||
- 'config/docker/cli-launch-contract/**'
|
||||
- 'config/docker/daemon-shutdown-descendants/**'
|
||||
- 'config/scripts/ci-cache-warmup-workflow.test.mjs'
|
||||
|
||||
permissions:
|
||||
@@ -121,6 +123,10 @@ jobs:
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
persist-credentials: false
|
||||
- uses: ./.github/actions/prepare-linux-package-fixture
|
||||
with:
|
||||
fixture: daemon-shutdown-descendants
|
||||
save-cache: ${{ github.event_name != 'pull_request' }}
|
||||
- uses: ./.github/actions/prepare-linux-package-fixture
|
||||
with:
|
||||
fixture: headless-serve-shutdown
|
||||
|
||||
+57
-43
@@ -17,6 +17,16 @@ on:
|
||||
description: JSON array of changed specs; empty runs the full suite
|
||||
required: false
|
||||
type: string
|
||||
run_changed_e2e:
|
||||
description: PR detector found specs requiring the general changed-spec lane.
|
||||
required: false
|
||||
type: boolean
|
||||
default: true
|
||||
needs_build:
|
||||
description: PR detector found an Electron consumer requiring build and native cache.
|
||||
required: false
|
||||
type: boolean
|
||||
default: true
|
||||
ssh_source_changed:
|
||||
description: '"true" when the PR touches SSH execution source; gates the Docker-SSH lane'
|
||||
required: false
|
||||
@@ -38,6 +48,7 @@ on:
|
||||
jobs:
|
||||
build:
|
||||
name: build e2e app
|
||||
if: inputs.test_files == '' || github.event_name != 'pull_request' || inputs.needs_build
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 10
|
||||
|
||||
@@ -97,6 +108,7 @@ jobs:
|
||||
# this immutable cache instead of compiling the same ABI concurrently.
|
||||
prepare-native-cache:
|
||||
name: prepare Electron native cache
|
||||
if: inputs.test_files == '' || github.event_name != 'pull_request' || inputs.needs_build
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 15
|
||||
|
||||
@@ -240,7 +252,7 @@ jobs:
|
||||
changed-e2e:
|
||||
name: changed e2e specs
|
||||
needs: [build, prepare-native-cache]
|
||||
if: inputs.test_files != ''
|
||||
if: inputs.test_files != '' && (github.event_name != 'pull_request' || inputs.run_changed_e2e)
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 45
|
||||
|
||||
@@ -271,44 +283,47 @@ jobs:
|
||||
env:
|
||||
TEST_FILES_JSON: ${{ inputs.test_files }}
|
||||
run: |
|
||||
# Why the native IME spec is dropped: it test.skip()s itself without
|
||||
# ORCA_E2E_NATIVE_IBUS_HANGUL, which this lane cannot set because it has no ibus
|
||||
# session. Running it here reported a green skip as coverage.
|
||||
mapfile -t TEST_FILES < <(jq -r '.[] | select(
|
||||
. != "tests/e2e/local-ssh-browser-routing.spec.ts" and
|
||||
. != "tests/e2e/ssh-client-hosted-browser-drop-reconnect.spec.ts" and
|
||||
. != "tests/e2e/pty-input-write-queue-ssh.spec.ts" and
|
||||
. != "tests/e2e/ssh-ai-vault-session-history.spec.ts" and
|
||||
. != "tests/e2e/ssh-codex-display-artifacts-repro.spec.ts" and
|
||||
. != "tests/e2e/ssh-cold-activation-restore.spec.ts" and
|
||||
. != "tests/e2e/ssh-cold-hydration-gap-tab-seeding.spec.ts" and
|
||||
. != "tests/e2e/ssh-docker-five-pane-input-under-flood.spec.ts" and
|
||||
. != "tests/e2e/ssh-docker-bulk-open-freeze-repro.spec.ts" and
|
||||
. != "tests/e2e/ssh-docker-half-open-link.spec.ts" and
|
||||
. != "tests/e2e/ssh-docker-quick-open-large-listing.spec.ts" and
|
||||
. != "tests/e2e/ssh-docker-reconnect-pane-restore.spec.ts" and
|
||||
. != "tests/e2e/ssh-docker-relay-stall-credential.spec.ts" and
|
||||
. != "tests/e2e/ssh-docker-resource-accumulation.spec.ts" and
|
||||
. != "tests/e2e/ssh-docker-transport-drop-recovery.spec.ts" and
|
||||
. != "tests/e2e/ssh-external-image-preview.spec.ts" and
|
||||
. != "tests/e2e/ssh-lost-kill-tab-resurrection.spec.ts" and
|
||||
. != "tests/e2e/ssh-pi-compatible-agent-title.spec.ts" and
|
||||
. != "tests/e2e/ssh-port-forward-lifecycle.spec.ts" and
|
||||
. != "tests/e2e/ssh-reconnect-tab-destruction.spec.ts" and
|
||||
. != "tests/e2e/ssh-restart-tab-accumulation.spec.ts" and
|
||||
. != "tests/e2e/ssh-skill-installation.spec.ts" and
|
||||
. != "tests/e2e/ssh-stale-resume-execution-host-scope.spec.ts" and
|
||||
. != "tests/e2e/ssh-terminal-window-wake-stale-grid-repro.spec.ts" and
|
||||
. != "tests/e2e/terminal-inline-images-ssh.spec.ts" and
|
||||
. != "tests/e2e/ssh-docker-watcher-isolation.spec.ts" and
|
||||
. != "tests/e2e/ssh-terminal-parking.spec.ts" and
|
||||
. != "tests/e2e/terminal-retention-budget.spec.ts" and
|
||||
. != "tests/e2e/ssh-startup-exec-readiness.spec.ts" and
|
||||
. != "tests/e2e/paired-startup-exec-readiness.spec.ts" and
|
||||
. != "tests/e2e/ssh-browser-network-execution-route.docker.unit.test.ts" and
|
||||
. != "tests/e2e/ssh-localhost.spec.ts" and
|
||||
. != "tests/e2e/terminal-ibus-hangul-native.spec.ts"
|
||||
)' <<<"$TEST_FILES_JSON")
|
||||
if [ -f config/scripts/ci-e2e-job-selection.mjs ]; then
|
||||
printf '%s\n' "$TEST_FILES_JSON" | node config/scripts/ci-e2e-job-selection.mjs > "$RUNNER_TEMP/general-e2e-specs"
|
||||
else
|
||||
# Dispatching an older ref retains its existing dedicated-owner exclusions.
|
||||
jq -r '.[] | select(
|
||||
. != "tests/e2e/local-ssh-browser-routing.spec.ts" and
|
||||
. != "tests/e2e/ssh-client-hosted-browser-drop-reconnect.spec.ts" and
|
||||
. != "tests/e2e/pty-input-write-queue-ssh.spec.ts" and
|
||||
. != "tests/e2e/ssh-ai-vault-session-history.spec.ts" and
|
||||
. != "tests/e2e/ssh-codex-display-artifacts-repro.spec.ts" and
|
||||
. != "tests/e2e/ssh-cold-activation-restore.spec.ts" and
|
||||
. != "tests/e2e/ssh-cold-hydration-gap-tab-seeding.spec.ts" and
|
||||
. != "tests/e2e/ssh-docker-five-pane-input-under-flood.spec.ts" and
|
||||
. != "tests/e2e/ssh-docker-bulk-open-freeze-repro.spec.ts" and
|
||||
. != "tests/e2e/ssh-docker-half-open-link.spec.ts" and
|
||||
. != "tests/e2e/ssh-docker-quick-open-large-listing.spec.ts" and
|
||||
. != "tests/e2e/ssh-docker-reconnect-pane-restore.spec.ts" and
|
||||
. != "tests/e2e/ssh-docker-relay-stall-credential.spec.ts" and
|
||||
. != "tests/e2e/ssh-docker-resource-accumulation.spec.ts" and
|
||||
. != "tests/e2e/ssh-docker-transport-drop-recovery.spec.ts" and
|
||||
. != "tests/e2e/ssh-external-image-preview.spec.ts" and
|
||||
. != "tests/e2e/ssh-lost-kill-tab-resurrection.spec.ts" and
|
||||
. != "tests/e2e/ssh-pi-compatible-agent-title.spec.ts" and
|
||||
. != "tests/e2e/ssh-port-forward-lifecycle.spec.ts" and
|
||||
. != "tests/e2e/ssh-reconnect-tab-destruction.spec.ts" and
|
||||
. != "tests/e2e/ssh-restart-tab-accumulation.spec.ts" and
|
||||
. != "tests/e2e/ssh-skill-installation.spec.ts" and
|
||||
. != "tests/e2e/ssh-stale-resume-execution-host-scope.spec.ts" and
|
||||
. != "tests/e2e/ssh-terminal-window-wake-stale-grid-repro.spec.ts" and
|
||||
. != "tests/e2e/terminal-inline-images-ssh.spec.ts" and
|
||||
. != "tests/e2e/ssh-docker-watcher-isolation.spec.ts" and
|
||||
. != "tests/e2e/ssh-terminal-parking.spec.ts" and
|
||||
. != "tests/e2e/terminal-retention-budget.spec.ts" and
|
||||
. != "tests/e2e/ssh-startup-exec-readiness.spec.ts" and
|
||||
. != "tests/e2e/paired-startup-exec-readiness.spec.ts" and
|
||||
. != "tests/e2e/ssh-browser-network-execution-route.docker.unit.test.ts" and
|
||||
. != "tests/e2e/ssh-localhost.spec.ts" and
|
||||
. != "tests/e2e/terminal-ibus-hangul-native.spec.ts"
|
||||
)' <<<"$TEST_FILES_JSON" > "$RUNNER_TEMP/general-e2e-specs"
|
||||
fi
|
||||
mapfile -t TEST_FILES < "$RUNNER_TEMP/general-e2e-specs"
|
||||
if [ "${#TEST_FILES[@]}" -eq 0 ]; then
|
||||
echo "Changed specs are all owned by dedicated lanes."
|
||||
exit 0
|
||||
@@ -417,10 +432,9 @@ jobs:
|
||||
mv test-results "e2e-traces/watcher-isolation"
|
||||
fi
|
||||
|
||||
# Why always(): this lane gates SSH parking/retention plus startup-exec
|
||||
# readiness across live SSH, headed paired, and headless serve topologies.
|
||||
# Keep every SSH journey after a test failure; stop work on superseded commits.
|
||||
- name: Run Docker SSH terminal parking + startup readiness E2E
|
||||
if: always() && matrix.shard == 1
|
||||
if: '!cancelled() && matrix.shard == 1'
|
||||
run: xvfb-run --auto-servernum bash .github/scripts/e2e-with-window-manager.sh env SKIP_BUILD=1 ORCA_E2E_FORWARD_APP_LOGS=1 pnpm run test:e2e:ssh-docker-terminal-parking
|
||||
|
||||
- name: Keep terminal-parking traces
|
||||
@@ -433,7 +447,7 @@ jobs:
|
||||
|
||||
# Separate VMs isolate destructive SSH fixtures while keeping one worker per shard.
|
||||
- name: Run remaining Docker SSH E2E
|
||||
if: always()
|
||||
if: '!cancelled()'
|
||||
run: xvfb-run --auto-servernum bash .github/scripts/e2e-with-window-manager.sh env SKIP_BUILD=1 ORCA_E2E_FORWARD_APP_LOGS=1 pnpm run test:e2e:ssh-docker --shard=${{ matrix.shard }}/4
|
||||
|
||||
- name: Keep remaining-ssh-docker traces
|
||||
|
||||
@@ -51,6 +51,8 @@ jobs:
|
||||
package_windows: ${{ steps.readiness.outputs.reused != 'true' && steps.filter.outputs.package_windows }}
|
||||
e2e_should_run: ${{ steps.e2e_filter.outputs.should_run }}
|
||||
test_files: ${{ steps.e2e_filter.outputs.test_files }}
|
||||
e2e_run_changed: ${{ steps.e2e_filter.outputs.e2e_run_changed }}
|
||||
e2e_needs_build: ${{ steps.e2e_filter.outputs.e2e_needs_build }}
|
||||
ssh_source_changed: ${{ steps.e2e_filter.outputs.ssh_source_changed }}
|
||||
native_ime_source_changed: ${{ steps.e2e_filter.outputs.native_ime_source_changed }}
|
||||
wsl_source_changed: ${{ steps.e2e_filter.outputs.wsl_source_changed }}
|
||||
@@ -74,6 +76,7 @@ jobs:
|
||||
/config/scripts/check-readme-local-links.mjs
|
||||
/config/scripts/pr-code-change-scope.mjs
|
||||
/config/scripts/pr-e2e-source-routing.mjs
|
||||
/config/scripts/ci-e2e-job-selection.mjs
|
||||
/config/scripts/pr-ready-check-reuse.mjs
|
||||
sparse-checkout-cone-mode: false
|
||||
persist-credentials: false
|
||||
@@ -133,6 +136,7 @@ jobs:
|
||||
SSH_SOURCE_CHANGED="$(printf '%s\n' "$CHANGED" | node config/scripts/pr-e2e-source-routing.mjs --ssh-source)"
|
||||
echo "ssh_source_changed=$SSH_SOURCE_CHANGED" >> "$GITHUB_OUTPUT"
|
||||
echo "SSH source changed: $SSH_SOURCE_CHANGED"
|
||||
printf '%s\n' "$TEST_FILES_JSON" | E2E_SSH_SOURCE_CHANGED="$SSH_SOURCE_CHANGED" node config/scripts/ci-e2e-job-selection.mjs --job-outputs >> "$GITHUB_OUTPUT"
|
||||
# Why its own signal: the real-IME lane is a whole ibus session, not a spec, so it must
|
||||
# trigger on IME source rather than on a spec name in some route's list.
|
||||
NATIVE_IME_SOURCE_CHANGED="$(printf '%s\n' "$CHANGED" | node config/scripts/pr-e2e-source-routing.mjs --native-ime-source)"
|
||||
@@ -918,6 +922,12 @@ jobs:
|
||||
restore-keys: |
|
||||
electron-builder-linux-
|
||||
|
||||
- uses: ./.github/actions/prepare-linux-package-fixture
|
||||
id: daemon-fixture-cache
|
||||
background: true
|
||||
with:
|
||||
fixture: daemon-shutdown-descendants
|
||||
|
||||
- uses: ./.github/actions/install-node-dependencies
|
||||
with:
|
||||
native-runtime: electron
|
||||
@@ -930,9 +940,12 @@ jobs:
|
||||
- uses: ./.github/actions/install-mobile-dependencies
|
||||
|
||||
# The checkout must pass without depending on a historical baseline that leaks.
|
||||
- wait: daemon-fixture-cache
|
||||
|
||||
- name: Verify Linux daemon shutdown descendant cleanup
|
||||
env:
|
||||
ORCA_BACKGROUND_LAUNCH: '1'
|
||||
ORCA_DAEMON_SHUTDOWN_FIXTURE_CACHE_IMAGE: ${{ steps.daemon-fixture-cache.outputs.image }}
|
||||
run: node config/scripts/run-daemon-shutdown-descendants-docker.mjs
|
||||
|
||||
# Why --no-file-parallelism: every file here launches a full Electron stack twice, and each
|
||||
@@ -1228,6 +1241,8 @@ jobs:
|
||||
ref: ${{ github.event.pull_request.head.sha }}
|
||||
test_files: ${{ needs.code_paths.outputs.test_files }}
|
||||
ssh_source_changed: ${{ needs.code_paths.outputs.ssh_source_changed }}
|
||||
run_changed_e2e: ${{ needs.code_paths.outputs.e2e_run_changed != 'false' }}
|
||||
needs_build: ${{ needs.code_paths.outputs.e2e_needs_build != 'false' }}
|
||||
|
||||
# Why this is not in verify's needs: it is the first PR-gate run of a harness whose reliability
|
||||
# is only known from nightly main runs (20/20 green, 2026-08-09..2026-08-29, p50 3m25s). It
|
||||
|
||||
Reference in New Issue
Block a user