GitHub Actions runner capacity or queue timeout

The GitHub Actions job waited too long to be picked up by a runner, or the runner became unresponsive mid-job.

github-actions-runner-capacity medium confidence ci github-actions

Matched signals

  • All runners that can run this job are busy
  • Waiting for a runner to pick up this job
  • No runner matching the labels
  • runner was lost
  • The runner has received a shutdown signal
  • runner.*disconnected
  • Job was canceled because no runners matched
  • No available runner

GitHub Actions runner capacity or queue timeout

What this failure means

The GitHub Actions job waited too long to be picked up by a runner, or the runner became unresponsive mid-job. The workflow was canceled due to the capacity or timeout condition.

Symptoms

Faultline looks for one or more of these log fragments:

All runners that can run this job are busy
Waiting for a runner to pick up this job
No runner matching the labels
runner was lost
The runner has received a shutdown signal
runner.*disconnected
Job was canceled because no runners matched
No available runner

Diagnosis

The GitHub Actions job waited too long to be picked up by a runner, or the runner became unresponsive mid-job. The workflow was canceled due to the capacity or timeout condition.

Fix steps

  1. Re-run the failed jobs: transient capacity issues resolve as runners free up.
  2. For self-hosted runners: verify the runner is registered and healthy in Settings → Actions → Runners.
  3. If jobs regularly queue: increase the runner count by adding more self-hosted runners or upgrading the GitHub plan for additional hosted runner seats.
  4. If the workflow timeout was reached: increase timeout-minutes at the job or step level, or split long jobs into shorter parallel steps.
  5. Check runner labels: ensure runs-on labels match a valid registered runner label exactly.

Validation

  • Re-run the local reproduction command after the fix.
  • Check GitHub Settings → Actions → Runners for registered runner health

Why it matters

GitHub-hosted runners have a finite pool per organization. During peak workload or following a large merge event, jobs queue and may exceed the workflow or job timeout before a runner becomes available. For self-hosted runners, the runner process or the host can be lost (preempted, OOM-killed, or the runner agent unregistered). Jobs requiring specific runner labels with no registered runners immediately cancel.

Prevention

  • Set explicit timeout-minutes on every job and step to fail fast rather than hanging indefinitely.
  • Use autoscaling for self-hosted runners (e.g., actions-runner-controller on Kubernetes or ephemeral EC2 runners).
  • Monitor the runner queue depth and alert when jobs wait longer than a threshold.

Try it locally

Check GitHub Settings Actions Runners for registered runner health

How Faultline detects it

Use faultline explain github-actions-runner-capacity to see the full playbook.

faultline analyze build.log
faultline explain github-actions-runner-capacity

Generated from playbooks/bundled/log/ci/github-actions-runner-capacity.yaml. Do not edit directly.

Try it on your own failed log

$ faultline analyze failed.log
Want this across every CI run? Faultline Teams tracks recurring failures across all your repos and surfaces patterns in a shared dashboard.