Repository navigation
ci: run the unit and installer tiers on two runners each - #489
Merged
Merged
Conversation
…t integration tier in parallel With the slow tier rebalanced, the unit tier became the longest job: 8.4 to 14 minutes for 33 worker-minutes of tests, since xdist's default scheduling leaves workers idle while the last tests run. It now uses --dist worksteal and runs on two runners, each about 4 minutes of tests, split by AGENTENV_TEST_SHARD with the unit files' times added to the table. The lockfile and lint checks run on the first shard. The installer tier is 36 worker-minutes, packed evenly on 4 workers, so it runs on two runners, test_plugin_changes.py split by test. The fast integration tier ran its 7 minutes of tests one at a time; it runs them with -n auto --dist loadscope, as make int-test-fast does. Gate jobs keep the unit and installer check names, and every shard uploads its JUnit report for the next refresh. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… the opencode and hermes kill checks Reading /proc/<pid>/stat for a process that exits between the open and the read fails with ESRCH, so the opencode cancel test failed on the kill it was checking for. The gemini and claude_code copies of this helper already treat ProcessLookupError as gone; these two now do too. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Run in parallel it raced: the signal test sends its signal when the run prints the step's line, and under load that comes before the step's command starts, so the command's pid file was never written. The tier's 7 to 10 minutes are under the slow tier's, so running it serially costs the run nothing for now. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ed for The stream test recorded for 0.8 s at 20 fps and asserted at least 10 frames, which a busy machine missed: CodeBuild captured 9. It now also waits, up to 30 s, until the encoder holds 10, so a slow machine records longer instead of failing. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
earakely-scale
added a commit
that referenced
this pull request
Nov 5, 2026
…ions table main's #489 added its timing after this branch removed the test, so the shard table named a file that is gone. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What and why
After #485 the run takes about 12 minutes. The unit and installer tiers don't make use of the runner they're on, and the unit tier's time swings from 8 to 14 minutes.
--dist worksteal, which lets an idle worker take queued tests from the others.AGENTENV_TEST_SHARD, the unit files' times added to the table so the two halves are even (16.7 worker-minutes each).test_plugin_changes.py.test_plugin_changes.pysplit by test (31 and 29 of 60 tests).ProcessLookupError, on the very kill it checks for. Reading/proc/<pid>/statfor a process reaped between the open and the read fails with ESRCH. The gemini and claude_code copies of that helper already treat it as gone, and the opencode and hermes copies now do too.test_computer_recording.py::test_a_stream_of_frames_keeps_each_frames_capture_timecaptured 9 frames where it asserts at least 10: it recorded for a fixed 0.8 s at 20 fps. It now also waits, up to 30 s, until the encoder holds 10, so a busy machine records longer instead of failing.Gate jobs keep the
unitandinstallercheck names, so themainruleset is unaffected. Theinstallergate also passes when the change touches nothing the tier covers, as the skipped job did before. Every unit and installer shard uploads its JUnit report..github/scripts/slow_test_durations.pynow takes all of a run'sjunit-*reports, since the table covers four tiers.Not in this PR: running the fast integration tier in parallel. I tried it, and it exposed a race in
run_bundle_test.py's signal test: under load, the signal arrives before the step's command starts. Its 7 to 10 minutes are under the slow tier's anyway, so it stays serial for now.unitinstallerThe run's length is now set by the slow tier, about 11.5–13 min. Its image-heavy files (
chromium_app_test.py,website_browser_test.py) vary from run to run, and caching those builds is the next step.How it was tested
pytest tst/unit/test_shards.py tst/unit/test_slow_test_durations_script.py: 22 passed. The two fixed test files: 11 passed.🤖 Generated with Claude Code


Confidence Score: 5/5
The PR appears safe to merge; no actionable issues were found.Summary
Splits the unit and installer tiers across two runners while keeping the required check names.
The change since the previous review only adds the recording wait. No actionable new issues or mounted-rule violations were found. No previous review threads were supplied.
Diagram
%%{init: {'theme': 'neutral'}}%% flowchart TD U1["Unit shard 1"] --> U["unit check"] U2["Unit shard 2"] --> U C["Changed paths"] --> I1["Installer shard 1"] C --> I2["Installer shard 2"] I1 --> I["installer check"] I2 --> I C --> I U1 --> J["Separate JUnit reports"] U2 --> J I1 --> J I2 --> JReviews (4) · Last reviewed commit: "test: a streamed recording runs until it..." · Reviewed by Greptile