Repository navigation
Description
Why
CI's Linux test leg ends every run, and it is bound by the runner's four cores (#251). Making rows parallel doesn't shorten it, because the SQL Server and PostgreSQL containers share those cores with the tests. On #252's first run, parallel EF Core rows moved the Linux test step from 9m 28s to 9m 17s while the rows' summed time more than doubled. The profile on #251 found no CPU to cut either: a CMTK0003 sweep row costs its own file, and the remaining part, the verifier, is not worth replacing with a matcher of our own.
What is left that keeps every test is more cores. In #252's first run (41191607858), the Linux leg's projects were:
| Project | Wall |
|---|---|
CodoMetis.TypeKit.Analyzers.Tests |
468 s |
CodoMetis.TypeKit.EntityFrameworkCore.Tests |
443 s |
CodoMetis.TypeKit.AspNetCore.Tests |
239 s |
CodoMetis.TypeKit.Conventions.Tests |
172 s |
CodoMetis.TypeKit.Generators.Tests |
97 s |
| the other eight | 11-53 s each |
Proposal
- Two Linux test jobs instead of one, each running a solution filter of test projects: for example
test/Shard1.slnfwith the analyzer tests andtest/Shard2.slnfwith EF Core and the rest. Split them by measured time, not by guess. Each job checks out, restores and builds only its filter's projects, and gets four cores of its own. The Windows and macOS legs stay one job each. The prose suite stays as it is. - Every test project in exactly one shard, held by a conventions test in the way
ProseReaderTestsholdstest/Prose.slnf. A new test project in neither filter would otherwise go untested on Linux without anything failing. tools/CiLaneswrites the matrix with its shards, and its gate judges them.Gate.Matricesand thelegsoutput learn the new shape, with CiLanes.Tests rows for it, each shown failing first.- The release (
release.ymlcallsdotnet.yml) runs both shards, andReleaseWiringTestsfollow. - A decision record amending 0113's lanes. It takes the next free number when the work starts: on 2026-10-31, 0125 and 0126 were merged and 0127 to 0130 were handed to CI: a change to one tool or test project runs the test projects it reaches, not the whole solution #268, Generators: one signature identity for every hand-written-member check, the generated members derived from the aspects and marked by an attribute #239, CMTK0009: report LeftJoin, RightJoin and FullJoin whose unmatched side is a no-default struct #261 and CMTK0005: report CollectionsMarshal.SetCount on a list of value objects #229, so check
design/adr/on the release branch and the open PRs first.
Done when
The Linux leg's job time is measured in this issue from three runs before and three after. Every test project runs in exactly one shard, shown by the conventions test failing on a seeded omission. The gate fails a run where a shard was skipped or cancelled. Expected, not measured: about 8-9 minutes for the Linux leg instead of about 12, since each shard repeats the roughly 2.5-minute checkout and build.
Activity