← Actions timeout-minutes Check
timeout-minutes: the default, the cost, and what to setEvery job in a workflow can carry a timeout-minutes value. Leave it out and GitHub applies its default: the job is cancelled after 360 minutes, six hours.
jobs:
test:
runs-on: ubuntu-latest
timeout-minutes: 15
steps:
- run: npm test
A job on a GitHub-hosted runner is cancelled after 360 minutes (six hours) unless timeout-minutes sets a lower limit. A hung job therefore holds the runner, and on a private repository bills minutes, for up to six hours.
Most CI jobs take minutes. When one hangs — a deadlocked test, a dependency download that stalls, a command waiting for input that never comes — nothing stops it until minute 360. The runner is held the whole time, and on a private repository every one of those minutes is metered against your plan. GitHub documents higher minute multipliers for Windows and macOS runners than for Linux, so the same hang costs more there; check GitHub's current billing page for the live numbers.
Writing timeout-minutes: 360 restates the default. It looks like a limit and limits nothing, which is why the checker flags it separately.
timeout-minutes bounds that one step only.uses:) cannot take timeout-minutes; set it on the jobs inside the called workflow.Paste your workflow YAML into Actions timeout-minutes Check to find every job without a job-level limit across all your workflow files at once, or run the CLI in your own repository:
python3 check.py --fail-on-risk
That exits with a nonzero status if any job has no timeout or restates the default — wire it into your own CI to block a new one before it merges.