CI Bench

Workload · CI Bench v1

cli workload

Median time runs from 140 s (Vitko Runners (warm starts + test splitting)) to 368 s (GitHub-hosted runners (ubuntu-latest, 2 vCPU)); GitHub-hosted (ubuntu-latest) takes 368 s.

Lowest median time
140 s
Vitko Runners (warm starts + test splitting)
GitHub-hosted (ubuntu-latest): 368 s
Slowest median
368 s
GitHub-hosted runners (ubuntu-latest, 2 vCPU)
2.6× the lowest
Lowest cost, managed
$0.0078
Ubicloud
mean per job
Failed runs
0
no failed runs
of 270 measured runs

Median time

Seconds from start to finish · lower is better
Vitko Runners (warm starts + test splitting)
140 s
GitHub-hosted larger runner (4 vCPU)
192 s
Vitko Runners
272 s
Blacksmith
286 s
Self-hosted runners on Google Cloud
310 s
RunsOn
327 s
Self-hosted runners on AWS (one VM per job)
357 s
Ubicloud
359 s
GitHub-hosted (ubuntu-latest)
368 s

Table

Ordered by median time. Self-hosted options are priced all-in at 100,000 jobs a month. Green marks the lowest median time and the lowest cost among the managed runners.
ConfigurationMedianp95Queue p50Queue p95CostOK
Vitko Runners (warm starts + test splitting)140 s145 s1 s2 s$0.01230 of 30
GitHub-hosted larger runner (4 vCPU)192 s198 s3 s3 s$0.04530 of 30
Vitko Runners272 s326 s1 s2 s$0.009730 of 30
Blacksmith286 s323 s8 s9.5 s$0.02030 of 30
Self-hosted runners on Google Cloud310 s326 s1 s2 s$0.01730 of 30
RunsOn327 s334 s18 s21 s$0.004130 of 30
Self-hosted runners on AWS (one VM per job)357 s398 s68 s104.7 s$0.01430 of 30
Ubicloud359 s429 s20 s25.1 s$0.007830 of 30
GitHub-hosted runners (ubuntu-latest, 2 vCPU)368 s382 s3 s3.5 s$0.03930 of 30

The job

  • Project: cli/cli at v2.102.0 (fc4b137cdef0a6bd28fd461b7cf9c84a5812a8cd), licence MIT. Fetched at run time, not vendored.
  • Upstream job: .github/workflows/go.yml, job build (ubuntu-latest).
  • Benchmark workflow: .github/workflows/wl-cli.yml.

Portability edits (identical for every provider)

  • One matrix cell (Linux).
  • GOFLAGS=-count=1: the same commit runs every time, so Go's test-result cache would skip every test. Module and build caches are kept.
  • Track B (split tests) only: the attestation tests that call the public Sigstore services (the integration-tagged tests under pkg/cmd/attestation: TestLiveSigstoreVerifier*, TestVerifyAttestations, TestVerifyIntegration*, TestNewInspectCmd_PrintOutputJSONFormat, TestChooseVerifier*) are skipped in the split step and run unsplit in the following step of the same job, because split parts have no network. The job runs the same tests as the unsplit arms.

suite/cli holds the workflow and notes.