Repository navigation
GH-5125 LocalGate: every CI suite on one box through Bobcat's Gate - #5246
Merged
Merged
Conversation
./build.sh LocalGate builds once (Release, one generated .slnx per framework), runs the 62 test projects the CI workflows run as units of one Bobcat gate -- longest first, under one worker budget, one track per Docker service, a database of its own for each suite that allows it -- then the gates that are not test hosts: CICommandLineSmoke, CIAotSmoke, BobcatSamples, CICodegenTest, CICodegenDrift. - LocalGateSuites runs the suites alone; --gate-only and --gate-workers narrow it. - configureSupervisor/workerFactoryFor factored out of runSupervised, so a gate unit is configured exactly as its CI target is. - CICommandLineSmoke: command-line.yml's describe-handlers and event-model checks as a target; the workflow now calls it. - VerifyLocalGateCoverage (in ./build.sh ci): every test project in wolverine.slnx is a gate suite or in NotGated with a reason, and build/gates.json is current. - Configuration defaults to Release when LocalGate/LocalGateSuites is invoked. Measured: green, 43m52s in all; suites 40m03s against 3h09m one after another. 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.
Closes #5125.
./build.sh LocalGateruns what the CI workflows run (tests.yml, dotnet.yml, http.yml, fsharp.yml, command-line.yml, bobcat-samples.yml) on one box, through Bobcat's Gate (Bobcat.Supervisor 1.0.0). It builds once, runs every test suite as a unit of one gate (longest first, one track per Docker service), then the gates that aren't test hosts.What it does
dotnet buildper framework over a generated.slnxof the selected test projects (artifacts/local-gate/).AwaitDockerServices). Then it runs 62 suites as units of one gate under one worker budget (default half the cores). Each unit's supervisor is configured exactly as its CI target's is (configureSupervisor, factored out ofrunSupervised). Each unit leaves its ledger asartifacts/test-ledger/LocalGate.*.json.LocalGatethen runs the extras as the ordinary targets they are:CICommandLineSmoke,CIAotSmoke,BobcatSamples, thenCICodegenTestandCICodegenDrift. Drift goes last because it regenerates the tree that codegen-test wipes../build.sh LocalGateSuitesruns the suites alone;--gate-only <name>...runs a slice;--gate-workers Nsets the budget.Isolation: the tracks
A track is held by one unit at a time. What collides on a shared server is names, not the server:
wolverine_gate_<project>. It's recreated when the unit starts and handed over asConnectionStrings__postgres/ConnectionStrings__sqlserver, whichServers.csreads first. That suite holds no track.tenant1-4,db1-3,players,things, …) run against the default database as in CI and hold thepostgresql/sqlservertrack: MartenTests, PostgresqlTests, PersistenceTests, both EF suites, PolecatTests.wolverine_w*lanes.mqtt-broker-ports: both MQTT suites host a broker on 1883/1884.cosmos-emulator: a Testcontainers emulator per suite.ravendb.Also in this PR
CICommandLineSmoke(build/CommandLineSmoke.cs): command-line.yml's describe-handlers and event-model checks, moved out of inline shell into a target. The workflow now calls it, so CI and the gate run the same checks.dotnet testin that workflow, which is unchanged.VerifyLocalGateCoverage(now part of./build.sh ci) fails in two cases:wolverine.slnxis in neither the table inbuild/LocalGate.csnor itsNotGatedlist.build/gates.json, which./build.sh LocalGateManifestgenerates from the same table, is stale.Configurationis Release wheneverLocalGateorLocalGateSuitesis invoked, unless--configurationis given, so the extras build like CI too. Everywhere else it is unchanged.CICodegenTestgetsAfter(...)andProceedAfterFailure;CICodegenDriftgetsAfter(CICodegenTest).ProceedAfterFailure, so one red extra doesn't skip the rest..claude/docs/test_gates.mdandCLAUDE.md.Not gated (in no workflow)
19 test projects run in no CI workflow, so they're listed in
NotGatedwith their reasons:*.LeaderElectionsuites for Postgres, SQL Server, MySQL and Oracle;That they run nowhere is worth a separate look.
Measured
./build.sh LocalGateon an 18-core M-series Mac (128 GB), default 9-worker budget, first run, so no recorded durations yet:serverless_with_outbox_local_messages_5046_on_sqlserver. It ran while SqlServerTests had 4 lanes busy on the same server.postgresqltrack chain, about 40m: PostgresqlTests 10m, MartenTests 14m, EfCoreTests 6m, EfCoreTests.MultiTenancy 7m, PersistenceTests 3m..bobcat/gate-durations.json. That puts ASB first, so thepostgresqlchain sets the wall clock.Known gaps
.nuke/parameters.json'snet9.0, CI's EF Core 10 job (CIEfCoreNet10) is covered only by--framework all/--framework net10.0.postgresql/sqlservertracks. Moving their fixed names under the suite's database (the wayLaneDatabasesdoes for SqlServerTests) would let them overlap.🤖 Generated with Claude Code