ci: start independent checks in parallel - #233
Conversation
Full CI-runner investigation and outcomeThis records the path from “CI is taking too long” to the two concrete changes in this PR. The original option analysis is in PR #219's runner comment, and the disposable experiment is preserved in The problem and initial candidate setThe expensive path was the macOS-hosted iOS/snapshot work. At the time of the investigation, the representative snapshot job median was about 26.5 minutes. The snapshot suite is deliberately serial within a runner: UIKit and simulator-global state make concurrent captures corrupt one another, and the previous parallel-testing experiment produced 24+ false mismatches while running 1.2–3× slower. Faster hardware can improve compilation, linking, rendering, PNG work, and setup, but cannot remove deliberate settle windows or safely make those captures concurrent in one host process. The initial comparison was:
The working preference was to benchmark Depot M4 first on price/performance, then GitHub XLarge as the lowest-friction controlled experiment. Cirrus was potentially interesting only at sustained usage, self-hosting was explicitly out, and MacStadium was a capable but enterprise-shaped last resort rather than the only theoretical option. Account and safety setupGitHub and Depot's useful macOS paths both pushed us toward an organization, so we created the temporary The organization was deliberately disposable. We made the public
The harness landed in benchmark PR #1. During setup, current provider availability invalidated part of the original research: Cirrus CI shut down on June 1, 2026, and Cirrus Runners was no longer accepting new customers. Benchmark PR #2 removed the dead Cirrus configuration while retaining GitHub standard, GitHub XLarge, and Depot targets. What the probes actually measuredThe complete report is Known-good GitHub control. The The 38-image smoke run queued for 8 seconds and passed all 3 selected suites / 38 images without changing references. It took 15m58s end to end. The snapshot step itself took 15m07s, approximately:
About 69% of the snapshot step passed before the selected tests even began. The important finding was therefore that observed queueing—7–8 seconds—was not the source of the delay. GitHub XLarge. The Depot. Depot's current macOS 26 image advertised Xcode 26.x only, so it failed the same compatibility requirement before installation. We did not install the Depot GitHub app and did not create an account or start a trial. Cirrus. It was not benchmarkable: Cirrus CI had shut down and Cirrus Runners was closed to new customers. No account or charge was created. MacStadium/Orka and self-hosting. We did not provision either. MacStadium remained technically capable of giving us controlled Apple Silicon images, but doing so would buy and operate a fleet platform to solve one repository's compatibility window. A personal/self-hosted Mac remained contrary to the explicit maintenance and security constraint, especially for a public repository receiving fork PRs. No paid candidate was renderer-compatible, so there was deliberately no full 381-image paid comparison and no evidence supporting a runner migration. The recommendation was to keep The canonical workflow also already splits the image suite into two duration-balanced matrix shards on independent standard runners. Moving those existing shards to separate runners was therefore not an unclaimed optimization. Adding more tests will still grow execution time; future extra shards can trade more runner/setup overhead for less test wall time, but the large duplicated cold setup makes improving that path valuable regardless of suite growth. Billing and cleanup stateThe experiment's recorded direct costs were:
After the probe, the organization Actions budget was restored to $0 with “stop usage” enabled. No Depot or Cirrus integration/trial was installed. The temporary organization currently exists to retain the public benchmark fork and its evidence until the paid-plan downgrade is complete. This PR puts the cleanup into the durable root backlog: after September 9, preserve the final report in the canonical repository if it is still useful, verify the organization is on Free with no billable usage or installed integrations, then delete What we changed immediatelyThe cold-path recommendation initially sounded unsatisfying because a lot of that time is simply waiting on builds, and the test corpus will continue to grow. While filing the cleanup TODO, though, we found one avoidable serialization point in the canonical workflow: Commit The first post-change CI run demonstrated the new graph: SwiftFormat, iOS tests, snapshot shard 1, and macOS tests all started at So the end state is:
|
Summary
kve-stuffbenchmark organization after its GitHub Team downgradeWhy
The format job was adding a serial startup stage to every expensive CI path even though those checks do not consume its output. The temporary benchmark infrastructure also needs an explicit cleanup task once its paid plan ends.
Testing
git diff --checkruby -e 'require "yaml"; YAML.load_file(".github/workflows/ci.yml", aliases: true)'