vercel/next.js - GitHub Actions cost & CI smells

From the depmedic OSS benchmark dataset. Source: public workflow YAML in vercel/next.js/.github/workflows.

Workflows
37
Per-run $ (modeled)
$4.10
Monthly $ @ 30/day
$3,686.4
ci-doctor findings
166
Numbers are modeled: 8 minutes per priced job, 30 runs per day per workflow, 30-day month, GitHub-hosted runner rate sheet. vercel/next.js's real run frequency is unknown to me. Smells, however, are real - they come from parsing the actual YAML.

Findings by rule

RuleHits
missing-timeout56
missing-cache30
missing-permissions28
matrix-overcommit20
deprecated-action17
artifact-no-retention11
fail-fast-true1
pinned-action-sha1

Per-workflow breakdown

Workflow Jobs Per-run $ Findings
build_and_deploy.yml 9 $0.58 27
test_e2e_deploy_release.yml 8 $0.58 13
build_and_test.yml 49 $0.38 26
pull_request_stats.yml 4 $0.26 6
turbopack-benchmark.yml 3 $0.19 3
integration_tests_reusable.yml 6 $0.13 4
retry_deploy_test.yml 2 $0.13 2
retry_test.yml 2 $0.13 2
rspack-update-tests-manifest.yml 2 $0.13 5
sync_backport_canary_release.yml 2 $0.13 4
test_examples.yml 1 $0.13 2
turbopack-update-tests-manifest.yml 2 $0.13 5
code_freeze.yml 1 $0.06 3
create_release_branch.yml 1 $0.06 3
graphite_ci_optimizer.yml 1 $0.06 2
issue_lock.yml 1 $0.06 1
issue_stale.yml 1 $0.06 2
issue_wrong_template.yml 1 $0.06 3
popular.yml 1 $0.06 3
pr_ci_comment.yml 1 $0.06 2
pull_request_auto_label.yml 1 $0.06 2
release-next-rspack.yml 2 $0.06 4
setup-nextjs-build.yml 1 $0.06 4
test_e2e_project_reset_cron.yml 1 $0.06 3
triage.yml 1 $0.06 1
trigger_release.yml 1 $0.06 3
update_fonts_data.yml 1 $0.06 3
update_react.yml 1 $0.06 3
update_react_poller.yml 1 $0.06 2
upload-tests-manifest.yml 1 $0.06 4
upload_preview_tarballs.yml 1 $0.06 4
build_reusable.yml 1 $0.00 7
rspack-nextjs-build-integration-tests.yml 1 $0.00 1
rspack-nextjs-dev-integration-tests.yml 1 $0.00 1
test-turbopack-rust-bench-test.yml 1 $0.00 4
turbopack-nextjs-build-integration-tests.yml 1 $0.00 1
turbopack-nextjs-dev-integration-tests.yml 1 $0.00 1

Examples of what ci-doctor reports

build_and_deploy.yml · WARN missing-cache
actions/setup-node has no cache option. Add 'with: cache: <ecosystem>' to skip dep re-downloads. Saves 30-90 seconds per run.
build_and_deploy.yml · WARN missing-cache
actions/setup-node has no cache option. Add 'with: cache: <ecosystem>' to skip dep re-downloads. Saves 30-90 seconds per run.
build_and_deploy.yml · WARN missing-cache
actions/setup-node has no cache option. Add 'with: cache: <ecosystem>' to skip dep re-downloads. Saves 30-90 seconds per run.
test_e2e_deploy_release.yml · WARN missing-cache
actions/setup-node has no cache option. Add 'with: cache: <ecosystem>' to skip dep re-downloads. Saves 30-90 seconds per run.
test_e2e_deploy_release.yml · WARN missing-cache
actions/setup-node has no cache option. Add 'with: cache: <ecosystem>' to skip dep re-downloads. Saves 30-90 seconds per run.
test_e2e_deploy_release.yml · WARN missing-timeout
Job 'setup' has no timeout-minutes. Default is 360 (6h). A hung job can drain your CI budget.

What you can do

If you maintain vercel/next.js or a similar workflow shape, three patterns probably move the most dollars per minute of work:

  1. Add a concurrency: block with cancel-in-progress: true on every PR-triggered workflow.
  2. Set timeout-minutes on every job (default is 6 hours).
  3. Make sure every setup-* action sets cache: <ecosystem>.

Free CLIs that automate the audit and the pin step:

npx ci-doctor             # 14-rule audit
npx ci-doctor --fix       # auto-apply the four safe fixes
npx pin-actions           # pin every uses: ref to a SHA
npx gha-budget            # estimate per-run $ + monthly

Want the full pattern set?

The Cut Your CI Bill cookbook is 30 paste-ready GitHub Actions patterns plus 5 hardened workflow templates. $19, one-time, MIT-licensed templates.

Get the cookbook

About this dataset

Methodology and code: /blog/oss-ci-cost-benchmarks.html. Compare with all 20 repos: /benchmarks.html. This page is regenerated when the benchmark dataset is refreshed.