Skip to content
Latchkey

GitHub Actions "Waiting for a runner to pick up this job" (queued forever)

The job dispatched successfully but no runner ever leases it, so it sits queued indefinitely instead of failing, blocking the whole pipeline behind it.

What this error means

The job shows "Waiting for a runner to pick up this job..." for an unbounded time. No step output appears and dependent jobs cannot start.

github-actions
Waiting for a runner to pick up this job...

Common causes

No matching capacity

Every runner that matches the labels is busy or offline and no autoscaler is bringing more online, so nothing ever leases the job.

Plan concurrency or queue backlog

The account hit its concurrency ceiling, or a large backlog means this job waits behind many others.

How to fix it

Find why no runner leases it

  1. Confirm at least one runner with the exact labels is Idle.
  2. Check whether the account is at its concurrency limit.
  3. For self-hosted, verify the autoscaler is scaling up for queued jobs.
  4. Add a job timeout so a stuck job fails instead of waiting forever.

Eliminate the queue with warm capacity

Latchkey managed runners keep a warm pool so jobs are picked up immediately with no cold-start queue, auto-retry transient provisioning failures, and cost about 69% less than GitHub-hosted runners.

How to prevent it

  • Alert on jobs queued longer than a threshold.
  • Keep autoscaling responsive to queued workflow_job events.
  • Track concurrency headroom against the plan ceiling.

Related guides

Tired of flaky CI? Latchkey auto-heals failed jobs and retries them for you. Start free →