C.W.K.
Stream
Lesson 11 of 12 · published

GitHub Actions Cost

~10 min · billing, cost, minutes

Level 0Apprentice
0 XP0/101 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

The free tier is generous, but not infinite

GitHub Actions billing is built around runner-minutes. The free tier looks like this (numbers as of 2026; check the docs for current values):

  • Public repos — completely free. Unlimited minutes on standard Linux runners. (Larger runners and self-hosted are still free.)
  • Private repos (Free plan) — 2,000 Linux minutes/month per account.
  • Private repos (Pro) — 3,000.
  • Private repos (Team) — 3,000.
  • Private repos (Enterprise) — 50,000.

Beyond the free quota, you pay per minute. Crucially, runner type matters:

  • Linux — 1× rate.
  • Windows — 2× rate.
  • macOS — 10× rate (the most expensive line item in CI bills, often by far).
  • Larger runners (4-core, 8-core, GPU) — multiplied rates.

Where the bills actually grow

  1. macOS runners. If you have an iOS or macOS-only test, audit how often it runs. Cap to merge-to-main only if PRs don't need it.
  2. Cron schedules that fan out. A nightly that triggers a 30-job matrix burns through minutes.
  3. Re-run on every push. Use concurrency groups to cancel in-progress runs when a new push lands on the same branch.
  4. Tests that don't need to run on this PR. Use paths: filters or changed-files actions to skip.

Most teams overpay for CI by 2–3× simply because nobody audits the spend.

Code

Concurrency — cancel previous runs on new push·yaml
name: ci
on: { pull_request: {}, push: { branches: [main] } }

# Cancel in-progress runs for the same PR or branch.
concurrency:
  group: ci-${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: pytest -q

External links

Exercise

Open Settings → Billing → Plans and usage on a repo or org you control. Note the Actions minutes used this month, broken down by OS. If macOS is anywhere on the list, find the workflow file responsible and decide whether it really needs to run on every PR.

Progress

Progress is local-only — sign in to sync across devices.
Spotted a bug or have feedback on this page?Report an Issue

Comments 0

🔔 Reply notifications (sign in)
Sign inPlease sign in to comment.

No comments yet — be the first.