@htekdev/actions-debugger 1.0.22 → 1.0.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/errors/caching-artifacts/artifact-minimum-retention-one-day.yml +153 -0
  2. package/errors/caching-artifacts/cache-api-propagation-delay-post-save.yml +128 -0
  3. package/errors/caching-artifacts/cache-backend-internal-error-skipped.yml +75 -0
  4. package/errors/caching-artifacts/cache-hit-step-id-case-sensitive-mismatch.yml +95 -0
  5. package/errors/caching-artifacts/cache-save-post-step-skipped-on-failure.yml +114 -0
  6. package/errors/concurrency-timing/deploy-pages-in-progress-deployment-wedged.yml +70 -0
  7. package/errors/concurrency-timing/deployment-review-timeout-expired.yml +88 -0
  8. package/errors/concurrency-timing/job-concurrency-scope-per-run-not-global.yml +81 -0
  9. package/errors/concurrency-timing/merge-queue-concurrency-cancel-blocks-all.yml +86 -0
  10. package/errors/concurrency-timing/reusable-workflow-github-workflow-context-cancel.yml +124 -0
  11. package/errors/concurrency-timing/runner-scale-set-jobs-never-start.yml +123 -0
  12. package/errors/concurrency-timing/runner-temp-dir-race-concurrent-workers.yml +90 -0
  13. package/errors/known-unsolved/artifact-download-url-unauthenticated-404.yml +98 -0
  14. package/errors/known-unsolved/checkout-v6-credentials-docker-run-manual.yml +105 -0
  15. package/errors/known-unsolved/concurrency-groups-repo-scoped-only.yml +138 -0
  16. package/errors/known-unsolved/matrix-256-job-limit.yml +142 -0
  17. package/errors/known-unsolved/merge-group-paths-filter-not-supported.yml +137 -0
  18. package/errors/known-unsolved/no-job-allow-failure.yml +73 -0
  19. package/errors/known-unsolved/reusable-secrets-inherit-not-deep-forwarded.yml +113 -0
  20. package/errors/known-unsolved/schedule-cron-hours-long-queue-drift.yml +101 -0
  21. package/errors/permissions-auth/checkout-persist-credentials-token-write.yml +90 -0
  22. package/errors/permissions-auth/create-github-app-token-cross-job-token-revoked.yml +95 -0
  23. package/errors/permissions-auth/github-token-contents-write-missing-git-push.yml +117 -0
  24. package/errors/permissions-auth/org-actions-policy-blocks-unapproved-action.yml +106 -0
  25. package/errors/runner-environment/codeql-action-v2-deprecated.yml +110 -0
  26. package/errors/runner-environment/macos-26-openssl-3-system-library-breaking.yml +114 -0
  27. package/errors/runner-environment/macos-26-ruby-34-default-upgrade.yml +114 -0
  28. package/errors/runner-environment/macos-26-xcode-default-265-pin-required.yml +99 -0
  29. package/errors/runner-environment/macos-latest-label-switches-to-macos26.yml +127 -0
  30. package/errors/runner-environment/node20-removed-toolcache-default-node22.yml +104 -0
  31. package/errors/runner-environment/org-runner-group-dispatch-null.yml +102 -0
  32. package/errors/runner-environment/powershell-74-76-threadjob-module-rename.yml +124 -0
  33. package/errors/runner-environment/self-hosted-runner-not-found.yml +134 -0
  34. package/errors/runner-environment/self-hosted-runner-selinux-service-exec-failure.yml +116 -0
  35. package/errors/runner-environment/service-container-no-healthcheck.yml +158 -0
  36. package/errors/runner-environment/setup-node-v5-corepack-pnpm-not-found.yml +101 -0
  37. package/errors/runner-environment/setup-node-yarn-not-installed-self-hosted.yml +76 -0
  38. package/errors/runner-environment/setup-python-externally-managed-env-error.yml +95 -0
  39. package/errors/runner-environment/windows-2019-runner-retired-june2025.yml +118 -0
  40. package/errors/runner-environment/windows-2022-docker-daemon-not-started.yml +108 -0
  41. package/errors/silent-failures/cache-hit-output-string-not-boolean.yml +96 -0
  42. package/errors/silent-failures/checkout-lfs-pointer-not-content.yml +105 -0
  43. package/errors/silent-failures/reusable-workflow-output-skipped-contains-secret.yml +115 -0
  44. package/errors/silent-failures/setup-node-silent-download-exit-zero.yml +105 -0
  45. package/errors/silent-failures/setup-python-truncated-manifest-silent-exit.yml +111 -0
  46. package/errors/silent-failures/undefined-env-expression-empty-string-silent.yml +115 -0
  47. package/errors/silent-failures/windows-powershell-github-output-bash-syntax.yml +118 -0
  48. package/errors/triggers/fork-pr-first-time-contributor-approval-required.yml +142 -0
  49. package/errors/triggers/on-push-branches-glob-star-no-slash-match.yml +78 -0
  50. package/errors/triggers/pull-request-target-env-protection-default-branch-eval.yml +117 -0
  51. package/errors/triggers/required-status-check-renamed-never-passes.yml +87 -0
  52. package/errors/triggers/schedule-cron-self-hosted-runner-not-triggered.yml +107 -0
  53. package/errors/triggers/workflow-run-checkout-uses-default-branch.yml +114 -0
  54. package/errors/yaml-syntax/composite-action-run-shell-missing.yml +90 -0
  55. package/errors/yaml-syntax/composite-action-secrets-context-unavailable.yml +99 -0
  56. package/errors/yaml-syntax/github-script-octokit-renamed-to-github.yml +130 -0
  57. package/errors/yaml-syntax/labeler-v5-config-format-breaking.yml +67 -0
  58. package/errors/yaml-syntax/reusable-workflow-nesting-depth-exceeded.yml +113 -0
  59. package/errors/yaml-syntax/runs-on-expression-array-syntax-error.yml +121 -0
  60. package/errors/yaml-syntax/setup-go-matrix-version-float-coercion.yml +69 -0
  61. package/package.json +1 -1
