What a day of CI actually costs, before the move to our own machines and after every improvement since. Real bills from GitHub and AWS, normalized per run and per merge.
Measured 2026-10-04 · window Sep 22 – Oct 4 · gross cost, before any credits · sources at the bottom · Oct 4 (*) is a partial Sunday and is shown but not used in any conclusion
AnswerDaily billPer runWhat moved the numberThin queueGap to targetMethod and sources
CI is about 2.6x cheaper per run than on GitHub-hosted runners, and about 2.8x cheaper per merge. A full weekday of CI cost $738 on GitHub (Sep 22–26 average). The same volume on our machines, at Friday Oct 3's rate, costs about $281. The earlier "$203 a day, flat" figure was after AWS credits; these are the real numbers.
Grey = GitHub Actions hosted-runner charges (gross, from GitHub's billing API). Purple = the CI share of the AWS bill: total AWS gross minus the $53/day the product itself costs with no CI on AWS (median of Sep 22–28). Dashed lines mark the move to AWS machines (Sep 29), the merge queue (Oct 1) and the thin queue (Oct 4, 08:22 UTC).
| Period | Days | CI $/day | CI runs/day | $ per run | $ per merge |
|---|---|---|---|---|---|
| GitHub-hosted (before) | Sep 22–26, weekdays | $738 | 2,489 | $0.296 | $2.52 |
| Just moved to AWS | Sep 29–30 | $511 | 3,656 | $0.140 | $1.36 |
| Merge queue + 64-core | Oct 1–2 | $573 | 4,900 | $0.117 | $1.12 |
| All improvements (after) | Oct 3, Fri | $413 | 3,656 | $0.113 | $0.88 |
| Sunday Oct 4 * | Oct 4, partial | $69 | 1,233 | $0.056 | $0.49 |
"CI runs" = runs of the main CI workflow (ci.yml), all triggers. Oct 2 includes the 64-core machines running the full suite on every merge-queue train; that is what the thin queue removed.
Traffic varies a lot by day (1,200 to 5,400 CI runs), so the per-run number is the fair comparison. It fell by about half the day we moved to AWS, and has drifted down since as more of the fleet ran on spot.
A day of EC2 cost is runs × work per run × price per unit of work. Each improvement maps to one factor.
| Day | CI runs | vCPU-hours per run | $ per vCPU-hour | Spot share of $ | 64-core share of work | Queue runs per merge | EC2 $ |
|---|---|---|---|---|---|---|---|
| 09/29 | 3,511 | 2.5 | $0.0278 | 33% | 0% | 0.0 | $243 |
| 09/30 | 3,802 | 2.7 | $0.0333 | 31% | 0% | 0.1 | $339 |
| 10/01 | 4,409 | 2.7 | $0.0253 | 63% | 0% | 1.2 | $299 |
| 10/02 | 5,390 | 5.1 | $0.0220 | 39% | 49% | 5.1 | $609 |
| 10/03 | 3,656 | 4.9 | $0.0181 | 58% | 54% | 2.0 | $324 |
| 10/04 * | 1,233 | 3.8 | $0.0143 | 93% | 59% | 2.7 | $67 |
Even with all four, a weekday lands near $150–200 of CI, not $65. Reaching $65 needs fewer runs per PR, not cheaper machines. That is a product decision, not a tuning one.
| Number | Source | Label |
|---|---|---|
| GitHub $/day, hosted minutes | GitHub billing usage API, org PropFlow-Technologies, product=actions, gross amount, by day | HARD |
| AWS $/day by service, instance type, purchase type, region | AWS Cost Explorer, unblended cost, RECORD_TYPE Credit/Refund excluded, daily | HARD (Oct 4 partial; Cost Explorer lags some hours) |
| CI share of AWS | AWS total gross minus $53/day product baseline (median of Sep 22–28, when no CI ran on AWS) | ESTIMATE |
| CI runs, merge-queue runs per day | GitHub Actions API, workflow ci.yml, counted in 6-hour windows (the API caps a single count at 2,500) | HARD |
| Merged PRs per day | GitHub search API, is:merged merged:DAY | HARD |
| vCPU-hours | Cost Explorer instance hours × vCPUs of the instance size | HARD |
| Weekday projection | Oct 3 cost per run × GitHub-era weekday run volume | ESTIMATE |
Why gross: AWS credits ($5k pool) paid most of September and part of October, so the net bill looked like $0 before Oct 1 and small after. Credits are a one-time offset, not a cost reduction. Raw pulls are kept on the Mac mini under /tmp/cistudy for this session. Timeline of the changes themselves: CI/CD architecture, CI rethink.