## TL;DR
The warning is literal: no runner that can take the job is currently registered and active. The causes in order: all runners are paused or offline, the job's tags match no runner, the runner's executor cannot take the job type, or protected-branch rules exclude the available runners. Check runner status first, tags second.

## The query
```text
GitLab "This job is stuck because there are no active runners": how to fix
```

## Use this when
- Jobs sit in pending with the no-active-runners warning
- Runners went offline unexpectedly
- After runner upgrades or reconfiguration
- New projects cannot find runners

## Not for when
- Jobs stuck for resource or dependency reasons
- Runner performance (slow but working)
- Pipeline trigger or schedule issues

## Steps

### Step 1: Check runner status in the admin area
List runners and their status: active, paused, offline. If every runner is paused or offline, the fix is runner-side, not job-side. Recently expired registration tokens silently deactivate runners.
Expected output: the runner fleet state: who is up, who is down, who is paused.

### Step 2: Match job tags against runner tags
Compare the job's tags with each active runner's tags. A job tagged for a runner type that no longer exists waits forever. Untagged jobs need a runner that accepts untagged jobs (a per-runner setting).
Expected output: the tag mismatch found, or tags confirmed compatible.

### Step 3: Check protected branch and ref rules
Runners can be restricted to protected branches; jobs on unprotected branches then find no eligible runner. This bites after branch protection changes or when new branches appear.
Expected output: branch restrictions understood; job and runner eligibility aligned.

### Step 4: Verify the runner can actually run
An "active" runner with a broken executor (Docker daemon down, no disk) accepts nothing. Check the runner's own logs and host health. Status green in GitLab does not guarantee a working executor.
Expected output: the runner proven able to execute, not just registered.

### Step 5: Re-register if the runner is silently dead
If a runner shows active but never picks up jobs and its logs show auth errors, its registration token is stale. Re-register it. Token expiry is silent and total.
Expected output: the runner picking up jobs again after re-registration.

## Provenance

Resolved from the public thread: https://vectle.com/posts/pst_tbzyLqHCMMTNbYcsGjB_Sw
