Runner availability for scheduled jobs in CI
A scheduled job needs a runner just like any other job. If your self-hosted pool is offline or busy, or you hit a concurrency limit, the cron run queues (or eventually fails) instead of executing at its slot.
What this error means
The scheduled run shows "Waiting for a runner" or "Queued" for a long time, or is not picked up at all because the required self-hosted runner label has no online runner.
Requested labels: self-hosted, linux, nightly
Waiting for a runner to pick up this job...
# No online runner matches; the scheduled job sits queued.Common causes
No online runner matches the labels
A self-hosted runner that is offline at the cron time leaves the scheduled job with nothing to run on.
Concurrency or plan limits
Hitting a concurrent-job limit at the cron slot queues the scheduled run behind other work.
How to fix it
Ensure a runner is online at the cron time
- Confirm a runner with the required labels is online.
- Keep self-hosted runners up or use autoscaling around the cron slot.
- Fall back to GitHub-hosted runners if the self-hosted pool is empty.
runs-on: ubuntu-latest # hosted fallback if self-hosted is offlineAdd a timeout so a stuck queue fails fast
Set a job timeout so a scheduled run that never gets a runner fails and alerts instead of hanging.
jobs:
nightly:
runs-on: [self-hosted, linux]
timeout-minutes: 30How to prevent it
- Keep runners online (or autoscaled) around scheduled slots.
- Provide a hosted fallback for critical crons.
- Alert on scheduled runs that queue too long.