fix(ci): cancel long rust build subprocesses (#3942)

This commit is contained in:
Steven Enamakel
2026-06-22 13:36:00 -07:00
committed by GitHub
parent 2412ec7afc
commit 47a726b1dd
4 changed files with 48 additions and 24 deletions
+19 -18
View File
@@ -14,6 +14,8 @@ permissions:
env:
NPM_CONFIG_STORE_DIR: .pnpm-store
# Keep only the newest run per PR/branch. Long Rust/Tauri build commands must
# run through scripts/ci-cancel-aware.sh so cancellation reaches descendants.
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.head_ref || github.ref }}
cancel-in-progress: true
@@ -56,11 +58,9 @@ jobs:
- 'app/vite.config.*'
- 'app/tailwind.config.*'
- 'app/postcss.config.*'
- 'scripts/ci-cancel-aware.sh'
i18n:
- '.github/workflows/pr-ci.yml'
- 'app/src/**'
- 'scripts/ci-cancel-aware.sh'
rust-core:
- '.github/workflows/pr-ci.yml'
- 'Cargo.toml'
@@ -69,6 +69,7 @@ jobs:
- 'src/**'
- 'tests/**'
- 'scripts/ci-cancel-aware.sh'
- 'scripts/test-rust-e2e.sh'
- 'scripts/test-rust-with-mock.sh'
rust-tauri:
- '.github/workflows/pr-ci.yml'
@@ -116,7 +117,7 @@ jobs:
pnpm-store-${{ runner.os }}-
- name: Install dependencies
run: bash scripts/ci-cancel-aware.sh pnpm install --frozen-lockfile
run: pnpm install --frozen-lockfile
- name: Save pnpm store cache
if: always() && steps.pnpm-cache.outputs.cache-hit != 'true'
@@ -126,17 +127,17 @@ jobs:
key: ${{ steps.pnpm-cache.outputs.cache-primary-key }}
- name: Type check TypeScript files
run: bash scripts/ci-cancel-aware.sh pnpm --filter openhuman-app compile
run: pnpm --filter openhuman-app compile
env:
NODE_ENV: test
- name: Check Prettier formatting
run: bash scripts/ci-cancel-aware.sh pnpm --filter openhuman-app format:check
run: pnpm --filter openhuman-app format:check
env:
NODE_ENV: test
- name: Run ESLint
run: bash scripts/ci-cancel-aware.sh pnpm --filter openhuman-app lint
run: pnpm --filter openhuman-app lint
env:
NODE_ENV: test
@@ -164,7 +165,7 @@ jobs:
pnpm-store-${{ runner.os }}-
- name: Install dependencies
run: bash scripts/ci-cancel-aware.sh pnpm install --frozen-lockfile
run: pnpm install --frozen-lockfile
- name: Save pnpm store cache
if: always() && steps.pnpm-cache.outputs.cache-hit != 'true'
@@ -174,7 +175,7 @@ jobs:
key: ${{ steps.pnpm-cache.outputs.cache-primary-key }}
- name: Verify i18n coverage (missing / extra / drifted keys across locales)
run: bash scripts/ci-cancel-aware.sh pnpm i18n:check
run: pnpm i18n:check
rust-quality:
name: Rust Quality (fmt, clippy)
@@ -207,7 +208,7 @@ jobs:
shared-key: pr-rust-quality
- name: Check Rust formatting
run: bash scripts/ci-cancel-aware.sh cargo fmt --all -- --check
run: cargo fmt --all -- --check
- name: Run clippy (core crate)
run: bash scripts/ci-cancel-aware.sh cargo clippy -p openhuman
@@ -258,7 +259,7 @@ jobs:
- name: Install dependencies
if: steps.playwright-artifact-cache.outputs.cache-hit != 'true'
run: bash scripts/ci-cancel-aware.sh pnpm install --frozen-lockfile
run: pnpm install --frozen-lockfile
- name: Save pnpm store cache
if: always() && steps.pnpm-cache.outputs.cache-hit != 'true'
@@ -277,7 +278,7 @@ jobs:
if: steps.playwright-artifact-cache.outputs.cache-hit != 'true'
run: |
set -euo pipefail
bash scripts/ci-cancel-aware.sh pnpm --filter openhuman-app test:e2e:web:build
pnpm --filter openhuman-app test:e2e:web:build
RUST_HOST_TRIPLE="$(rustc -vV | awk '/^host: / { print $2 }')"
WEB_CORE_TARGET_DIR="target/e2e-web-${RUST_HOST_TRIPLE}"
@@ -335,7 +336,7 @@ jobs:
pnpm-store-${{ runner.os }}-
- name: Install dependencies
run: bash scripts/ci-cancel-aware.sh pnpm install --frozen-lockfile
run: pnpm install --frozen-lockfile
- name: Save pnpm store cache
if: always() && steps.pnpm-cache.outputs.cache-hit != 'true'
@@ -345,7 +346,7 @@ jobs:
key: ${{ steps.pnpm-cache.outputs.cache-primary-key }}
- name: Run Vitest with coverage
run: bash ../scripts/ci-cancel-aware.sh pnpm test:coverage
run: pnpm test:coverage
working-directory: app
env:
NODE_ENV: test
@@ -562,7 +563,7 @@ jobs:
shared-key: pr-rust-core
- name: Install dependencies
run: bash scripts/ci-cancel-aware.sh pnpm install --frozen-lockfile
run: pnpm install --frozen-lockfile
- name: Save pnpm store cache
if: always() && steps.pnpm-cache.outputs.cache-hit != 'true'
@@ -577,7 +578,7 @@ jobs:
touch app/.env
- name: Run Rust E2E suite
run: bash scripts/ci-cancel-aware.sh pnpm test:rust:e2e
run: pnpm test:rust:e2e
env:
RUST_BACKTRACE: "1"
@@ -627,7 +628,7 @@ jobs:
pnpm-store-${{ runner.os }}-
- name: Install JS dependencies (test harness)
run: bash scripts/ci-cancel-aware.sh pnpm install --frozen-lockfile
run: pnpm install --frozen-lockfile
- name: Save pnpm store cache
if: always() && steps.pnpm-cache.outputs.cache-hit != 'true'
@@ -653,14 +654,14 @@ jobs:
chmod +x target/e2e-web-*/debug/openhuman-core
- name: Install Playwright Chromium headless shell
run: bash scripts/ci-cancel-aware.sh pnpm --filter openhuman-app exec playwright install chromium-headless-shell
run: pnpm --filter openhuman-app exec playwright install chromium-headless-shell
- name: Run Playwright web E2E suite (shard ${{ matrix.shard }}/4)
env:
OPENHUMAN_WORKSPACE: ${{ runner.temp }}/openhuman-playwright-workspace
run: |
mkdir -p "$OPENHUMAN_WORKSPACE"
bash scripts/ci-cancel-aware.sh bash app/scripts/e2e-web-session.sh \
bash app/scripts/e2e-web-session.sh \
--shard=${{ matrix.shard }}/4
- name: Upload Playwright E2E failure artifacts
+1 -1
View File
@@ -24,4 +24,4 @@ fi
echo "Building web E2E bundle with backend ${VITE_BACKEND_URL}"
pnpm run build:web
echo "Building standalone openhuman-core for web E2E into ${E2E_WEB_CORE_TARGET_DIR}..."
CARGO_TARGET_DIR="$E2E_WEB_CORE_TARGET_DIR" cargo build --manifest-path "$REPO_ROOT/Cargo.toml" --bin openhuman-core
CARGO_TARGET_DIR="$E2E_WEB_CORE_TARGET_DIR" "$REPO_ROOT/scripts/ci-cancel-aware.sh" cargo build --manifest-path "$REPO_ROOT/Cargo.toml" --bin openhuman-core
+26 -3
View File
@@ -10,6 +10,7 @@ fi
OS_NAME="$(uname -s 2>/dev/null || echo unknown)"
CHILD_PID=""
RECEIVED_SIGNAL=""
CHILD_OWNS_PROCESS_GROUP=0
is_windows_shell() {
case "$OS_NAME" in
@@ -35,6 +36,10 @@ terminate_tree_term() {
return
fi
if [ "$CHILD_OWNS_PROCESS_GROUP" = "1" ]; then
kill -TERM -- "-$pid" 2>/dev/null || true
fi
local descendants=""
descendants="$(collect_descendants_unix "$pid")"
if [ -n "$descendants" ]; then
@@ -53,6 +58,10 @@ terminate_tree_kill() {
return
fi
if [ "$CHILD_OWNS_PROCESS_GROUP" = "1" ]; then
kill -KILL -- "-$pid" 2>/dev/null || true
fi
local descendants=""
descendants="$(collect_descendants_unix "$pid")"
if [ -n "$descendants" ]; then
@@ -103,19 +112,33 @@ cleanup() {
return "$status"
}
start_child() {
if ! is_windows_shell && command -v setsid >/dev/null 2>&1; then
setsid "$@" &
CHILD_OWNS_PROCESS_GROUP=1
else
"$@" &
CHILD_OWNS_PROCESS_GROUP=0
fi
CHILD_PID=$!
}
trap 'forward_cancel INT' INT
trap 'forward_cancel TERM' TERM
trap 'forward_cancel HUP' HUP
trap cleanup EXIT
echo "[ci-cancel-aware] exec: $(printf '%q ' "$@")" >&2
"$@" &
CHILD_PID=$!
start_child "$@"
set +e
wait "$CHILD_PID"
status=$?
set -e
CHILD_PID=""
# A trapped cancellation can interrupt wait before the child exits. Keep
# CHILD_PID set so the EXIT cleanup can escalate from TERM to KILL.
if ! kill -0 "$CHILD_PID" 2>/dev/null; then
CHILD_PID=""
fi
exit "$status"
+2 -2
View File
@@ -133,9 +133,9 @@ echo "[rust-e2e] Running ${#SUITES[@]} suite(s) serially."
for suite in "${SUITES[@]}"; do
if [ "${#EXTRA_ARGS[@]}" -gt 0 ]; then
echo "[rust-e2e] cargo test --manifest-path Cargo.toml --test $suite -- ${EXTRA_ARGS[*]}"
cargo test --manifest-path Cargo.toml --test "$suite" -- "${EXTRA_ARGS[@]}"
"$SCRIPT_DIR/ci-cancel-aware.sh" cargo test --manifest-path Cargo.toml --test "$suite" -- "${EXTRA_ARGS[@]}"
else
echo "[rust-e2e] cargo test --manifest-path Cargo.toml --test $suite"
cargo test --manifest-path Cargo.toml --test "$suite"
"$SCRIPT_DIR/ci-cancel-aware.sh" cargo test --manifest-path Cargo.toml --test "$suite"
fi
done