Repository navigation
ci: Run mutation testing in parallel and gate merges through CI gate - #237
Merged
Merged
Conversation
Stryker was ~72% of the single Build & Test job, and the Docker builds waited behind it, so the required checks took ~12 min. Checks (build, test, coverage, format, helper scripts, schema) and Mutation now run in parallel; PR Docker builds follow Checks and finish long before Stryker. Expected PR gate: ~8.5 min. - CI gate (if: always()) needs Checks, Mutation and Docker; its rule lives in scripts/ci-gate.sh, tested by ci-gate.test.sh. A skipped required check counts as passing on GitHub, so every need must succeed; only the PR Docker builds may be skipped, and only outside pull requests. - Images are pushed only by Publish image, after CI gate, so no edge, sha, version or latest tag can exist for a commit whose checks or mutation score failed. Jobs downstream of the gate check needs.<job>.result explicitly, because the implicit success() also sees the transitively skipped PR Docker job. - Badges, high-water mark and Pages move to a master-only publish job, the only job holding contents: write; the badge and mark payloads travel from Mutation as the mutation-state artifact. - Schema diagram no longer waits for anything. - cancel-in-progress applies to pull requests only, so every master commit finishes its pushes and its high-water advance. Considered and rejected: Checks/Mutation as direct required checks (every job rename becomes a protection change), keeping the name Build & Test, letting Docker push right after Checks, a separate format job, and NuGet caching (restore is ~5 s, setup-dotnet caching needs lock files). Requires swapping the required checks to "CI gate" and "CodeQL" immediately before merging. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
# Conflicts: # graphify-out/GRAPH_REPORT.md # graphify-out/graph.json
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.
Why
Stryker was ~72% of the single
Build & Testjob (7m04s–7m30s of ~10m20s), and both Docker builds waited behind it, so the required checks took ~12 min.What
ChecksMutationDocker — API/Workerpush_to_registryChecks— build only, no pushCI gateif: always()Checks,Mutation,DockerPublish image — API/Workerv*tags, dispatch withpush_to_registryCI gatePublish quality reportsChecks,Mutation(runs even if the mutation gate fails)Deploy quality reports to PagesPublish quality reportsSchema diagramCI gate, on master and tags alike.scripts/ci-gate.sh(tested byci-gate.test.sh, test-first) holds the gate's rule. GitHub treats a skipped required check as passing, so every need must succeed. The one exception is the PR-only Docker build, which may be skipped outside pull requests.needs.<job>.resultexplicitly. The implicitsuccess()also sees the transitively skipped PR Docker job, so without the explicit check they would be skipped on every push.contents: writeonly exists in the master-only publish job. PR jobs get a read token.cancel-in-progressapplies to PRs only, so every master commit finishes its image push and high-water advance.Considered and rejected:
Checks/Mutationas direct required checks (every job rename would need a protection change), keeping the nameBuild & Test, letting Docker push right afterChecks, a separate format job, and NuGet caching (restore is ~5 s, andsetup-dotnetcaching needs lock files).This PR no longer reports
Build & Test, so it stays blocked until the required checks are swapped. Immediately before merging, once every check on this PR is green:Open PRs (#236, #228, #229) pick up the new workflow when they are next brought up to date, which
strictalready forces.Verification
ci-gate.test.sh./code-review: no correctness findings. The dispatch smoke-build regression it flagged is fixed.🤖 Generated with Claude Code