Skip to content
Latchkey

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.

GitHub Actions
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

  1. Confirm a runner with the required labels is online.
  2. Keep self-hosted runners up or use autoscaling around the cron slot.
  3. Fall back to GitHub-hosted runners if the self-hosted pool is empty.
.github/workflows/nightly.yml
runs-on: ubuntu-latest   # hosted fallback if self-hosted is offline

Add 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.

.github/workflows/nightly.yml
jobs:
  nightly:
    runs-on: [self-hosted, linux]
    timeout-minutes: 30

How 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.

Related guides

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