Skip to content

ci(tests): run test suites in 10 parallel lanes - #1238

Merged
aaronjmars merged 4 commits into
mainfrom
ci/parallel-test-lanes
Oct 17, 2026
Merged

aaronjmars merged 4 commits into
mainfrom
ci/parallel-test-lanes

Conversation

@aaronjmars

@aaronjmars aaronjmars commented Oct 17, 2026 •

Copy link
Copy Markdown
Collaborator

What

  • ci-tests ran its 83 suites as serial steps. They now live in scripts/tests/ci-lanes.txt (<lane> | <name> | <command>) and run as 10 lanes in one GitHub parallel: group (max 10 at once; 10 lanes, not 83 parallel steps, because Blacksmith adds ~0.2s teardown per parallel step).
  • scripts/tests/run_ci_lane.sh <lane> runs every suite in the lane even when one fails, one ::group:: per suite, an ::error annotation naming each failed suite, and a FAILED list at the end of the lane.
  • Coverage guard: the last step (run_ci_lane.sh --check, runs even after a red lane) fails if a scripts/tests/test_* file is in no lane, a listed file is gone, or the lane numbers and workflow steps disagree.
  • .github/scripts/ci-tests-lanes.py rebalances the lanes from a run's suite-time: log lines.
  • Runner unchanged (vars.AEON_RUNNER, Blacksmith). Docs: CONTRIBUTING and the aeon skill's ci.md say where new tests go.

Measured

  • Before (serial, Blacksmith 2 vCPU): 47, 49, 53, 49, 72, 42, 55s, median 49s.
  • Experiment aeon#1237 (10 lanes): 22, 21, 21s.
  • This PR (Blacksmith 2 vCPU, run 38991435448, 3 attempts): 23, 25, 23s. Lanes finish within ~4s of each other (CPU-bound: 10 lanes on 2 vCPU).
  • Failure path proven on a throwaway commit (reverted): run 38991319617 forced test_notify.sh (first suite of lane 7) to exit 3. Lane 7 still ran its other 8 suites, annotated notify integration tests (exit 3), ended with FAILED suites in lane 7 (1 of 9); the other 9 lanes and the coverage check passed.

Risk

A failure shows inside a lane log, not as its own step: the check names the lane, and the annotation plus the FAILED list at the end of the lane name the suite. Suites now run side by side; all use mktemp, and #1237 was green 6/6.

Note: actionlint 1.7.12 does not know parallel: yet (rhysd/actionlint#693); the workflow lints clean with the group flattened.


View with [code]smith Autofix with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need.

The 83 suites ran as serial steps (median 49s on Blacksmith). They now live in
scripts/tests/ci-lanes.txt and run as 10 balanced lanes in one GitHub parallel
group. Each lane runs every suite (one log group each), then fails and names
the suites that failed. A coverage check fails when a scripts/tests/test_* file
is in no lane. .github/scripts/ci-tests-lanes.py rebalances lanes from a run's
timings. Experiment aeon#1237: 21-22s on Blacksmith.
Lanes rebalanced from the first parallel run's suite-time lines (each lane
about 11s of suite time). Each suite's stderr now goes into stdout, so its
lines stay inside that suite's log group instead of drifting into another.
@aaronjmars
aaronjmars merged commit f9ec0bf into main Oct 17, 2026
7 checks passed
@aaronjmars aaronjmars mentioned this pull request Oct 17, 2026
5 tasks done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant