{"record":{"id":"3d1676b113fbc546","repo":"semaphoreui/semaphore","slug":"no-runners-available","errorCode":null,"errorMessage":"no runners available","messagePattern":"no runners available","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"services/tasks/RemoteJob.go","lineNumber":176,"sourceCode":"\tif err != nil {\n\t\treturn\n\t}\n\n\tvar globalRunners []db.Runner\n\tglobalRunners, err = t.taskPool.store.GetAllRunners(true, true, tagFilterMode, t.RunnerTag)\n\tif err != nil {\n\t\treturn\n\t}\n\n\trunners = append(runners, shuffleRunners(projectRunners)...)\n\trunners = append(runners, shuffleRunners(globalRunners)...)\n\n\tif err != nil {\n\t\treturn\n\t}\n\n\tif len(runners) == 0 {\n\t\terr = fmt.Errorf(\"no runners available\")\n\t\treturn\n\t}\n\n\trunner := selectRunner(\n\t\trunners,\n\t\ttz.Now(),\n\t\tutil.Config.RunnersOfflineTimeout(),\n\t\tt.taskPool.GetNumberOfRunningTasksOfRunner)\n\n\tif runner == nil {\n\t\terr = ErrAllRunnersBusy\n\t\treturn\n\t}\n\n\terr = callRunnerWebhook(runner, tsk, \"start\")\n\n\tif err != nil {\n\t\treturn","sourceCodeStart":158,"sourceCodeEnd":194,"githubUrl":"https://github.com/semaphoreui/semaphore/blob/1774ccb71a0a8b82eb74ea24c23ac9ab713de2fa/services/tasks/RemoteJob.go#L158-L194","documentation":"RemoteJob.Run queries the database for runners eligible to execute the task (matching project/environment and enabled). If the result set is empty, no execution target exists and Run aborts with 'no runners available'.","triggerScenarios":"Running a remote task when every registered runner is disabled, offline/dead (failed heartbeat), filtered out by the task's environment, or simply when no runner is registered at all for the project.","commonSituations":"Fresh install where no runner was ever registered; all runners lost connectivity (network/firewall, expired runner token); runner disabled for maintenance; task assigned an environment no runner serves.","solutions":["Register and start at least one runner for the project (semaphore runner register/start)","Check runner status in the UI/DB — re-enable disabled runners and fix offline ones (network, token, heartbeat)","Ensure the task's environment matches an environment the runner is configured for","Check runner logs for connectivity/token errors and re-register with a fresh token if needed"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"runners, err := dbStore.GetRunners(projectID)\nready := 0\nfor _, r := range runners { if r.Active { ready++ } }\nif ready == 0 { /* do not schedule; alert */ }","typeGuard":null,"tryCatchPattern":"if err := job.Run(...); err != nil {\n    if strings.Contains(err.Error(), \"no runners available\") {\n        // re-queue with delay and alert operators\n    }\n}","preventionTips":["Register at least one runner per project/environment before scheduling tasks","Monitor runner heartbeats and alert when all runners go inactive","Re-register runners with fresh tokens after token rotation","Match task environments to configured runner environments"],"tags":["go","runners","tasks"],"backgroundTag":"empty-result-set","analyzedSha":"1774ccb71a0a8b82eb74ea24c23ac9ab713de2fa","analyzedAt":"2026-09-07T11:00:33.293Z","contentChangedAt":"2026-09-07T11:00:33.293Z","schemaVersion":2},"datasetVersion":"2026-09-16T09:17:16.951Z"}