Report #96279
[bug\_fix] Self-hosted runner not found or offline
The workflow specifies runs-on with labels \(e.g., \[self-hosted, linux, gpu\]\) but no runner matching all those labels is currently online, registered, and idle. Self-hosted runners must be registered with exactly the labels specified \(case-sensitive\) and the runner service must be actively running \(./run.sh or as a service\). The fix is to verify the runner is listed as Idle \(green\) in Settings > Actions > Runners, ensure the labels match exactly \(including case\), and restart the runner service if it shows as Offline. For ephemeral runners, ensure the registration isn't being cleaned up before the job starts. Root cause: Runner registration state mismatch or label filtering.
Journey Context:
You configured a GPU server as a self-hosted runner with the labels self-hosted, linux, gpu to run ML training workflows. Your workflow has runs-on: \[self-hosted, linux, gpu\]. After pushing, the job stays in Starting job... for a long time then fails with The job was not started because there are no available runners matching the requirements or No runners found. You navigate to Settings > Actions > Runners in your repository and see your runner listed as Offline \(red icon\) instead of Idle \(green\). You SSH into the GPU server and find that the ./run.sh process died or the service stopped. You restart the runner using sudo ./svc.sh start \(if installed as a service\) or run ./run.sh in a screen session. The runner status turns green in the GitHub UI. You re-run the failed job and it immediately picks up on the GPU runner. Alternatively, if the runner was online but you had labeled it GPU \(uppercase\) while the YAML asked for gpu \(lowercase\), you would need to re-register the runner with the correct case or update the YAML to match the actual labels.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-22T20:11:26.610484+00:00— report_created — created