ci: age-filter zombie reaper (>=1h) for multi-runner safety #189

Merged
KofTwentyTwo merged 1 commits from ci/age-filter-multi-runner into develop 2026-05-13 22:33:03 +00:00
KofTwentyTwo commented 2026-05-13 22:01:03 +00:00 (Migrated from github.com)

Summary

Add a 1-hour age filter to the orphan-process cleanup step so sibling self-hosted runners on Grogu don't kill each other's in-flight test processes.

Context

Grogu (24-core / 128 GB) will host 3 self-hosted runners to parallelize the 13-SPM matrix from ~13 min serial down to ~5 min wall-clock. The cleanup step currently kills ANY `xctest` / `swift-test` / `swift-driver` it sees, which means as soon as a second runner runs concurrently, they nuke each other.

Filter

`ps -o etime` produces three formats:

  • `MM:SS` (< 1 hour) — skipped
  • `HH:MM:SS` (≥ 1 hour) — killed
  • `DD-HH:MM:SS` (days) — killed

Real CI jobs complete in <10 min; zombies from interactive Xcode use are typically hours/days old. 1-hour cutoff separates the populations cleanly.

Validation

Tested against synthetic ps output:
```
PID 12345 5m xctest → skip (<1h)
PID 22222 30s swift-test → skip
PID 33333 30m swift-test → skip
PID 44444 50m xctest → skip
PID 11111 1h23m xctest → KILL (≥1h)
PID 67890 1d5h xctest → KILL (days)
```
Only 11111 and 67890 emitted. Single-runner behavior unchanged.

Test plan

  • Merge to develop, watch the resulting CI run.
  • Confirm cleanup step still runs and reports its action.
  • No regression on current Grogu-jarvis single-runner setup.

Closes #188

🤖 Generated with Claude Code

## Summary Add a 1-hour age filter to the orphan-process cleanup step so sibling self-hosted runners on Grogu don't kill each other's in-flight test processes. ## Context Grogu (24-core / 128 GB) will host 3 self-hosted runners to parallelize the 13-SPM matrix from ~13 min serial down to ~5 min wall-clock. The cleanup step currently kills ANY \`xctest\` / \`swift-test\` / \`swift-driver\` it sees, which means as soon as a second runner runs concurrently, they nuke each other. ## Filter \`ps -o etime\` produces three formats: - \`MM:SS\` (< 1 hour) — skipped - \`HH:MM:SS\` (≥ 1 hour) — killed - \`DD-HH:MM:SS\` (days) — killed Real CI jobs complete in <10 min; zombies from interactive Xcode use are typically hours/days old. 1-hour cutoff separates the populations cleanly. ## Validation Tested against synthetic ps output: \`\`\` PID 12345 5m xctest → skip (<1h) PID 22222 30s swift-test → skip PID 33333 30m swift-test → skip PID 44444 50m xctest → skip PID 11111 1h23m xctest → KILL (≥1h) PID 67890 1d5h xctest → KILL (days) \`\`\` Only 11111 and 67890 emitted. Single-runner behavior unchanged. ## Test plan - [ ] Merge to develop, watch the resulting CI run. - [ ] Confirm cleanup step still runs and reports its action. - [ ] No regression on current Grogu-jarvis single-runner setup. Closes #188 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Sign in to join this conversation.