@@ -0,0 +1,104 @@
1
+ id: runner-environment-062
2
+ title: "Node.js 20 Removed from Toolcache — Default Node.js Changed to 22"
3
+ category: runner-environment
4
+ severity: error
5
+ tags:
6
+ - nodejs
7
+ - node20
8
+ - node22
9
+ - toolcache
10
+ - eol
11
+ - setup-node
12
+ - runner-images
13
+ patterns:
14
+ - regex: "node: not found"
15
+ flags: "i"
16
+ - regex: "node: No such file or directory"
17
+ flags: "i"
18
+ - regex: "Downloading Node\\.js (20\\.[0-9]+\\.[0-9]+)"
19
+ flags: "i"
20
+ - regex: "engines.*node.*>=\\s*20"
21
+ flags: "i"
22
+ - regex: "error node_modules.*requires node.*20"
23
+ flags: "i"
24
+ error_messages:
25
+ - "node: not found"
26
+ - "Downloading Node.js 20.x.x (not pre-installed, downloading on demand)"
27
+ - "error: The engine 'node' is incompatible with this module. Expected version '^20.0.0'. Got '22.x.x'"
28
+ - "The engine 'node' is incompatible with this module. Expected version '>=20 <21'. Got '22.14.0'"
29
+ root_cause: |
30
+ Node.js 20 reached end-of-life on April 30, 2026. Starting with runner image
31
+ updates rolled out May 19–26, 2026, Node.js 20 was removed from the toolcache
32
+ on ALL GitHub-hosted runner images (ubuntu-22.04, ubuntu-24.04, ubuntu-26.04,
33
+ macos-14, macos-15, macos-26, windows-2022, windows-2025, and ARM variants).
34
+
35
+ Two distinct impacts:
36
+
37
+ 1. **Default Node.js version changed**: On runners where Node.js 20 was
38
+ previously the default (e.g., ubuntu-22.04, ubuntu-24.04, windows-2022,
39
+ macos-14), the default is now Node.js 22 (Maintenance LTS). Workflows
40
+ that call `node` or `npm` without an explicit `actions/setup-node` step
41
+ will now run on Node.js 22, potentially breaking packages with strict
42
+ engines constraints like `"node": "^20.0.0"`.
43
+
44
+ 2. **setup-node now downloads Node.js 20**: If a workflow pins
45
+ `node-version: '20'` via `actions/setup-node`, it will no longer find
46
+ Node.js 20 in the toolcache and must download it on demand. This adds
47
+ download time and may fail if the registry is rate-limited or the runner
48
+ has no internet access (self-hosted runners with air-gapped environments).
49
+
50
+ Only Node.js 22 and Node.js 24 remain pre-installed in the toolcache on all
51
+ runner images after this change.
52
+ fix: |
53
+ Option 1 — Upgrade to Node.js 22 or 24 (recommended):
54
+ Update your project to support Node.js 22 (current Maintenance LTS) or
55
+ Node.js 24 (Active LTS). Update package.json engines field, run tests on
56
+ the new version, and remove the explicit node-version pin (or update it).
57
+
58
+ Option 2 — Pin to Node.js 20 via setup-node (temporary):
59
+ If you cannot migrate yet, explicitly install Node.js 20 on every job
60
+ using `actions/setup-node`. Node.js 20 is still downloadable on demand —
61
+ it just won't be pre-cached. This will slow down your workflow.
62
+
63
+ Option 3 — Test with FORCE_JAVASCRIPT_ACTIONS_TO_NODE24:
64
+ Set `FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true` as a workflow env to test
65
+ how your action runtime behaves on Node.js 24 before fully migrating.
66
+ fix_code:
67
+ - language: yaml
68
+ label: "Upgrade to Node.js 22 (recommended)"
69
+ code: |
70
+ - name: Set up Node.js
71
+ uses: actions/setup-node@v4
72
+ with:
73
+ node-version: '22' # Node.js 22 is Maintenance LTS through 2026
74
+ cache: 'npm'
75
+ - language: yaml
76
+ label: "Pin Node.js 20 temporarily (still downloadable on demand)"
77
+ code: |
78
+ - name: Set up Node.js 20 (no longer pre-cached — will download)
79
+ uses: actions/setup-node@v4
80
+ with:
81
+ node-version: '20' # EOL 2026-04-30; plan your migration to v22
82
+ cache: 'npm'
83
+ - language: yaml
84
+ label: "Use .nvmrc / .node-version to pin version in project root"
85
+ code: |
86
+ - name: Set up Node.js from .nvmrc
87
+ uses: actions/setup-node@v4
88
+ with:
89
+ node-version-file: '.nvmrc' # Update .nvmrc to 22 or 24
90
+ cache: 'npm'
91
+ prevention:
92
+ - "Always specify an explicit node-version in actions/setup-node — never rely on the runner's ambient Node.js version."
93
+ - "Set `node-version-file: '.nvmrc'` and commit a .nvmrc file so all environments (local, CI, containers) use the same version."
94
+ - "Watch the runner-images Announcements tab for future EOL removals — set up GitHub notifications for the actions/runner-images repo."
95
+ - "Use `engines` in package.json with a range like `>=22 <25` to catch version incompatibilities in CI early."
96
+ docs:
97
+ - url: "https://github.com/actions/runner-images/issues/14029"
98
+ label: "runner-images #14029: Node.js 20 removed, default changed to 22"
99
+ - url: "https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/"
100
+ label: "GitHub Changelog: Deprecation of Node 20 on GitHub Actions runners"
101
+ - url: "https://github.com/nodejs/release#readme"
102
+ label: "Node.js Release Schedule (EOL dates)"
103
+ - url: "https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/using-pre-installed-software#nodejs-versions"
104
+ label: "GitHub Docs: Using pre-installed software — Node.js versions"
@@ -0,0 +1,102 @@
1
+ id: runner-environment-059
2
+ title: "Org-Level Self-Hosted Runner in Group Never Dispatched — Job Queued Indefinitely"
3
+ category: runner-environment
4
+ severity: error
5
+ tags:
6
+ - self-hosted-runner
7
+ - runner-group
8
+ - org-runner
9
+ - queued
10
+ - dispatch
11
+
12
+ patterns:
13
+ - regex: "no runner.*matching.*label.*self-hosted"
14
+ flags: "i"
15
+ - regex: "runner_group_id.*null"
16
+ flags: "i"
17
+
18
+ error_messages:
19
+ - "Can't find any online and idle self-hosted runner in the current repository, account/organization that matches the required labels: 'self-hosted, <group-name>'"
20
+ - "Waiting for a runner to pick up this job..."
21
+
22
+ root_cause: |
23
+ When a self-hosted runner is registered at the ORGANIZATION level and placed into
24
+ a runner group that has explicit repository access, the GitHub Actions dispatcher
25
+ sometimes fails to resolve the runner's group membership within the target
26
+ repository's scope. The job's metadata shows runner_group_id: null throughout the
27
+ entire wait period, meaning the internal broker never matched the org-level runner
28
+ to the queued job.
29
+
30
+ This affects runners using the V2 broker protocol
31
+ (broker.actions.githubusercontent.com) on GitHub Team and Enterprise plans.
32
+ The runner appears "Online" in the org settings, the runner group lists the target
33
+ repository as allowed, and the runs-on labels match — yet the job never starts.
34
+
35
+ Root technical cause: the dispatcher resolves runner group membership differently
36
+ for org-scoped runners vs. repo-scoped runners. When the runner is registered at
37
+ org scope, the broker does not propagate its group_id to the queued job record,
38
+ so no assignment occurs.
39
+
40
+ fix: |
41
+ Short-term workaround (immediate):
42
+ Re-register the runner at the REPOSITORY level instead of the organization level.
43
+ This bypasses the group dispatch path and the job is assigned immediately.
44
+
45
+ Long-term fix:
46
+ 1. Monitor GitHub Actions runner releases for a fix to org-level group dispatch.
47
+ 2. Use GitHub-hosted larger runners or runner scale sets (Actions Runner Controller)
48
+ for org-level sharing — these use a different dispatch mechanism that is not
49
+ affected by this bug.
50
+ 3. If org-level management is required, use runner groups with repo-scoped runner
51
+ registration and rely on group access policies to control visibility.
52
+
53
+ fix_code:
54
+ - language: yaml
55
+ label: "Re-register runner at repository level (workaround)"
56
+ code: |
57
+ # 1. Remove the runner from the org-level runner list in GitHub UI:
58
+ # Settings → Actions → Runners → (select runner) → Remove runner
59
+ #
60
+ # 2. Re-register the runner at the REPO level:
61
+ # <repo> → Settings → Actions → Runners → New self-hosted runner
62
+ # Follow setup commands shown in the UI.
63
+ #
64
+ # 3. Your workflow runs-on stays the same:
65
+ jobs:
66
+ build:
67
+ runs-on: [self-hosted, my-runner-label]
68
+ steps:
69
+ - uses: actions/checkout@v4
70
+
71
+ - language: yaml
72
+ label: "Use Actions Runner Controller (ARC) for org-level runners"
73
+ code: |
74
+ # ARC scale sets are not affected by the org-runner group dispatch bug.
75
+ # Install the controller chart and create a runner scale set:
76
+ #
77
+ # helm install arc-runner-set \
78
+ # --namespace arc-runners \
79
+ # oci://ghcr.io/actions/actions-runner-controller-charts/gha-runner-scale-set \
80
+ # --set githubConfigUrl=https://github.com/<org> \
81
+ # --set githubConfigSecret.github_token=<token>
82
+ #
83
+ # Then reference in your workflow:
84
+ jobs:
85
+ build:
86
+ runs-on: arc-runner-set
87
+ steps:
88
+ - uses: actions/checkout@v4
89
+
90
+ prevention:
91
+ - "Register self-hosted runners at repository level when possible to avoid org-level dispatch issues."
92
+ - "After registering a runner, trigger a test workflow immediately to confirm dispatch before relying on it in production."
93
+ - "Use Actions Runner Controller (ARC) scale sets for org-wide shared runners — ARC bypasses the runner group dispatch path."
94
+ - "Check runner_group_id via the API (`GET /repos/{owner}/{repo}/actions/runs/{run_id}/jobs`) when a job is stuck — null means dispatch failed at the broker level."
95
+
96
+ docs:
97
+ - url: "https://github.com/actions/runner/issues/4429"
98
+ label: "actions/runner#4429 — Org-level runner never dispatched despite correct group access (May 2026)"
99
+ - url: "https://docs.github.com/en/actions/using-github-hosted-runners/using-github-hosted-runners/about-github-hosted-runners"
100
+ label: "GitHub Docs — Runner registration scopes"
101
+ - url: "https://docs.github.com/en/actions/hosting-your-own-runners/managing-self-hosted-runners/using-self-hosted-runners-in-a-workflow"
102
+ label: "GitHub Docs — Using self-hosted runners in a workflow"
@@ -0,0 +1,124 @@
1
+ id: runner-environment-063
2
+ title: "PowerShell 7.4 → 7.6 LTS Upgrade Breaks ThreadJob Module Name and .NET Runtime"
3
+ category: runner-environment
4
+ severity: warning
5
+ tags:
6
+ - powershell
7
+ - powershell-76
8
+ - threadjob
9
+ - dotnet10
10
+ - runner-images
11
+ - breaking-change
12
+ - module
13
+ patterns:
14
+ - regex: "The term 'ThreadJob\\\\Start-ThreadJob' is not recognized"
15
+ flags: "i"
16
+ - regex: "CommandNotFoundException.*ThreadJob"
17
+ flags: "i"
18
+ - regex: "Cannot find module.*ThreadJob"
19
+ flags: "i"
20
+ - regex: "Join-Path.*cannot process argument transformation on parameter 'ChildPath'"
21
+ flags: "i"
22
+ - regex: "PowerShell.*7\\.4.*not found"
23
+ flags: "i"
24
+ error_messages:
25
+ - "The term 'ThreadJob\\Start-ThreadJob' is not recognized as a name of a cmdlet, function, script file, or executable program."
26
+ - "Cannot find module ThreadJob"
27
+ - "Join-Path: Cannot process argument transformation on parameter 'ChildPath'."
28
+ - "Get-Module: The specified module 'ThreadJob' was not found"
29
+ root_cause: |
30
+ GitHub Actions runner images are being updated from PowerShell 7.4.x to 7.6.x
31
+ (the latest LTS release, based on .NET 10) across all runner images between
32
+ June 8–15, 2026 (runner-images#14150). PowerShell 7.6 is a major.minor
33
+ version upgrade from 7.4 and contains several breaking changes:
34
+
35
+ 1. **ThreadJob module renamed**: The `ThreadJob` module has been replaced by
36
+ `Microsoft.PowerShell.ThreadJob`. The `Start-ThreadJob` cmdlet itself is
37
+ unchanged, but any script using the module-qualified name
38
+ `ThreadJob\Start-ThreadJob` will throw a CommandNotFoundException because
39
+ the old module name no longer exists. Scripts that call `Start-ThreadJob`
40
+ without the module prefix continue to work.
41
+
42
+ 2. **Join-Path -ChildPath is now string[]**: The `-ChildPath` parameter type
43
+ changed from `string` to `string[]`. In most cases this is backward-
44
+ compatible, but scripts with unusual argument binding patterns or that
45
+ pass a typed `[string]` variable explicitly may encounter parameter
46
+ transformation errors.
47
+
48
+ 3. **.NET 10 runtime**: PowerShell 7.6 ships on .NET 10 (7.4 was on .NET 8).
49
+ Scripts that load .NET assemblies, use P/Invoke, or invoke .NET API
50
+ members that changed between .NET 8 and .NET 10 may break silently
51
+ or throw runtime exceptions.
52
+
53
+ 4. **WildcardPattern.Escape behavior change**: `WildcardPattern.Escape` now
54
+ correctly escapes lone backticks. Scripts that relied on the old (incorrect)
55
+ no-escape behavior may produce different wildcard pattern results.
56
+
57
+ 5. **Trailing space removed from event source name**: Scripts that match
58
+ exact event source names (e.g., for Windows Event Log) may fail to find
59
+ the source if they include a trailing space.
60
+ fix: |
61
+ 1. Replace module-qualified ThreadJob references:
62
+ Find all occurrences of `ThreadJob\Start-ThreadJob` in your scripts and
63
+ update them to `Microsoft.PowerShell.ThreadJob\Start-ThreadJob` or simply
64
+ use the unqualified `Start-ThreadJob`.
65
+
66
+ 2. Review Join-Path usage:
67
+ Scripts using `Join-Path` with `-ChildPath` should continue to work in
68
+ most cases. If you see parameter binding errors, check that you are not
69
+ passing a typed `[string]` variable in a context that is now ambiguous.
70
+
71
+ 3. Test .NET assembly loading:
72
+ If your scripts load .NET assemblies via `Add-Type -Path` or
73
+ `[System.Reflection.Assembly]::LoadFrom()`, test them against .NET 10
74
+ to catch any API compatibility issues before the upgrade rolls out.
75
+
76
+ 4. Pin PowerShell version (temporary workaround):
77
+ Until migration is complete, you can install a specific PowerShell version
78
+ via the MSI/package manager in a workflow step. This is a temporary
79
+ workaround and should not be the long-term solution.
80
+ fix_code:
81
+ - language: yaml
82
+ label: "Fix module-qualified ThreadJob reference"
83
+ code: |
84
+ # Before (PowerShell 7.4 — breaks on 7.6):
85
+ # $job = ThreadJob\Start-ThreadJob -ScriptBlock { ... }
86
+ #
87
+ # After (works on both 7.4 and 7.6):
88
+ - name: Run threaded job
89
+ shell: pwsh
90
+ run: |
91
+ # Option A: unqualified (works on all versions)
92
+ $job = Start-ThreadJob -ScriptBlock { Get-Process }
93
+
94
+ # Option B: fully qualified with new module name (7.6+)
95
+ $job = Microsoft.PowerShell.ThreadJob\Start-ThreadJob -ScriptBlock { Get-Process }
96
+
97
+ $result = $job | Wait-Job | Receive-Job
98
+ Write-Output $result
99
+ - language: yaml
100
+ label: "Verify PowerShell version in workflow to detect future upgrades early"
101
+ code: |
102
+ - name: Check PowerShell version
103
+ shell: pwsh
104
+ run: |
105
+ $version = $PSVersionTable.PSVersion
106
+ Write-Output "PowerShell version: $version"
107
+ if ($version.Major -lt 7 -or ($version.Major -eq 7 -and $version.Minor -lt 6)) {
108
+ Write-Warning "PowerShell < 7.6 detected — ensure ThreadJob references use unqualified names"
109
+ }
110
+ prevention:
111
+ - "Use unqualified cmdlet names (Start-ThreadJob, not ThreadJob\\Start-ThreadJob) to avoid module-name dependencies."
112
+ - "Add a PowerShell version check step at the start of complex pwsh workflows to detect unexpected upgrades early."
113
+ - "Test workflows against the next PowerShell LTS version in a matrix before the runner image upgrade lands."
114
+ - "Subscribe to GitHub notifications on actions/runner-images to receive Announcement issues for upcoming breaking changes."
115
+ - "Avoid loading .NET assemblies by absolute path in runner workflows — prefer NuGet package installation to ensure .NET runtime compatibility."
116
+ docs:
117
+ - url: "https://github.com/actions/runner-images/issues/14150"
118
+ label: "runner-images #14150: PowerShell will be updated from 7.4 to 7.6 LTS (Jun 8-15 2026)"
119
+ - url: "https://learn.microsoft.com/en-us/powershell/scripting/whats-new/what-s-new-in-powershell-76"
120
+ label: "PowerShell 7.6 Release Notes — breaking changes"
121
+ - url: "https://github.com/PowerShell/PowerShell/releases/tag/v7.6.0"
122
+ label: "PowerShell v7.6.0 GitHub release"
123
+ - url: "https://learn.microsoft.com/en-us/powershell/scripting/install/powershell-support-lifecycle"
124
+ label: "PowerShell support lifecycle"
@@ -0,0 +1,134 @@
1
+ id: runner-environment-067
2
+ title: "Self-Hosted Runner 'An error occurred: Runner not found'"
3
+ category: runner-environment
4
+ severity: error
5
+ tags:
6
+ - self-hosted
7
+ - runner
8
+ - runner-not-found
9
+ - jit
10
+ - registration
11
+ - ephemeral
12
+ patterns:
13
+ - regex: "An error occurred: Runner not found"
14
+ flags: "i"
15
+ - regex: "Runner not found"
16
+ flags: "i"
17
+ - regex: "No runner matching the specified criteria was found"
18
+ flags: "i"
19
+ - regex: "Could not find any runner that matches the selector"
20
+ flags: "i"
21
+ error_messages:
22
+ - "An error occurred: Runner not found"
23
+ - "Error: An error occurred: Runner not found"
24
+ - "No runner matching the specified criteria was found"
25
+ root_cause: |
26
+ "An error occurred: Runner not found" is a vague error emitted by the
27
+ GitHub Actions broker when it cannot match or allocate a self-hosted runner
28
+ for a queued job. It has multiple distinct root causes:
29
+
30
+ 1. **JIT (Just-in-Time) token expiry** (most common with ARC/Kubernetes runners):
31
+ Ephemeral runners provisioned via Just-in-Time tokens have a short registration
32
+ window. If the runner process does not connect within the token validity period
33
+ (~60 seconds), the broker discards the registration and emits "Runner not found"
34
+ when the job is dispatched. This particularly affects actions-runner-controller
35
+ (ARC) on Kubernetes when pod startup time exceeds the JIT window.
36
+
37
+ 2. **Runner de-registered before job starts**:
38
+ Autoscaling controllers (ARC, custom scripts) that aggressively recycle idle
39
+ runners may de-register the runner in the brief window between job queue and
40
+ job dispatch. The broker finds no runner for the job's labels.
41
+
42
+ 3. **Label mismatch**:
43
+ The workflow specifies `runs-on: [self-hosted, linux, x64]` but the registered
44
+ runner has different labels (e.g., just `[self-hosted, linux]`). The broker
45
+ treats this as "no matching runner found" and emits the same vague error.
46
+
47
+ 4. **Runner registered at wrong scope**:
48
+ A runner registered at the organization level is not visible to a repository
49
+ not in that runner's group, or vice versa. Org runner group access policy
50
+ may restrict which repos can use the runner.
51
+
52
+ 5. **Concurrent job stealing**:
53
+ In autoscaling pools where multiple runners share the same label set, a
54
+ job token issued to one runner is occasionally "stolen" by another — the
55
+ original runner's job token is invalid when it tries to start. Less common
56
+ but documented in high-concurrency pools (actions/runner#3857, 116 reactions).
57
+
58
+ The error is intentionally vague because it covers multiple broker-side failures
59
+ that are indistinguishable from the runner's perspective.
60
+ fix: |
61
+ Diagnose by checking the runner registration logs first:
62
+
63
+ 1. **For JIT token expiry (ARC/Kubernetes)**:
64
+ Reduce pod startup time — use pre-pulled images, smaller base images, or
65
+ warm pools. Alternatively, switch to Long-Running runners (PAT/App-registered)
66
+ which don't have JIT token windows. Check actions-runner-controller v0.9+
67
+ which extended the JIT window.
68
+
69
+ 2. **For de-registered runner race condition**:
70
+ Add a grace period to your autoscaler before de-registering idle runners —
71
+ at least 60 seconds after a job completes. Use `--once` flag on ephemeral
72
+ runners so they only exit after completing one job, not before.
73
+
74
+ 3. **For label mismatch**:
75
+ Run `gh api repos/{owner}/{repo}/actions/runners --jq '.[].labels'` to inspect
76
+ registered runner labels. Compare against the `runs-on:` in your workflow.
77
+ Labels are case-sensitive and must be an exact subset match.
78
+
79
+ 4. **For wrong scope (org vs repo)**:
80
+ Check Settings → Actions → Runners in both the repo and org. Confirm the
81
+ runner appears under the correct scope and the runner group allows access
82
+ to the repository.
83
+
84
+ 5. **General debugging**:
85
+ Enable runner diagnostic logs by setting `ACTIONS_RUNNER_DEBUG: true` and
86
+ `ACTIONS_STEP_DEBUG: true` as repository secrets. This enables verbose
87
+ broker negotiation logs in the Actions runner output.
88
+ fix_code:
89
+ - language: yaml
90
+ label: "Enable runner diagnostic logs to capture broker negotiation details"
91
+ code: |
92
+ # Add these as repository secrets (Settings → Secrets → Actions):
93
+ # ACTIONS_RUNNER_DEBUG = true
94
+ # ACTIONS_STEP_DEBUG = true
95
+
96
+ # Then re-run the failing job. The runner logs will include:
97
+ # "Checking runner for labels: [self-hosted, linux, x64]"
98
+ # "Connected to GitHub Actions service"
99
+ # "Received job assignment: ..."
100
+ jobs:
101
+ build:
102
+ runs-on: [self-hosted, linux, x64]
103
+ steps:
104
+ - uses: actions/checkout@v4
105
+ - run: echo "Runner labels verified"
106
+ - language: yaml
107
+ label: "Verify registered runner labels via GitHub API"
108
+ code: |
109
+ # Check what labels your self-hosted runners actually have:
110
+ # gh api repos/{owner}/{repo}/actions/runners --jq '.runners[] | {name: .name, labels: [.labels[].name]}'
111
+ # Example output:
112
+ # {"name": "my-runner", "labels": ["self-hosted", "Linux", "X64"]}
113
+ # Note: Labels are case-sensitive — "Linux" != "linux"
114
+
115
+ # Workflow label must match runner label exactly:
116
+ jobs:
117
+ build:
118
+ # Use exact case matching the runner's registered labels:
119
+ runs-on: [self-hosted, Linux, X64]
120
+ prevention:
121
+ - "Use explicit, versioned runner labels instead of generic `self-hosted` to make label mismatches immediately visible in the runner registration."
122
+ - "For ephemeral/JIT runners on Kubernetes, use pre-pulled base images and resource requests that ensure fast pod startup to avoid JIT token expiry."
123
+ - "Add ACTIONS_RUNNER_DEBUG=true as a repository secret during initial setup to capture detailed registration logs before the runner goes into production."
124
+ - "Implement health monitoring on your self-hosted runner pool — alert when the runner count drops below the minimum needed for your queue depth."
125
+ - "Prefer Long-Running runners over JIT ephemeral runners for workflows with unpredictable startup patterns — JIT token windows are unforgiving on slow infrastructure."
126
+ docs:
127
+ - url: "https://github.com/actions/runner/issues/3857"
128
+ label: "actions/runner #3857: 'An error occurred: Runner not found' (116 reactions)"
129
+ - url: "https://docs.github.com/en/actions/hosting-your-own-runners/managing-self-hosted-runners/monitoring-and-troubleshooting-self-hosted-runners"
130
+ label: "GitHub Docs: Monitoring and troubleshooting self-hosted runners"
131
+ - url: "https://docs.github.com/en/actions/hosting-your-own-runners/managing-self-hosted-runners/using-labels-with-self-hosted-runners"
132
+ label: "GitHub Docs: Using labels with self-hosted runners"
133
+ - url: "https://docs.github.com/en/actions/security-for-github-actions/security-guides/security-hardening-for-github-actions#hardening-for-self-hosted-runners"
134
+ label: "GitHub Docs: Security hardening for self-hosted runners"
@@ -0,0 +1,116 @@
1
+ id: runner-environment-068
2
+ title: "Self-Hosted Runner Service Fails on RHEL/CentOS — SELinux Blocks runsvc.sh with status=203/EXEC"
3
+ category: runner-environment
4
+ severity: error
5
+ tags:
6
+ - self-hosted
7
+ - selinux
8
+ - rhel
9
+ - centos
10
+ - oracle-linux
11
+ - service
12
+ - systemd
13
+ patterns:
14
+ - regex: "status=203/EXEC|code=exited.*status=203"
15
+ flags: "i"
16
+ - regex: "runsvc\\.sh.*failed|svc\\.sh.*start.*fail|runner.*service.*203"
17
+ flags: "i"
18
+ - regex: "avc.*denied.*runner|selinux.*denied.*exec.*runsvc"
19
+ flags: "i"
20
+ error_messages:
21
+ - "Active: failed (Result: exit-code)"
22
+ - "Main PID: XXXX (code=exited, status=203/EXEC)"
23
+ - "Failed to execute: Permission denied"
24
+ - "svc install succeeded but svc start exits immediately with status=203/EXEC"
25
+ root_cause: |
26
+ On SELinux-enforcing Linux distributions (RHEL, CentOS, Oracle Linux, AlmaLinux,
27
+ Rocky Linux), the GitHub Actions self-hosted runner service fails to start with
28
+ systemd exit code 203/EXEC when run via sudo ./svc.sh start.
29
+
30
+ The root cause is a SELinux security context mismatch:
31
+ 1. GitHub's ./config.sh creates runsvc.sh and run.sh with the security context
32
+ of the installing user's SSH/interactive session (e.g., unconfined_u:object_r:user_home_t:s0).
33
+ 2. When systemd launches the service, it executes the script in a more restricted
34
+ domain context. SELinux enforces that service scripts must have a context
35
+ allowing execution from the systemd context.
36
+ 3. The user_home_t label applied during installation does not permit execution by
37
+ systemd, so the exec() syscall is denied before the process can start.
38
+ 4. Running ./run.sh directly in an interactive shell works because interactive
39
+ shells run in a more permissive SELinux context that allows user_home_t exec.
40
+
41
+ Exit code 203/EXEC specifically means systemd failed during exec() — not during
42
+ runtime — confirming SELinux is the blocker rather than a configuration or
43
+ dependency issue.
44
+ fix: |
45
+ Apply the correct SELinux security context to the runner service scripts using
46
+ the chcon command. The usr_t type permits execution by systemd service contexts.
47
+
48
+ Step 1 — Fix runsvc.sh context (required):
49
+ cd /path/to/runner
50
+ sudo chcon system_u:object_r:usr_t:s0 runsvc.sh
51
+
52
+ Step 2 — Fix run.sh context (required if service starts but crashes immediately):
53
+ sudo chcon system_u:object_r:usr_t:s0 run.sh
54
+
55
+ Step 3 — Start the service:
56
+ sudo ./svc.sh start
57
+ sudo ./svc.sh status # Should show: Active: active (running)
58
+
59
+ For persistent context that survives runner upgrades and ./config.sh reinstalls,
60
+ use semanage fcontext to write the context rule permanently. This requires the
61
+ policycoreutils-python-utils package.
62
+ fix_code:
63
+ - language: yaml
64
+ label: "Fix SELinux context — run these commands on the host (not in workflow)"
65
+ code: |
66
+ # Navigate to the runner installation directory
67
+ cd /home/github-runner/actions-runner
68
+
69
+ # Step 1: Fix runsvc.sh SELinux context (required)
70
+ sudo chcon system_u:object_r:usr_t:s0 runsvc.sh
71
+
72
+ # Step 2: Fix run.sh as well (needed if service crashes immediately after start)
73
+ sudo chcon system_u:object_r:usr_t:s0 run.sh
74
+
75
+ # Step 3: Start the runner service
76
+ sudo ./svc.sh start
77
+
78
+ # Step 4: Verify the service is running
79
+ sudo ./svc.sh status
80
+ # Expected output: Active: active (running)
81
+
82
+ - language: yaml
83
+ label: "Persistent SELinux context via semanage (survives reinstalls)"
84
+ code: |
85
+ # Install policycoreutils-python-utils if semanage is not available
86
+ # sudo dnf install policycoreutils-python-utils
87
+
88
+ RUNNER_DIR="/home/github-runner/actions-runner"
89
+
90
+ # Add permanent file context rules
91
+ sudo semanage fcontext -a -t usr_t "${RUNNER_DIR}/runsvc.sh"
92
+ sudo semanage fcontext -a -t usr_t "${RUNNER_DIR}/run.sh"
93
+
94
+ # Apply rules to existing files
95
+ sudo restorecon -v "${RUNNER_DIR}/runsvc.sh"
96
+ sudo restorecon -v "${RUNNER_DIR}/run.sh"
97
+
98
+ # Verify contexts are set correctly
99
+ ls -lZ "${RUNNER_DIR}/runsvc.sh" "${RUNNER_DIR}/run.sh"
100
+ # Expected: system_u:object_r:usr_t:s0
101
+
102
+ # Start the runner service
103
+ sudo ./svc.sh start
104
+ prevention:
105
+ - "After ./config.sh on SELinux-enforcing systems, always run chcon on runsvc.sh before ./svc.sh start."
106
+ - "Use semanage fcontext for persistent context that survives runner upgrades and reinstalls."
107
+ - "Add chcon steps to your runner provisioning runbooks and Ansible/Terraform automation."
108
+ - "Verify SELinux denials with: sudo ausearch -m avc -ts recent | grep runner"
109
+ - "Consider using the RHEL runner container image which handles SELinux context automatically."
110
+ docs:
111
+ - url: "https://stackoverflow.com/questions/71818706/github-self-hosted-runner-fails-to-run-as-a-service-on-rh-linux"
112
+ label: "Stack Overflow: Self-hosted runner fails as service on RH Linux (17-vote answer)"
113
+ - url: "https://docs.github.com/en/actions/hosting-your-own-runners/managing-self-hosted-runners/configuring-the-self-hosted-runner-application-as-a-service"
114
+ label: "GitHub Docs: Configuring the self-hosted runner as a service"
115
+ - url: "https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/8/html/using_selinux/changing-selinux-contexts_using-selinux"
116
+ label: "Red Hat Docs: Changing SELinux file contexts with chcon"