Running out of GitHub Actions minutes
GitHub Actions free limits give your plan a set number of included minutes each month, and private-repo jobs on GitHub-hosted runners use them up. Cut wasted minutes first, then move the costly jobs to machines you own.
The short answer
Each GitHub plan includes some free minutes each month. Jobs on GitHub-hosted runners in private repos count against them. macOS jobs use them up fastest. When they run out, those jobs stop, unless you allow paid use. GitHub lists each plan's amount in its billing docs.
What counts as a minute
So, what are GitHub Actions minutes? A minute is time a job runs on a GitHub-hosted runner. GitHub rounds each job up to a whole minute. A 10-second lint job counts as one minute. Standard hosted runners are free for public repos. Private repos use your included minutes first. Larger runners are billed by the minute too, at higher prices, and are not covered by the free minutes.
Why macOS burns minutes fastest
macOS jobs use your GitHub Actions free minutes at a higher rate than Linux jobs. GitHub's docs list the current rate. Past the free amount, they also cost more: $0.062 a minute on macOS against $0.006 on Linux, at GitHub's list prices. So one long iOS build can use more than a day of short Linux jobs. See why macOS jobs are slow.
See what you used
Open settings
On GitHub, open settings for your account or organization.
Open billing
Find the billing section and its Actions usage.
Sort the list
Look at usage by repo and by runner type. Note the top few.
Also check how often each workflow runs. A job that runs on every push to every branch adds up. Running it only on pull requests, or only on main, can cut its minutes a lot.
Most bills come from a few workflows. Fix those first. Our guide to GitHub Actions limits covers the other limits too.
Cut minutes in your workflows
- Stop stuck jobs with a time limit.
- Cancel old runs when you push again.
- Skip runs when only docs change.
- Cache packages so setup is shorter.
on:
push:
paths-ignore: ['docs/**', '**.md']
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
test:
runs-on: ubuntu-latest
timeout-minutes: 20
steps:
- uses: actions/checkout@v4
- run: make test
Move jobs to machines you own
Jobs on your own machines don't use GitHub's hosted minutes. Codemany runs them on your Mac or Linux machine for a flat $20 a month for 2 machines. Each extra machine is $10 a month. Long builds don't cost more. Change one line in the jobs you want to move:
runs-on: [self-hosted, codemany]
Jobs left on macos-latest or ubuntu-latest keep running on GitHub. So you can move one workflow at a time, macOS jobs first. Codemany runs public repos only if you turn them on. Read GitHub Actions cost per minute, or put your own numbers into the savings calculator. Plans are on the pricing page.
Questions
What happens when minutes run out?
Jobs on GitHub-hosted runners stop until the next cycle or until you add a spending limit.
Do self-hosted jobs use included minutes?
Check GitHub's current billing docs. Codemany is a flat $20 a month for 2 machines.
Are public repos free?
GitHub-hosted runners are free for public repos. Codemany runs public repos only if you opt in.
Related
Read next: GitHub Actions cost, GitHub Actions limits, slow macOS jobs and the savings calculator.
Start a 14-day trial $20 a month for 2 machines. No card needed.