← All guides

Your GitHub Actions bill is mostly macOS minutes (here's how to tell)

If your GitHub Actions bill surprises you, look at the macOS line first. A macOS runner minute bills at roughly ten times a Linux minute, and the xlarge tiers cost more still. One ten-minute macOS job is a hundred Linux-equivalent minutes — run it on every PR and it is almost certainly the biggest single line on your bill.

The multipliers

The billing page shows minutes; it does not shout about the multiplier. Ten thousand macOS minutes and ten thousand Linux minutes look the same in a usage table and differ by an order of magnitude in dollars.

How serious projects end up here

Not by accident, exactly — by default-following. vscode's PR pipeline calls its darwin test workflow four times per pull request, each on runs-on: macos-14-xlarge. For an editor that ships a native macOS app, that is a defensible choice made by a team with a Microsoft-sized budget. The pattern to copy is thedeliberateness, not the config: most repos running macOS jobs on every PR aren't shipping macOS binaries — the job landed in a template years ago and nobody priced it since.

What actually needs macOS

What doesn't: your unit tests, your linter, your web build "just to be safe." If the job would pass in a Linux container, it is paying a 10× premium for nothing.

The fixes, cheapest first

1. Move Linux-capable jobs off premium runners. Usually a one-line change:

jobs:
  test:
    runs-on: ubuntu-latest  # was macos-latest — ~10x cheaper

2. Gate macOS to where it earns its rate — run it on the default branch or a release tag, not every PR commit:

jobs:
  macos-test:
    if: github.ref == 'refs/heads/main'   # PRs run the Linux leg only
    runs-on: macos-14

3. Trim the matrix — a full OS × version grid multiplies the premium legs with everything else (the CI-slow guide covers matrix math). And set timeout-minutes everywhere it hurts most: a hung macOS job burns the 6-hour default at 10× the rate.

Find every premium-runner job you have

GitSpider's scan flags every workflow using macOS or Windows runners and notes that the cost estimate (which assumes Linux) understates your real spend. Two minutes to find out which of your workflows are on the expensive tier.

These hide across however many workflow files you have, which is exactly why nobody sits down and fixes them. Point GitSpider at your repo and it flags which patterns apply, with the fix for each.

Scan your repo free