@htekdev/actions-debugger 1.0.124 → 1.0.126
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.
- package/errors/caching-artifacts/caching-artifacts-073.yml +100 -0
- package/errors/caching-artifacts/caching-artifacts-074.yml +117 -0
- package/errors/concurrency-timing/concurrency-timing-059.yml +146 -0
- package/errors/concurrency-timing/concurrency-timing-060.yml +144 -0
- package/errors/known-unsolved/known-unsolved-071.yml +122 -0
- package/errors/known-unsolved/known-unsolved-072.yml +143 -0
- package/errors/known-unsolved/known-unsolved-073.yml +172 -0
- package/errors/permissions-auth/permissions-auth-071.yml +144 -0
- package/errors/permissions-auth/permissions-auth-072.yml +112 -0
- package/errors/permissions-auth/permissions-auth-073.yml +127 -0
- package/errors/permissions-auth/permissions-auth-074.yml +106 -0
- package/errors/permissions-auth/permissions-auth-075.yml +137 -0
- package/errors/runner-environment/runner-environment-227.yml +106 -0
- package/errors/runner-environment/runner-environment-228.yml +117 -0
- package/errors/runner-environment/runner-environment-229.yml +119 -0
- package/errors/runner-environment/runner-environment-230.yml +129 -0
- package/errors/runner-environment/runner-environment-231.yml +90 -0
- package/errors/runner-environment/runner-environment-232.yml +131 -0
- package/errors/runner-environment/runner-environment-233.yml +90 -0
- package/errors/runner-environment/runner-environment-234.yml +114 -0
- package/errors/runner-environment/runner-environment-235.yml +151 -0
- package/errors/silent-failures/silent-failures-112.yml +97 -0
- package/errors/silent-failures/silent-failures-113.yml +110 -0
- package/errors/silent-failures/silent-failures-114.yml +116 -0
- package/errors/silent-failures/silent-failures-115.yml +130 -0
- package/errors/silent-failures/silent-failures-116.yml +117 -0
- package/errors/silent-failures/silent-failures-117.yml +137 -0
- package/errors/silent-failures/silent-failures-118.yml +156 -0
- package/errors/triggers/triggers-072.yml +150 -0
- package/errors/yaml-syntax/yaml-syntax-075.yml +128 -0
- package/errors/yaml-syntax/yaml-syntax-076.yml +107 -0
- package/package.json +1 -1
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
id: runner-environment-229
|
|
2
|
+
title: 'runner-container-hooks v0.8.0+ breaks local composite actions and event.json in Kubernetes job containers'
|
|
3
|
+
category: runner-environment
|
|
4
|
+
severity: error
|
|
5
|
+
tags:
|
|
6
|
+
- runner-container-hooks
|
|
7
|
+
- kubernetes
|
|
8
|
+
- ARC
|
|
9
|
+
- local-actions
|
|
10
|
+
- composite-action
|
|
11
|
+
- job-container
|
|
12
|
+
- GITHUB_EVENT_PATH
|
|
13
|
+
patterns:
|
|
14
|
+
- regex: "Can't find 'action\\.yml', 'action\\.yaml' or 'Dockerfile' under '.+\\.github/actions/.+'"
|
|
15
|
+
flags: 'i'
|
|
16
|
+
- regex: 'GITHUB_EVENT_PATH .+/github/workflow/event\\.json does not exist'
|
|
17
|
+
flags: 'i'
|
|
18
|
+
- regex: 'Did you forget to run actions/checkout before running your local action'
|
|
19
|
+
flags: 'i'
|
|
20
|
+
error_messages:
|
|
21
|
+
- "Error: Can't find 'action.yml', 'action.yaml' or 'Dockerfile' under '/home/runner/_work/<repo>/<repo>/.github/actions/<action-name>'. Did you forget to run actions/checkout before running your local action?"
|
|
22
|
+
- "GITHUB_EVENT_PATH /github/workflow/event.json does not exist"
|
|
23
|
+
root_cause: |
|
|
24
|
+
In `runner-container-hooks` v0.8.0 (released with actions-runner v2.334.0),
|
|
25
|
+
PR #244 replaced the shared PersistentVolumeClaim (PVC) between the runner
|
|
26
|
+
pod and job pods with exec-based file copying.
|
|
27
|
+
|
|
28
|
+
Two distinct regressions were introduced:
|
|
29
|
+
|
|
30
|
+
**1. Local composite actions fail ("Can't find action.yml")**
|
|
31
|
+
In `runScriptStep`, only the `_temp` directory is synced back from the job
|
|
32
|
+
pod to the runner host after each step. When `actions/checkout` runs inside
|
|
33
|
+
the job pod, the entire repository (including `.github/actions/`) is written
|
|
34
|
+
to `/__w/<owner>/<repo>/` inside the pod — but it is never copied back to
|
|
35
|
+
the runner host filesystem.
|
|
36
|
+
|
|
37
|
+
The runner resolves local actions by reading `action.yml` from its own
|
|
38
|
+
filesystem before dispatching the hook for that step. Since the workspace
|
|
39
|
+
was never synced back, the runner cannot find the action definition and
|
|
40
|
+
fails with the "Did you forget to run actions/checkout?" error — even
|
|
41
|
+
though checkout ran successfully inside the pod.
|
|
42
|
+
|
|
43
|
+
`runContainerStep` is not affected: it copies the full `/__w` back from
|
|
44
|
+
the job pod because container action steps run in a separate pod.
|
|
45
|
+
|
|
46
|
+
**2. GITHUB_EVENT_PATH missing for jobs without custom volume mounts**
|
|
47
|
+
In v0.7.0, `/github/home` and `/github/workflow` were set up as volume
|
|
48
|
+
subPath mounts on every job container. PR #244 replaced these mounts with
|
|
49
|
+
a `prepareJobScript` call that copies these directories into place — but
|
|
50
|
+
only when `args.container.userMountVolumes` is non-empty. If the workflow
|
|
51
|
+
has no custom `volumes:` in the `container:` block, the script never runs
|
|
52
|
+
and `/github/workflow/event.json` is never created.
|
|
53
|
+
|
|
54
|
+
Any action that reads `GITHUB_EVENT_PATH` (e.g. `dorny/paths-filter`,
|
|
55
|
+
`tj-actions/changed-files`, `actions/github-script` reading the event
|
|
56
|
+
payload) then fails because the file does not exist.
|
|
57
|
+
|
|
58
|
+
Both regressions affect Kubernetes-based ARC (Actions Runner Controller)
|
|
59
|
+
setups using runner-container-hooks v0.8.0+. Standard GitHub-hosted runners
|
|
60
|
+
and self-hosted runners that do NOT use container-hooks are unaffected.
|
|
61
|
+
fix: |
|
|
62
|
+
**Immediate workaround:**
|
|
63
|
+
Pin `runner-container-hooks` to v0.7.0 by setting the container hooks
|
|
64
|
+
image in your ARC `HorizontalRunnerAutoscaler` or `RunnerDeployment`
|
|
65
|
+
configuration to use the v0.7.0 bundle (included in
|
|
66
|
+
`ghcr.io/actions/actions-runner:2.333.0`).
|
|
67
|
+
|
|
68
|
+
**For the local action failure specifically:**
|
|
69
|
+
After a fix is available upstream, the recommended approach is to upgrade
|
|
70
|
+
to a patched version of `runner-container-hooks` that copies `.github/`
|
|
71
|
+
back from the job pod after each `runScriptStep`.
|
|
72
|
+
|
|
73
|
+
**For the GITHUB_EVENT_PATH issue specifically:**
|
|
74
|
+
Ensure your `container:` block includes at least one `volumes:` entry to
|
|
75
|
+
trigger `prepareJobScript`, or wait for the upstream fix that unconditionally
|
|
76
|
+
runs the prepare script.
|
|
77
|
+
|
|
78
|
+
Track the upstream fix in actions/runner-container-hooks#337.
|
|
79
|
+
fix_code:
|
|
80
|
+
- language: yaml
|
|
81
|
+
label: 'Pin ARC runner to actions-runner v2.333.0 (uses hooks v0.7.0) to avoid regression'
|
|
82
|
+
code: |
|
|
83
|
+
# In your HorizontalRunnerAutoscaler spec, pin the runner image
|
|
84
|
+
# to the last version that uses runner-container-hooks v0.7.0:
|
|
85
|
+
spec:
|
|
86
|
+
template:
|
|
87
|
+
spec:
|
|
88
|
+
image: ghcr.io/actions/actions-runner:2.333.0
|
|
89
|
+
- language: yaml
|
|
90
|
+
label: 'Workaround for GITHUB_EVENT_PATH: add a dummy volume mount to trigger prepareJobScript'
|
|
91
|
+
code: |
|
|
92
|
+
jobs:
|
|
93
|
+
build:
|
|
94
|
+
runs-on: self-hosted
|
|
95
|
+
container:
|
|
96
|
+
image: my-ci-image:latest
|
|
97
|
+
# Adding any volume entry triggers prepareJobScript and restores
|
|
98
|
+
# /github/workflow/event.json inside the job container
|
|
99
|
+
volumes:
|
|
100
|
+
- /tmp:/tmp
|
|
101
|
+
steps:
|
|
102
|
+
- uses: actions/checkout@v4
|
|
103
|
+
- uses: dorny/paths-filter@v3
|
|
104
|
+
with:
|
|
105
|
+
filters: |
|
|
106
|
+
src:
|
|
107
|
+
- 'src/**'
|
|
108
|
+
prevention:
|
|
109
|
+
- 'When upgrading ARC runner images, check the bundled runner-container-hooks version and validate that local composite actions still work after the upgrade.'
|
|
110
|
+
- 'Pin runner images to a specific version tag rather than `latest` so unexpected upgrades do not break your workflows.'
|
|
111
|
+
- 'After upgrading runner-container-hooks, run a canary workflow that (a) uses a local composite action and (b) uses an action that reads GITHUB_EVENT_PATH to catch both regressions early.'
|
|
112
|
+
- 'Monitor the actions/runner-container-hooks releases page and the linked issue #337 for the official fix.'
|
|
113
|
+
docs:
|
|
114
|
+
- url: 'https://github.com/actions/runner-container-hooks/issues/337'
|
|
115
|
+
label: 'actions/runner-container-hooks#337 — Local actions fail after PR #244 removed shared volume'
|
|
116
|
+
- url: 'https://github.com/actions/runner-container-hooks/pull/244'
|
|
117
|
+
label: 'actions/runner-container-hooks#244 — Remove dependency on the runner''s volume (introduced regression)'
|
|
118
|
+
- url: 'https://docs.github.com/en/actions/hosting-your-own-runners/managing-self-hosted-runners-with-actions-runner-controller/about-actions-runner-controller'
|
|
119
|
+
label: 'GitHub Docs — About Actions Runner Controller'
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
id: runner-environment-230
|
|
2
|
+
title: 'setup-python installs free-threaded Python (3.13t / 3.14t) as broken 0-byte symlink on windows-11-arm64'
|
|
3
|
+
category: runner-environment
|
|
4
|
+
severity: error
|
|
5
|
+
tags:
|
|
6
|
+
- setup-python
|
|
7
|
+
- free-threaded
|
|
8
|
+
- python-3.13t
|
|
9
|
+
- python-3.14t
|
|
10
|
+
- windows-11-arm64
|
|
11
|
+
- symlink
|
|
12
|
+
- arm64
|
|
13
|
+
- GIL
|
|
14
|
+
patterns:
|
|
15
|
+
- regex: 'Remove-Item.+arm64-freethreaded.+python\.exe.+because it does not exist'
|
|
16
|
+
flags: 'i'
|
|
17
|
+
- regex: 'Fatal Python error: Failed to import encodings module'
|
|
18
|
+
flags: 'i'
|
|
19
|
+
- regex: 'ModuleNotFoundError: No module named .encodings.'
|
|
20
|
+
flags: 'i'
|
|
21
|
+
- regex: 'Error happened during pip installation / upgrade'
|
|
22
|
+
flags: 'i'
|
|
23
|
+
error_messages:
|
|
24
|
+
- "[error] Remove-Item : Cannot find path 'C:\\hostedtoolcache\\windows\\Python\\3.13.3-freethreaded\\arm64-freethreaded\\python.exe' because it does not exist."
|
|
25
|
+
- '[error] Fatal Python error: Failed to import encodings module'
|
|
26
|
+
- '[error] ModuleNotFoundError: No module named ''encodings'''
|
|
27
|
+
- '[error] Error happened during pip installation / upgrade'
|
|
28
|
+
root_cause: |
|
|
29
|
+
The `win32-arm64-freethreaded` distribution zip for Python 3.13t and 3.14t
|
|
30
|
+
contains `python.exe` and `python3.exe` as **symlinks** (Windows reparse
|
|
31
|
+
points) that point to the version-specific binary (e.g. `python3.13t.exe`).
|
|
32
|
+
|
|
33
|
+
When `actions/setup-python` extracts the zip to the tool cache, the symlink
|
|
34
|
+
target does not exist at the expected relative path inside the extracted
|
|
35
|
+
directory. This leaves `python.exe` and `python3.exe` as **dangling 0-byte
|
|
36
|
+
reparse points** rather than working executables.
|
|
37
|
+
|
|
38
|
+
The setup script (`setup.ps1`, line 131) then attempts to remove `python.exe`
|
|
39
|
+
before placing the shim — but because the file is a dangling reparse point,
|
|
40
|
+
PowerShell cannot find it and throws:
|
|
41
|
+
|
|
42
|
+
`Remove-Item : Cannot find path '...\arm64-freethreaded\python.exe'
|
|
43
|
+
because it does not exist.`
|
|
44
|
+
|
|
45
|
+
Even if this error is swallowed, any subsequent attempt to invoke the
|
|
46
|
+
interpreter fails because the `python.exe` reparse point has no valid target.
|
|
47
|
+
The interpreter cannot locate its standard library, resulting in:
|
|
48
|
+
|
|
49
|
+
`Fatal Python error: Failed to import encodings module`
|
|
50
|
+
|
|
51
|
+
Non-free-threaded arm64 builds (`3.11`, `3.12`, `3.13`) are NOT affected
|
|
52
|
+
because their zips contain real executable files rather than symlinks.
|
|
53
|
+
x64 free-threaded builds are also unaffected.
|
|
54
|
+
|
|
55
|
+
This bug is present in `actions/setup-python` v5.x and v6.x when
|
|
56
|
+
`windows-11-arm64` runners are used. It was reported in April 2026 and
|
|
57
|
+
assigned for fix; check actions/setup-python#1307 for the patched release.
|
|
58
|
+
fix: |
|
|
59
|
+
**Workaround 1 (recommended until patched):** Use a non-arm64 runner for
|
|
60
|
+
free-threaded Python testing. The x64 free-threaded wheels work correctly on
|
|
61
|
+
`windows-latest` or `windows-2025`:
|
|
62
|
+
|
|
63
|
+
```yaml
|
|
64
|
+
runs-on: windows-latest # x64 runner
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
**Workaround 2:** Install free-threaded Python from NuGet on arm64 runners
|
|
68
|
+
rather than using `actions/setup-python`:
|
|
69
|
+
|
|
70
|
+
```powershell
|
|
71
|
+
nuget install Microsoft.Python.Python.3.13-freethreaded.Arm64 -Version 3.13.3 -OutputDirectory .python
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
**Workaround 3:** If you need arm64 + free-threaded specifically, test on
|
|
75
|
+
a Linux arm64 runner (`ubuntu-24.04-arm`) where the free-threaded build
|
|
76
|
+
does not have the symlink issue.
|
|
77
|
+
|
|
78
|
+
**Long-term:** Upgrade to the patched `actions/setup-python` version once
|
|
79
|
+
released (track actions/setup-python#1307).
|
|
80
|
+
fix_code:
|
|
81
|
+
- language: yaml
|
|
82
|
+
label: 'Run free-threaded Python tests on x64 instead of arm64 until fix ships'
|
|
83
|
+
code: |
|
|
84
|
+
jobs:
|
|
85
|
+
test-freethreaded:
|
|
86
|
+
# Use x64 runner — free-threaded Python on windows-11-arm64 is broken
|
|
87
|
+
# (setup-python#1307). Switch back when the fix ships.
|
|
88
|
+
runs-on: windows-latest
|
|
89
|
+
steps:
|
|
90
|
+
- uses: actions/checkout@v4
|
|
91
|
+
- uses: actions/setup-python@v6
|
|
92
|
+
with:
|
|
93
|
+
python-version: '3.13t' # free-threaded; works on x64
|
|
94
|
+
- run: python --version
|
|
95
|
+
- run: python -c "import sys; print(sys._is_gil_enabled())"
|
|
96
|
+
- language: yaml
|
|
97
|
+
label: 'Use a matrix to run standard Python on arm64 and free-threaded on x64'
|
|
98
|
+
code: |
|
|
99
|
+
jobs:
|
|
100
|
+
test:
|
|
101
|
+
strategy:
|
|
102
|
+
matrix:
|
|
103
|
+
include:
|
|
104
|
+
# Standard arm64 — works fine
|
|
105
|
+
- os: windows-11-arm64
|
|
106
|
+
python-version: '3.13'
|
|
107
|
+
# Free-threaded — x64 only until setup-python#1307 is fixed
|
|
108
|
+
- os: windows-latest
|
|
109
|
+
python-version: '3.13t'
|
|
110
|
+
runs-on: ${{ matrix.os }}
|
|
111
|
+
steps:
|
|
112
|
+
- uses: actions/checkout@v4
|
|
113
|
+
- uses: actions/setup-python@v6
|
|
114
|
+
with:
|
|
115
|
+
python-version: ${{ matrix.python-version }}
|
|
116
|
+
prevention:
|
|
117
|
+
- 'When adding free-threaded Python (3.13t, 3.14t) to a matrix, verify the runner OS — windows-11-arm64 has a broken symlink issue; use windows-latest (x64) instead.'
|
|
118
|
+
- 'Pin actions/setup-python to a known-good version and monitor actions/setup-python#1307 for the fix release before upgrading on arm64 free-threaded jobs.'
|
|
119
|
+
- 'After setting up free-threaded Python, add a smoke-test step (`python -c "import sys; print(sys.version)"`) early in the job to catch a broken interpreter before the full test suite runs.'
|
|
120
|
+
- 'Check that python.exe in the tool cache is a real executable, not a 0-byte reparse point, by running `(Get-Item python.exe).Length -gt 0` in a PowerShell step on windows-arm64.'
|
|
121
|
+
docs:
|
|
122
|
+
- url: 'https://github.com/actions/setup-python/issues/1307'
|
|
123
|
+
label: 'actions/setup-python#1307 — setup-python fails for free-threaded Python (3.13t / 3.14t) on windows-11-arm64'
|
|
124
|
+
- url: 'https://github.com/onnx/onnx/actions/runs/24930991133'
|
|
125
|
+
label: 'Example failing CI run (onnx/onnx)'
|
|
126
|
+
- url: 'https://docs.python.org/3/whatsnew/3.13.html#free-threaded-cpython'
|
|
127
|
+
label: 'Python 3.13 — Free-threaded CPython (experimental no-GIL build)'
|
|
128
|
+
- url: 'https://github.com/actions/setup-python'
|
|
129
|
+
label: 'actions/setup-python — GitHub repository'
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
id: runner-environment-231
|
|
2
|
+
title: 'setup-java hangs indefinitely at "Trying to resolve the latest version from remote"'
|
|
3
|
+
category: runner-environment
|
|
4
|
+
severity: error
|
|
5
|
+
tags:
|
|
6
|
+
- setup-java
|
|
7
|
+
- version-resolution
|
|
8
|
+
- hang
|
|
9
|
+
- network
|
|
10
|
+
- JDK
|
|
11
|
+
- distribution
|
|
12
|
+
- timeout
|
|
13
|
+
- temurin
|
|
14
|
+
patterns:
|
|
15
|
+
- regex: 'Trying to resolve the latest version from remote'
|
|
16
|
+
flags: 'i'
|
|
17
|
+
- regex: 'setup-java.+Trying to resolve.+version'
|
|
18
|
+
flags: 'i'
|
|
19
|
+
error_messages:
|
|
20
|
+
- 'Trying to resolve the latest version from remote'
|
|
21
|
+
root_cause: |
|
|
22
|
+
When `java-version` is specified without a full patch version (e.g., `'21'`
|
|
23
|
+
or `'17'`), `actions/setup-java` must contact the JDK distribution's upstream
|
|
24
|
+
release manifest API to resolve the latest matching release. Before the fix
|
|
25
|
+
added in later versions of the action, this HTTP request was issued without a
|
|
26
|
+
timeout. When the upstream distribution endpoint (Eclipse Temurin, Amazon
|
|
27
|
+
Corretto, Microsoft JDK, etc.) was slow or unreachable — even transiently —
|
|
28
|
+
the resolution step could stall indefinitely, wedging the job until the
|
|
29
|
+
workflow-level `timeout-minutes` expired.
|
|
30
|
+
|
|
31
|
+
This affected all distributions that require a remote lookup for the latest
|
|
32
|
+
version, and was particularly impactful in environments with restricted or
|
|
33
|
+
intermittently degraded outbound network connectivity. The action would print
|
|
34
|
+
"Trying to resolve the latest version from remote" and then produce no further
|
|
35
|
+
output until the job hit its overall timeout.
|
|
36
|
+
|
|
37
|
+
The root cause was reported with 24+ community reactions in
|
|
38
|
+
actions/setup-java#897. The action was subsequently updated with improved
|
|
39
|
+
retry logic and enhanced error messages that surface the endpoint being
|
|
40
|
+
queried, making failures diagnosable.
|
|
41
|
+
fix: |
|
|
42
|
+
**Immediate workaround (always recommended):** Pin an explicit full or
|
|
43
|
+
three-part version to bypass the remote manifest lookup entirely:
|
|
44
|
+
|
|
45
|
+
```yaml
|
|
46
|
+
- uses: actions/setup-java@v4
|
|
47
|
+
with:
|
|
48
|
+
java-version: '21.0.3' # Explicit patch version — no remote resolution needed
|
|
49
|
+
distribution: 'temurin'
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
**Alternative:** Upgrade `actions/setup-java` to the version that includes
|
|
53
|
+
retry/timeout improvements (v4.2.2 or later). The updated action adds
|
|
54
|
+
timeouts and surfaces the endpoint URL in error output so stalls are
|
|
55
|
+
diagnosable rather than silent hangs.
|
|
56
|
+
|
|
57
|
+
**For self-hosted runners with restricted outbound access:** Explicitly add
|
|
58
|
+
the JDK distribution manifest endpoints to your allowlist, or pin exact
|
|
59
|
+
versions to eliminate remote lookups entirely.
|
|
60
|
+
fix_code:
|
|
61
|
+
- language: yaml
|
|
62
|
+
label: 'Pin explicit patch version to avoid remote resolution'
|
|
63
|
+
code: |
|
|
64
|
+
- name: Set up JDK 21
|
|
65
|
+
uses: actions/setup-java@v4
|
|
66
|
+
with:
|
|
67
|
+
# Explicit 3-part version — skips "Trying to resolve the latest
|
|
68
|
+
# version from remote" entirely
|
|
69
|
+
java-version: '21.0.3'
|
|
70
|
+
distribution: 'temurin'
|
|
71
|
+
- language: yaml
|
|
72
|
+
label: 'Use version file to avoid hardcoding version while skipping remote lookup'
|
|
73
|
+
code: |
|
|
74
|
+
# Define your JDK version in .java-version or .tool-versions
|
|
75
|
+
# When java-version-file is present, no remote lookup is needed:
|
|
76
|
+
- name: Set up JDK
|
|
77
|
+
uses: actions/setup-java@v4
|
|
78
|
+
with:
|
|
79
|
+
java-version-file: '.java-version'
|
|
80
|
+
distribution: 'temurin'
|
|
81
|
+
prevention:
|
|
82
|
+
- 'Always pin an explicit JDK patch version (e.g., 21.0.3) or use a version file to eliminate remote manifest lookups and prevent hang-on-stall failures.'
|
|
83
|
+
- 'Set `timeout-minutes` on individual steps or jobs so a stalled remote lookup kills the step quickly rather than consuming the full runner allocation.'
|
|
84
|
+
- 'Monitor outbound network connectivity from self-hosted runners to JDK distribution APIs (e.g., api.adoptium.net for Temurin) and add these endpoints to firewall/proxy allowlists.'
|
|
85
|
+
- 'Use `actions/setup-java@v4.2.2` or later which includes retry logic and improved error messages for remote resolution failures.'
|
|
86
|
+
docs:
|
|
87
|
+
- url: 'https://github.com/actions/setup-java/issues/897'
|
|
88
|
+
label: 'actions/setup-java#897 — Trying to resolve the latest version from remote (indefinite hang)'
|
|
89
|
+
- url: 'https://github.com/actions/setup-java#supported-version-syntax'
|
|
90
|
+
label: 'actions/setup-java — Supported version syntax (pin exact versions to avoid remote lookup)'
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
id: runner-environment-232
|
|
2
|
+
title: 'Self-hosted runner started as a service (svc.sh/svc.cmd) does not load user PATH from shell profile'
|
|
3
|
+
category: runner-environment
|
|
4
|
+
severity: error
|
|
5
|
+
tags:
|
|
6
|
+
- self-hosted
|
|
7
|
+
- PATH
|
|
8
|
+
- svc.sh
|
|
9
|
+
- service
|
|
10
|
+
- environment-variables
|
|
11
|
+
- bash
|
|
12
|
+
- profile
|
|
13
|
+
- command-not-found
|
|
14
|
+
patterns:
|
|
15
|
+
- regex: '(?:command not found|No such file or directory).+(?:\/home\/.+\/|~\/.+\/|GOPATH|cargo\/bin|\.local\/bin)'
|
|
16
|
+
flags: 'i'
|
|
17
|
+
- regex: '(?:bash|sh):.+: (?:command not found|No such file or directory)'
|
|
18
|
+
flags: 'i'
|
|
19
|
+
error_messages:
|
|
20
|
+
- '/bin/bash: my-tool: command not found'
|
|
21
|
+
- 'bash: /home/runner/.local/bin/my-tool: No such file or directory'
|
|
22
|
+
- 'Error: Unable to locate executable file: my-tool. Please verify either the file path exists or the file can be found within a directory specified by the PATH environment variable.'
|
|
23
|
+
root_cause: |
|
|
24
|
+
When the self-hosted runner is registered and started as a system service
|
|
25
|
+
using `svc.sh install && svc.sh start` (Linux/macOS) or
|
|
26
|
+
`svc.cmd install` (Windows), the service is launched by the OS service
|
|
27
|
+
manager (systemd, launchd, or Windows SCM) rather than interactively by
|
|
28
|
+
the user. As a result:
|
|
29
|
+
|
|
30
|
+
1. **Shell profile files are NOT sourced.** The service process never runs
|
|
31
|
+
`~/.bashrc`, `~/.bash_profile`, `~/.profile`, or `~/.zshrc`, so any
|
|
32
|
+
`export PATH=...` statements in those files have no effect on the runner
|
|
33
|
+
process or any job steps it spawns.
|
|
34
|
+
|
|
35
|
+
2. **Step shells use `--noprofile --norc` by default.** Even when job steps
|
|
36
|
+
invoke `bash`, the runner uses `bash --noprofile --norc -e -o pipefail`
|
|
37
|
+
(or equivalent), which explicitly disables sourcing of profile files.
|
|
38
|
+
This means binaries installed in user-specific directories — such as
|
|
39
|
+
`~/.local/bin`, `~/.cargo/bin`, `~/go/bin`, `~/.nvm/versions/node/*/bin`,
|
|
40
|
+
or any path added via `nvm`, `rbenv`, `pyenv`, `asdf`, etc. — are missing
|
|
41
|
+
from `PATH` in job steps even if they work fine in an interactive terminal.
|
|
42
|
+
|
|
43
|
+
3. **The runner's `.env` file is the authoritative PATH source.** The runner
|
|
44
|
+
process reads environment variables from a `.env` file at startup
|
|
45
|
+
(typically at `<runner-install-dir>/.env`). This file is NOT automatically
|
|
46
|
+
populated when the service is installed.
|
|
47
|
+
|
|
48
|
+
This is a common trap when developers install tools as their user (e.g.,
|
|
49
|
+
`cargo install`, `npm install -g`, `go install`, `pip install --user`) and
|
|
50
|
+
then register a self-hosted runner. Everything works in an interactive
|
|
51
|
+
terminal but fails when the service-started runner tries to execute the same
|
|
52
|
+
commands.
|
|
53
|
+
fix: |
|
|
54
|
+
**Option 1 (recommended): Add paths to the runner's `.env` file**
|
|
55
|
+
Edit `<runner-install-dir>/.env` and append the needed PATH entries. The
|
|
56
|
+
runner reads this file at startup and merges it into the environment for all
|
|
57
|
+
job steps:
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
# Append to <runner-install-dir>/.env
|
|
61
|
+
PATH=/home/runner/.cargo/bin:/home/runner/.local/bin:/home/runner/go/bin:$PATH
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
Restart the service after editing: `sudo svc.sh stop && sudo svc.sh start`
|
|
65
|
+
|
|
66
|
+
**Option 2: Use `$GITHUB_PATH` in the workflow**
|
|
67
|
+
Add a step early in the job to append the needed paths using the
|
|
68
|
+
`$GITHUB_PATH` mechanism — this persists for all subsequent steps in the job:
|
|
69
|
+
|
|
70
|
+
```yaml
|
|
71
|
+
- name: Add user bins to PATH
|
|
72
|
+
run: echo "$HOME/.local/bin" >> $GITHUB_PATH
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
**Option 3: Start the runner interactively (development/testing only)**
|
|
76
|
+
Use `./run.sh` instead of the service to start the runner in an interactive
|
|
77
|
+
session that sources your shell profile. This is useful for debugging but
|
|
78
|
+
not suitable for production.
|
|
79
|
+
|
|
80
|
+
**Option 4: Change step shell to a login shell**
|
|
81
|
+
Override the shell at the step level to source the user profile:
|
|
82
|
+
|
|
83
|
+
```yaml
|
|
84
|
+
- name: Run with login shell
|
|
85
|
+
shell: 'bash --login -e {0}'
|
|
86
|
+
run: my-tool --version
|
|
87
|
+
```
|
|
88
|
+
fix_code:
|
|
89
|
+
- language: yaml
|
|
90
|
+
label: 'Append user bin paths to runner PATH via .env file (persistent, affects all jobs)'
|
|
91
|
+
code: |
|
|
92
|
+
# Run this once on the self-hosted runner host:
|
|
93
|
+
# echo "PATH=/home/runner/.cargo/bin:/home/runner/.local/bin:$PATH" >> /home/runner/actions-runner/.env
|
|
94
|
+
# Then restart the runner service: sudo ./svc.sh stop && sudo ./svc.sh start
|
|
95
|
+
#
|
|
96
|
+
# In your workflow, the tool will now be found without any PATH workaround:
|
|
97
|
+
- name: Use cargo-installed tool
|
|
98
|
+
run: my-tool --version
|
|
99
|
+
- language: yaml
|
|
100
|
+
label: 'Append missing path per-job using $GITHUB_PATH'
|
|
101
|
+
code: |
|
|
102
|
+
jobs:
|
|
103
|
+
build:
|
|
104
|
+
runs-on: [self-hosted, linux]
|
|
105
|
+
steps:
|
|
106
|
+
- name: Add cargo bin to PATH
|
|
107
|
+
run: echo "$HOME/.cargo/bin" >> $GITHUB_PATH
|
|
108
|
+
|
|
109
|
+
- name: Use cargo-installed tool
|
|
110
|
+
run: my-tool --version # Now visible because GITHUB_PATH was updated
|
|
111
|
+
- language: yaml
|
|
112
|
+
label: 'Use login shell on a single step to source ~/.profile'
|
|
113
|
+
code: |
|
|
114
|
+
- name: Run with login shell (sources ~/.profile and ~/.bash_profile)
|
|
115
|
+
shell: 'bash --login -e {0}'
|
|
116
|
+
run: |
|
|
117
|
+
my-tool --version
|
|
118
|
+
prevention:
|
|
119
|
+
- 'After registering a self-hosted runner, verify PATH by running a debug step: `run: echo $PATH && which my-tool` to confirm expected binaries are visible.'
|
|
120
|
+
- 'Document all non-standard tool paths in your `.env` file at runner registration time, before registering as a service, so PATH is correct from the first job.'
|
|
121
|
+
- 'Prefer system-wide tool installations (e.g., `/usr/local/bin/`) over user-specific paths for tools used on self-hosted runners, so the service environment sees them without profile sourcing.'
|
|
122
|
+
- 'When using version managers like nvm, rbenv, pyenv, or asdf, their shims are typically installed into shell-profile-sourced directories and will NOT work in service-started runners without explicit PATH entries in `.env`.'
|
|
123
|
+
docs:
|
|
124
|
+
- url: 'https://github.com/actions/runner/issues/2903'
|
|
125
|
+
label: 'actions/runner#2903 — Runner service does not update PATH when started via svc.sh'
|
|
126
|
+
- url: 'https://github.com/actions/runner/issues/2528'
|
|
127
|
+
label: 'actions/runner#2528 — PATH changes at runtime not applied to runner steps (--noprofile --norc)'
|
|
128
|
+
- url: 'https://docs.github.com/en/actions/hosting-your-own-runners/managing-self-hosted-runners/about-self-hosted-runners#adding-the-runner-to-your-enterprise'
|
|
129
|
+
label: 'GitHub Docs — Self-hosted runner environment configuration'
|
|
130
|
+
- url: 'https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/workflow-commands-for-github-actions#adding-a-system-path'
|
|
131
|
+
label: 'GitHub Docs — Adding a system path (GITHUB_PATH)'
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
id: runner-environment-233
|
|
2
|
+
title: 'actions/checkout < v6.0.3 fails on SHA-256 repositories — fatal: mismatched algorithms: client sha1; server sha256'
|
|
3
|
+
category: runner-environment
|
|
4
|
+
severity: error
|
|
5
|
+
tags:
|
|
6
|
+
- checkout
|
|
7
|
+
- sha256
|
|
8
|
+
- git
|
|
9
|
+
- object-format
|
|
10
|
+
- hash-algorithm
|
|
11
|
+
- repository
|
|
12
|
+
- v6
|
|
13
|
+
patterns:
|
|
14
|
+
- regex: 'fatal: mismatched algorithms: client sha1; server sha256'
|
|
15
|
+
flags: 'i'
|
|
16
|
+
- regex: 'fatal: mismatched algorithms: client sha256; server sha1'
|
|
17
|
+
flags: 'i'
|
|
18
|
+
- regex: 'mismatched algorithms.*sha1.*sha256'
|
|
19
|
+
flags: 'i'
|
|
20
|
+
error_messages:
|
|
21
|
+
- 'fatal: mismatched algorithms: client sha1; server sha256'
|
|
22
|
+
- "The process '/usr/bin/git' failed with exit code 128"
|
|
23
|
+
root_cause: |
|
|
24
|
+
GitHub is progressively rolling out support for SHA-256 object-format repositories
|
|
25
|
+
(also called NewHash or sha256-mode repos). When a repository is SHA-256-mode,
|
|
26
|
+
every git object reference is a 64-character hex SHA-256 hash instead of the
|
|
27
|
+
traditional 40-character SHA-1 hash.
|
|
28
|
+
|
|
29
|
+
Before actions/checkout v6.0.3, the checkout action always initialised the local
|
|
30
|
+
working-tree repository with a plain `git init`, which defaults to SHA-1 object
|
|
31
|
+
format. When the action then attempts to `git fetch` from a SHA-256 remote, git
|
|
32
|
+
detects that the local and remote repositories use different hash algorithms and
|
|
33
|
+
immediately aborts:
|
|
34
|
+
|
|
35
|
+
fatal: mismatched algorithms: client sha1; server sha256
|
|
36
|
+
|
|
37
|
+
The mismatch is unrecoverable — the local repository must be created with
|
|
38
|
+
`git init --object-format=sha256` BEFORE the first fetch. There is no in-place
|
|
39
|
+
conversion.
|
|
40
|
+
|
|
41
|
+
This only affects workflows where the target GitHub repository has been migrated
|
|
42
|
+
to or created as SHA-256 mode. GitHub began rolling out SHA-256 repository creation
|
|
43
|
+
in late 2025; adoption will grow over time. Previously-created SHA-1 repositories
|
|
44
|
+
are unaffected until they are explicitly migrated.
|
|
45
|
+
|
|
46
|
+
The fix shipped in actions/checkout v6.0.3 (June 2, 2026, commit 1cce339).
|
|
47
|
+
It calls the GitHub REST endpoint `GET /repos/{owner}/{repo}/hash-algorithm`
|
|
48
|
+
before `git init` and passes `--object-format=sha256` when the repository is
|
|
49
|
+
SHA-256 mode.
|
|
50
|
+
|
|
51
|
+
Source: actions/checkout#2160, PR#2439.
|
|
52
|
+
fix: |
|
|
53
|
+
Upgrade to actions/checkout@v6.0.3 or later. Version v6.0.3 detects the
|
|
54
|
+
repository's object format via the GitHub API before initialising the local
|
|
55
|
+
git repository and passes the correct `--object-format` flag to `git init`.
|
|
56
|
+
|
|
57
|
+
If you cannot upgrade immediately, set the GIT_DEFAULT_HASH environment variable
|
|
58
|
+
to sha256 before running checkout, then reinitialise manually — but upgrading
|
|
59
|
+
the action is strongly preferred.
|
|
60
|
+
|
|
61
|
+
Note: v6.0.3 introduced a new REST API call (`GET /repos/.../hash-algorithm`) on
|
|
62
|
+
every checkout, which can cause secondary rate-limit issues for organisations with
|
|
63
|
+
very high parallel job counts. See runner-environment-206 for that separate issue.
|
|
64
|
+
fix_code:
|
|
65
|
+
- language: yaml
|
|
66
|
+
label: 'Upgrade to actions/checkout v6.0.3+ to fix SHA-256 repository support'
|
|
67
|
+
code: |
|
|
68
|
+
- uses: actions/checkout@v6.0.3
|
|
69
|
+
with:
|
|
70
|
+
fetch-depth: 1
|
|
71
|
+
- language: yaml
|
|
72
|
+
label: 'Pin to v6.0.3+ by SHA for reproducibility (recommended for security-sensitive workflows)'
|
|
73
|
+
code: |
|
|
74
|
+
# Pin to the exact commit SHA of v6.0.3 to lock the version
|
|
75
|
+
- uses: actions/checkout@1cce3390c2bfda521930d01229c073c7ff920824 # v6.0.3
|
|
76
|
+
with:
|
|
77
|
+
fetch-depth: 1
|
|
78
|
+
prevention:
|
|
79
|
+
- 'Always pin to a specific patch version of actions/checkout (e.g., @v6.0.3) rather than a floating major tag (@v6), so breaking changes from new GitHub repository features land on your own schedule'
|
|
80
|
+
- 'If your organisation creates new repositories, check whether SHA-256 mode is the default; SHA-256 repos will silently break all workflows using checkout < v6.0.3'
|
|
81
|
+
- 'Monitor the actions/checkout changelog when upgrading; v6.0.3 also introduced a new API call that can affect rate limits in high-parallelism environments (see runner-environment-206)'
|
|
82
|
+
docs:
|
|
83
|
+
- url: 'https://github.com/actions/checkout/issues/2160'
|
|
84
|
+
label: 'actions/checkout#2160 — hashing mismatch error on SHA-256 repository'
|
|
85
|
+
- url: 'https://github.com/actions/checkout/pull/2439'
|
|
86
|
+
label: 'actions/checkout PR#2439 — Fix checkout init for SHA-256 repositories (merged June 2026)'
|
|
87
|
+
- url: 'https://github.com/actions/checkout/releases/tag/v6.0.3'
|
|
88
|
+
label: 'actions/checkout v6.0.3 release — SHA-256 repository support'
|
|
89
|
+
- url: 'https://git-scm.com/docs/hash-function-transition'
|
|
90
|
+
label: 'Git documentation — SHA-256 hash function transition'
|