@htekdev/actions-debugger 1.0.112 → 1.0.114
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/cache-corrupt-on-cancel-during-restore-save-always.yml +136 -0
- package/errors/caching-artifacts/restore-keys-asterisk-literal-not-glob.yml +107 -0
- package/errors/concurrency-timing/pull-request-review-shared-concurrency-cancels-ci.yml +131 -0
- package/errors/known-unsolved/github-script-esm-not-supported.yml +111 -0
- package/errors/known-unsolved/job-outputs-string-only-no-array-object.yml +142 -0
- package/errors/permissions-auth/oidc-immutable-sub-claim-new-repo-trust-policy-mismatch.yml +122 -0
- package/errors/permissions-auth/permissions-auth-064.yml +122 -0
- package/errors/permissions-auth/permissions-auth-065.yml +97 -0
- package/errors/permissions-auth/permissions-auth-066.yml +129 -0
- package/errors/runner-environment/arc-kubernetes-checkout-circular-json-container-hook.yml +101 -0
- package/errors/runner-environment/cache-restore-windows-runner-silent-crash.yml +130 -0
- package/errors/runner-environment/git-248-fetch-tags-shallow-clone-regression.yml +100 -0
- package/errors/runner-environment/javascript-actions-alpine-arm64-not-supported.yml +121 -0
- package/errors/runner-environment/runner-environment-185.yml +88 -0
- package/errors/runner-environment/runner-environment-186.yml +95 -0
- package/errors/runner-environment/runner-environment-187.yml +90 -0
- package/errors/runner-environment/runner-environment-188.yml +96 -0
- package/errors/runner-environment/runner-environment-191.yml +147 -0
- package/errors/runner-environment/runner-environment-192.yml +144 -0
- package/errors/runner-environment/runner-environment-193.yml +136 -0
- package/errors/runner-environment/runner-environment-194.yml +86 -0
- package/errors/silent-failures/checkout-v6-clean-false-deletes-workspace-on-repo-change.yml +119 -0
- package/errors/silent-failures/queue-max-silently-ignored-with-cancel-in-progress.yml +109 -0
- package/errors/silent-failures/silent-failures-102.yml +141 -0
- package/errors/silent-failures/silent-failures-104.yml +119 -0
- package/errors/yaml-syntax/yaml-syntax-068.yml +137 -0
- package/errors/yaml-syntax/yaml-syntax-069.yml +118 -0
- package/package.json +1 -1
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
id: runner-environment-196
|
|
2
|
+
title: 'actions/cache restore silently crashes Windows runner — job jumps to Post cleanup with no error'
|
|
3
|
+
category: runner-environment
|
|
4
|
+
severity: silent-failure
|
|
5
|
+
tags:
|
|
6
|
+
- cache
|
|
7
|
+
- windows
|
|
8
|
+
- crash
|
|
9
|
+
- silent-failure
|
|
10
|
+
- cargo
|
|
11
|
+
- large-cache
|
|
12
|
+
- post-cleanup
|
|
13
|
+
patterns:
|
|
14
|
+
- regex: 'Cache hit for:.*\n(?:.*\n){0,3}Post job cleanup'
|
|
15
|
+
flags: 'i'
|
|
16
|
+
- regex: 'Cache hit for:[\s\S]{0,200}Post job cleanup'
|
|
17
|
+
flags: 'i'
|
|
18
|
+
- regex: 'Cache up-to-date\.\s*\(node:\d+\) \[DEP0040\] DeprecationWarning.*punycode'
|
|
19
|
+
flags: 'i'
|
|
20
|
+
error_messages:
|
|
21
|
+
- 'Cache hit for: [key]'
|
|
22
|
+
- 'Post job cleanup.'
|
|
23
|
+
- 'Cache up-to-date.'
|
|
24
|
+
root_cause: |
|
|
25
|
+
On Windows GitHub-hosted runners, actions/cache@v5 can silently crash the Node.js
|
|
26
|
+
runner process during cache restore when extracting very large cache archives (multi-GB
|
|
27
|
+
caches, e.g. Rust/Cargo registry + cache, large Maven/Gradle dependency trees).
|
|
28
|
+
|
|
29
|
+
The failure manifests as the job jumping directly from "Cache hit for: [key]" to
|
|
30
|
+
"Post job cleanup." with no intervening restore log lines and no error message.
|
|
31
|
+
The step exits with code 0 (success), but the cache was never extracted. Subsequent
|
|
32
|
+
build steps fail with missing dependency errors (e.g. "error: no such file or directory:
|
|
33
|
+
~/.cargo/registry") rather than a cache-related error, making the root cause opaque.
|
|
34
|
+
|
|
35
|
+
The log sequence for affected runs:
|
|
36
|
+
1. "Cache hit for: [cache-key]" (restore begins)
|
|
37
|
+
2. [no tar extraction log lines]
|
|
38
|
+
3. "Post job cleanup." (job finishes or runner crashes)
|
|
39
|
+
4. "Cache up-to-date."
|
|
40
|
+
5. "(node:XXXX) [DEP0040] DeprecationWarning: The `punycode` module is deprecated"
|
|
41
|
+
6. "Post job cleanup."
|
|
42
|
+
|
|
43
|
+
Root cause analysis: The Windows runner process (Runner.Worker.exe) terminates
|
|
44
|
+
abnormally during tar/zstd decompression of the cache archive. This appears to be a
|
|
45
|
+
memory-related crash (similar to the Windows heap corruption pattern in upload-artifact,
|
|
46
|
+
tracked in toolkit#2406) triggered by the high memory pressure of decompressing large
|
|
47
|
+
archives within the Node.js 20 heap on Windows runners as of May 2026.
|
|
48
|
+
|
|
49
|
+
The crash is non-deterministic (intermittent) — the same cache key may restore
|
|
50
|
+
successfully on retry. Affected cache sizes are typically 1 GB+ uncompressed.
|
|
51
|
+
Rust Cargo caches (registry/index + registry/cache + git/db) are the most commonly
|
|
52
|
+
reported trigger.
|
|
53
|
+
|
|
54
|
+
Source: actions/cache#1754 (May 2026, Windows runner, Cargo cache).
|
|
55
|
+
fix: |
|
|
56
|
+
Short-term workaround: Add `continue-on-error: true` to the cache restore step.
|
|
57
|
+
The job will proceed to the build step which will then reinstall dependencies from
|
|
58
|
+
scratch. The build takes longer but completes reliably.
|
|
59
|
+
|
|
60
|
+
Preferred workaround: Split the cache into smaller chunks. Rust/Cargo caches can be
|
|
61
|
+
split by caching registry/index, registry/cache, and git/db in separate cache steps
|
|
62
|
+
with different keys, keeping each archive under ~500 MB.
|
|
63
|
+
|
|
64
|
+
Alternative: Use sccache or a remote cache (e.g. Cloudflare R2 + sccache) instead of
|
|
65
|
+
actions/cache for Rust builds on Windows — this avoids large local archives entirely.
|
|
66
|
+
|
|
67
|
+
Long-term: Track actions/cache#1754 for an upstream fix. Adding
|
|
68
|
+
`ACTIONS_STEP_DEBUG: true` as a repository secret may reveal the crash signal in
|
|
69
|
+
verbose runner logs.
|
|
70
|
+
fix_code:
|
|
71
|
+
- language: yaml
|
|
72
|
+
label: 'Short-term: continue-on-error to prevent job failure on crash'
|
|
73
|
+
code: |
|
|
74
|
+
- name: Restore Cargo cache
|
|
75
|
+
uses: actions/cache@v5
|
|
76
|
+
continue-on-error: true # Job proceeds even if cache restore crashes
|
|
77
|
+
with:
|
|
78
|
+
path: |
|
|
79
|
+
~/.cargo/registry/index/
|
|
80
|
+
~/.cargo/registry/cache/
|
|
81
|
+
~/.cargo/git/db/
|
|
82
|
+
target/
|
|
83
|
+
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
|
|
84
|
+
restore-keys: ${{ runner.os }}-cargo-
|
|
85
|
+
|
|
86
|
+
- language: yaml
|
|
87
|
+
label: 'Split large Cargo cache into smaller chunks to avoid crash threshold'
|
|
88
|
+
code: |
|
|
89
|
+
- name: Restore Cargo registry index (small, fast)
|
|
90
|
+
uses: actions/cache@v5
|
|
91
|
+
with:
|
|
92
|
+
path: ~/.cargo/registry/index/
|
|
93
|
+
key: ${{ runner.os }}-cargo-index-${{ hashFiles('**/Cargo.lock') }}
|
|
94
|
+
restore-keys: ${{ runner.os }}-cargo-index-
|
|
95
|
+
|
|
96
|
+
- name: Restore Cargo registry cache (large packages)
|
|
97
|
+
uses: actions/cache@v5
|
|
98
|
+
continue-on-error: true
|
|
99
|
+
with:
|
|
100
|
+
path: ~/.cargo/registry/cache/
|
|
101
|
+
key: ${{ runner.os }}-cargo-cache-${{ hashFiles('**/Cargo.lock') }}
|
|
102
|
+
restore-keys: ${{ runner.os }}-cargo-cache-
|
|
103
|
+
|
|
104
|
+
- name: Restore Cargo git sources
|
|
105
|
+
uses: actions/cache@v5
|
|
106
|
+
continue-on-error: true
|
|
107
|
+
with:
|
|
108
|
+
path: ~/.cargo/git/db/
|
|
109
|
+
key: ${{ runner.os }}-cargo-git-${{ hashFiles('**/Cargo.lock') }}
|
|
110
|
+
|
|
111
|
+
- name: Restore build target dir
|
|
112
|
+
uses: actions/cache@v5
|
|
113
|
+
continue-on-error: true
|
|
114
|
+
with:
|
|
115
|
+
path: target/
|
|
116
|
+
key: ${{ runner.os }}-cargo-target-${{ hashFiles('**/Cargo.lock') }}
|
|
117
|
+
|
|
118
|
+
prevention:
|
|
119
|
+
- 'Keep individual cache archives under ~500 MB by splitting large dependency trees (Cargo, Maven, Gradle) into multiple cache steps'
|
|
120
|
+
- 'Add continue-on-error: true to cache restore steps on Windows runners as a safety net for intermittent crashes'
|
|
121
|
+
- 'Monitor workflow durations — a sudden increase in Windows build time (cache miss equivalent) with no cache-related error in logs is a symptom of this crash'
|
|
122
|
+
- 'For Rust/Cargo on Windows runners, consider sccache with a remote backend to avoid large local cache archives entirely'
|
|
123
|
+
- 'Enable ACTIONS_STEP_DEBUG=true (as repository secret) to capture runner-level crash signals when this failure is suspected'
|
|
124
|
+
docs:
|
|
125
|
+
- url: 'https://github.com/actions/cache/issues/1754'
|
|
126
|
+
label: 'actions/cache#1754 — Windows runner randomly dies during cache restore (May 2026)'
|
|
127
|
+
- url: 'https://github.com/actions/cache#tips-for-using-cache'
|
|
128
|
+
label: 'actions/cache — usage tips and cache size guidance'
|
|
129
|
+
- url: 'https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/caching-dependencies-to-speed-up-workflows'
|
|
130
|
+
label: 'Caching dependencies — limits and best practices'
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
id: runner-environment-190
|
|
2
|
+
title: 'Git 2.48.0 silently stops fetching tags with fetch-tags: true on non-depth-1 shallow clones'
|
|
3
|
+
category: runner-environment
|
|
4
|
+
severity: silent-failure
|
|
5
|
+
tags:
|
|
6
|
+
- git-version
|
|
7
|
+
- fetch-tags
|
|
8
|
+
- shallow-clone
|
|
9
|
+
- fetch-depth
|
|
10
|
+
- ubuntu-24.04
|
|
11
|
+
- regression
|
|
12
|
+
- checkout
|
|
13
|
+
patterns:
|
|
14
|
+
- regex: 'git version 2\.48\.'
|
|
15
|
+
flags: 'i'
|
|
16
|
+
- regex: 'fetch-tags.*fetch-depth|fetch-depth.*fetch-tags'
|
|
17
|
+
flags: 'i'
|
|
18
|
+
error_messages:
|
|
19
|
+
- "# No error — tags are silently absent after checkout with fetch-tags: true and fetch-depth: N on git 2.48.0"
|
|
20
|
+
- "fatal: No names found, cannot describe anything."
|
|
21
|
+
- "fatal: not a tag 'HEAD'"
|
|
22
|
+
root_cause: |
|
|
23
|
+
Git 2.48.0 introduced a change in how `git fetch --depth=N` handles tag following for
|
|
24
|
+
direct refspec fetches. In git ≤ 2.47.x, when actions/checkout ran:
|
|
25
|
+
|
|
26
|
+
git fetch --depth=N origin +<sha>:refs/remotes/origin/<branch>
|
|
27
|
+
|
|
28
|
+
git would automatically follow tags reachable within the depth window — any tag pointing
|
|
29
|
+
to a commit within the fetched depth was included. This is known as automatic tag following.
|
|
30
|
+
|
|
31
|
+
Starting with git 2.48.0, automatic tag following is suppressed for direct refspec fetches
|
|
32
|
+
with `--depth`. Only the explicitly requested ref is fetched; no tags are included even if
|
|
33
|
+
they point to commits within the shallow clone window. The fetch log shows only the branch
|
|
34
|
+
ref fetched — no tag lines appear.
|
|
35
|
+
|
|
36
|
+
Result: `fetch-tags: true` combined with `fetch-depth: N` (where N > 1, such as 100, 383, 500)
|
|
37
|
+
silently returns no tags on runner images shipping git 2.48.0. The workflow log shows no error
|
|
38
|
+
and no warning — `git tag -l` returns empty. Downstream steps using git describe, semantic-release,
|
|
39
|
+
helm chart versioning, or any tool that reads git tags break with "no names found" or
|
|
40
|
+
"not a tag 'HEAD'" errors.
|
|
41
|
+
|
|
42
|
+
This regression first appeared when ubuntu-24.04 runner image updated from 20250105.1.0 to
|
|
43
|
+
20250113.1.0 (which shipped git 2.48.0). The issue was resolved in runner image 20250117.1.0+
|
|
44
|
+
when git was updated to 2.48.1 which patched the regression. Self-hosted runners running
|
|
45
|
+
git 2.48.0 remain affected.
|
|
46
|
+
|
|
47
|
+
Note: This is distinct from the existing known silent failure where fetch-depth: 1 silently
|
|
48
|
+
fetches no tags regardless of git version. That is expected shallow-clone behavior. This
|
|
49
|
+
regression affects fetch-depth: N > 1 scenarios that previously worked.
|
|
50
|
+
fix: |
|
|
51
|
+
Use `fetch-depth: 0` when git tags are required. A full clone fetches all history and all
|
|
52
|
+
tags regardless of git version. This is the most reliable fix.
|
|
53
|
+
|
|
54
|
+
For large repositories where a full clone is too slow, add a separate fetch --tags step
|
|
55
|
+
immediately after checkout to explicitly fetch all tag objects:
|
|
56
|
+
|
|
57
|
+
git fetch --tags --force
|
|
58
|
+
|
|
59
|
+
Self-hosted runners on git 2.48.0 should upgrade to git 2.48.1 or later which patches
|
|
60
|
+
the tag following regression.
|
|
61
|
+
fix_code:
|
|
62
|
+
- language: yaml
|
|
63
|
+
label: 'Use fetch-depth: 0 for reliable tag fetching (recommended)'
|
|
64
|
+
code: |
|
|
65
|
+
- name: Checkout with full history and all tags
|
|
66
|
+
uses: actions/checkout@v4
|
|
67
|
+
with:
|
|
68
|
+
# fetch-depth: 0 always fetches all commits and tags regardless of git version
|
|
69
|
+
fetch-depth: 0
|
|
70
|
+
- language: yaml
|
|
71
|
+
label: 'Add explicit git fetch --tags step after shallow checkout'
|
|
72
|
+
code: |
|
|
73
|
+
- name: Checkout (shallow)
|
|
74
|
+
uses: actions/checkout@v4
|
|
75
|
+
with:
|
|
76
|
+
fetch-depth: 100
|
|
77
|
+
# fetch-tags: true is unreliable on git 2.48.0 — use explicit fetch instead
|
|
78
|
+
|
|
79
|
+
- name: Fetch tags explicitly (git-version-safe)
|
|
80
|
+
run: git fetch --tags --force
|
|
81
|
+
- language: yaml
|
|
82
|
+
label: 'Check git version in CI for debugging'
|
|
83
|
+
code: |
|
|
84
|
+
- name: Debug git version and tags
|
|
85
|
+
run: |
|
|
86
|
+
git --version
|
|
87
|
+
git tag -l | head -20
|
|
88
|
+
git describe --tags --always || echo "No reachable tags"
|
|
89
|
+
prevention:
|
|
90
|
+
- 'Always use fetch-depth: 0 when git tags are required by downstream steps like git describe or semantic-release'
|
|
91
|
+
- 'Add a git tag -l debug step after checkout to verify tags are present before release tooling runs'
|
|
92
|
+
- 'For self-hosted runners, prefer git 2.48.1+ over 2.48.0 — the regression was patched in 2.48.1'
|
|
93
|
+
- 'Pin to fetch-depth: 0 in release workflows — the performance cost of a full clone is worth the reliability'
|
|
94
|
+
docs:
|
|
95
|
+
- url: 'https://github.com/actions/checkout/issues/2041'
|
|
96
|
+
label: 'actions/checkout#2041: Tags no longer fetch with Git v2.48.0'
|
|
97
|
+
- url: 'https://github.com/actions/checkout#usage'
|
|
98
|
+
label: 'actions/checkout — fetch-depth and fetch-tags input documentation'
|
|
99
|
+
- url: 'https://git-scm.com/docs/git-fetch#_description'
|
|
100
|
+
label: 'git fetch documentation — tag following with --depth'
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
id: runner-environment-195
|
|
2
|
+
title: 'JavaScript Actions in Alpine containers not supported on ARM64 runners'
|
|
3
|
+
category: runner-environment
|
|
4
|
+
severity: error
|
|
5
|
+
tags:
|
|
6
|
+
- alpine
|
|
7
|
+
- arm64
|
|
8
|
+
- javascript-action
|
|
9
|
+
- container
|
|
10
|
+
- ubuntu-24.04-arm
|
|
11
|
+
- musl
|
|
12
|
+
patterns:
|
|
13
|
+
- regex: 'JavaScript Actions in Alpine containers are only supported on x64 Linux runners'
|
|
14
|
+
flags: 'i'
|
|
15
|
+
- regex: 'Detected Linux Arm64'
|
|
16
|
+
flags: 'i'
|
|
17
|
+
- regex: 'JavaScript Actions in Alpine containers.*Detected Linux'
|
|
18
|
+
flags: 'i'
|
|
19
|
+
error_messages:
|
|
20
|
+
- 'Error: JavaScript Actions in Alpine containers are only supported on x64 Linux runners. Detected Linux Arm64'
|
|
21
|
+
root_cause: |
|
|
22
|
+
The Actions runner's container hook for JavaScript-based actions (actions that use
|
|
23
|
+
`using: node20` or `using: node24` in their action.yml) includes a hard platform check
|
|
24
|
+
when the container image is detected as Alpine Linux.
|
|
25
|
+
|
|
26
|
+
Alpine Linux uses musl libc instead of glibc. The Node.js binaries bundled inside
|
|
27
|
+
GitHub-hosted Actions runners are compiled against glibc and cannot run inside Alpine
|
|
28
|
+
containers without compatibility shims. The runner guards against this by rejecting
|
|
29
|
+
JavaScript action execution in Alpine containers that are not on x64 Linux, where a
|
|
30
|
+
limited musl-compatibility workaround exists.
|
|
31
|
+
|
|
32
|
+
On ARM64 runners (ubuntu-24.04-arm, ubuntu-22.04-arm), the runner explicitly rejects
|
|
33
|
+
JavaScript actions run inside Alpine containers with this error. The check evaluates the
|
|
34
|
+
container image's /etc/os-release ID field: when ID=alpine is found AND the runner
|
|
35
|
+
architecture is not x64, the error is thrown.
|
|
36
|
+
|
|
37
|
+
Common trigger patterns:
|
|
38
|
+
- Workflow uses `container: alpine` or a custom image FROM alpine
|
|
39
|
+
- One or more steps use JavaScript-based actions (e.g. actions/upload-artifact,
|
|
40
|
+
actions/checkout, actions/setup-node)
|
|
41
|
+
- Workflow or matrix includes ubuntu-24.04-arm or ubuntu-22.04-arm runners
|
|
42
|
+
|
|
43
|
+
Upgrading to a larger ubuntu-based base image resolves the issue because glibc is
|
|
44
|
+
present. There is no planned fix to add ARM64 Alpine support to the runner.
|
|
45
|
+
fix: |
|
|
46
|
+
Option 1 (recommended): Replace the Alpine container with a Debian/Ubuntu-based image.
|
|
47
|
+
Alpine is often chosen for image size, but if JavaScript actions must be used inside the
|
|
48
|
+
container, a glibc-based image is required on ARM64 runners.
|
|
49
|
+
|
|
50
|
+
Option 2: Run JavaScript actions as host-level steps (outside the container) and
|
|
51
|
+
restrict container use to run: shell steps that do not invoke JS actions.
|
|
52
|
+
|
|
53
|
+
Option 3: Restrict ARM64 runners to non-Alpine container images in your matrix.
|
|
54
|
+
|
|
55
|
+
Option 4: If the Alpine container is only for the build environment, restructure the
|
|
56
|
+
workflow so JavaScript actions (checkout, upload-artifact, etc.) run before the
|
|
57
|
+
container is started rather than inside it.
|
|
58
|
+
fix_code:
|
|
59
|
+
- language: yaml
|
|
60
|
+
label: 'Replace Alpine with Debian-slim (smallest glibc image)'
|
|
61
|
+
code: |
|
|
62
|
+
jobs:
|
|
63
|
+
build:
|
|
64
|
+
runs-on: ubuntu-24.04-arm
|
|
65
|
+
container:
|
|
66
|
+
# Replace: image: alpine:latest
|
|
67
|
+
image: debian:bookworm-slim # glibc-based, JS actions work on ARM64
|
|
68
|
+
steps:
|
|
69
|
+
- uses: actions/checkout@v6
|
|
70
|
+
- run: apt-get update && apt-get install -y curl
|
|
71
|
+
- uses: actions/upload-artifact@v4
|
|
72
|
+
with:
|
|
73
|
+
name: output
|
|
74
|
+
path: dist/
|
|
75
|
+
|
|
76
|
+
- language: yaml
|
|
77
|
+
label: 'Run JS actions on host, only use Alpine container for build steps'
|
|
78
|
+
code: |
|
|
79
|
+
jobs:
|
|
80
|
+
build:
|
|
81
|
+
runs-on: ubuntu-24.04-arm
|
|
82
|
+
steps:
|
|
83
|
+
# Checkout on host (no container) — JS action works fine
|
|
84
|
+
- uses: actions/checkout@v6
|
|
85
|
+
# Run build inside Alpine via docker run (shell step, not JS action)
|
|
86
|
+
- name: Build in Alpine
|
|
87
|
+
run: |
|
|
88
|
+
docker run --rm -v "$GITHUB_WORKSPACE:/work" -w /work \
|
|
89
|
+
alpine:latest sh -c "apk add --no-cache build-base && make"
|
|
90
|
+
# Upload on host — JS action works fine
|
|
91
|
+
- uses: actions/upload-artifact@v4
|
|
92
|
+
with:
|
|
93
|
+
name: output
|
|
94
|
+
path: dist/
|
|
95
|
+
|
|
96
|
+
- language: yaml
|
|
97
|
+
label: 'Matrix: restrict Alpine container to x64 runners only'
|
|
98
|
+
code: |
|
|
99
|
+
jobs:
|
|
100
|
+
build:
|
|
101
|
+
runs-on: ${{ matrix.runner }}
|
|
102
|
+
container:
|
|
103
|
+
image: ${{ matrix.runner == 'ubuntu-24.04-arm' && 'debian:bookworm-slim' || 'alpine:latest' }}
|
|
104
|
+
strategy:
|
|
105
|
+
matrix:
|
|
106
|
+
runner: [ubuntu-24.04, ubuntu-24.04-arm]
|
|
107
|
+
steps:
|
|
108
|
+
- uses: actions/checkout@v6
|
|
109
|
+
|
|
110
|
+
prevention:
|
|
111
|
+
- 'Never use Alpine-based container images on ARM64 GitHub-hosted runners if any workflow step calls a JavaScript action'
|
|
112
|
+
- 'Use debian:bookworm-slim or ubuntu:24.04 as a lightweight glibc alternative to Alpine when JS actions must run in-container on ARM64'
|
|
113
|
+
- 'When migrating workflows to ARM64 runners, audit all container: image values for Alpine derivation (FROM alpine, alpine:latest, alpine:3.x)'
|
|
114
|
+
- 'Run JavaScript actions (checkout, upload-artifact, setup-*) as host-level steps before or after the Alpine container block when possible'
|
|
115
|
+
docs:
|
|
116
|
+
- url: 'https://github.com/actions/upload-artifact/issues/739'
|
|
117
|
+
label: 'actions/upload-artifact#739 — JS Actions in Alpine containers not supported on ARM64 (Feb 2026)'
|
|
118
|
+
- url: 'https://docs.github.com/en/actions/using-github-hosted-runners/using-github-hosted-runners/about-github-hosted-runners#supported-runners-and-hardware-resources'
|
|
119
|
+
label: 'GitHub-hosted runners — ARM64 runner support'
|
|
120
|
+
- url: 'https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/running-jobs-in-a-container'
|
|
121
|
+
label: 'Running jobs in a container'
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
id: runner-environment-185
|
|
2
|
+
title: "Node.js 18 Removed from Toolcache After EOL — setup-node Falls Back to Slow Download or Times Out"
|
|
3
|
+
category: runner-environment
|
|
4
|
+
severity: error
|
|
5
|
+
tags:
|
|
6
|
+
- nodejs
|
|
7
|
+
- node18
|
|
8
|
+
- toolcache
|
|
9
|
+
- eol
|
|
10
|
+
- setup-node
|
|
11
|
+
- runner-images
|
|
12
|
+
patterns:
|
|
13
|
+
- regex: "Unable to find Node version '18|Couldn't find a version that satisfied.*18"
|
|
14
|
+
flags: i
|
|
15
|
+
- regex: 'Acquiring 18\.[0-9]+\.[0-9]+ - (x64|arm64) from.*node-versions'
|
|
16
|
+
flags: i
|
|
17
|
+
- regex: 'Client network socket disconnected before secure TLS connection was established'
|
|
18
|
+
flags: i
|
|
19
|
+
- regex: 'Request timeout.*node.*18|Error.*node.*18.*download'
|
|
20
|
+
flags: i
|
|
21
|
+
error_messages:
|
|
22
|
+
- "Unable to find Node version '18' in the local cache."
|
|
23
|
+
- "Couldn't resolve the package 'node' to a version matching '18'"
|
|
24
|
+
- "Acquiring 18.20.4 - x64 from https://github.com/actions/node-versions/releases/download/18.20.4-xxxxxxxxxxxxxxxx/node-18.20.4-linux-x64.tar.gz"
|
|
25
|
+
- "Request timeout..."
|
|
26
|
+
- "Client network socket disconnected before secure TLS connection was established"
|
|
27
|
+
root_cause: |
|
|
28
|
+
Node.js 18 reached end-of-life on **April 30, 2025**. GitHub subsequently removed it from the
|
|
29
|
+
pre-installed toolcache on all GitHub-hosted runner images (Ubuntu, macOS, and Windows). When
|
|
30
|
+
a workflow specifies `node-version: '18'` or `node-version: '18.x'`, the `actions/setup-node`
|
|
31
|
+
action cannot find Node 18 in the local toolcache and falls back to downloading the binary from
|
|
32
|
+
GitHub's node-versions release page. This remote download frequently times out on hosted runners
|
|
33
|
+
(the GitHub Releases endpoint for old Node versions is rate-limited under load), causing the step
|
|
34
|
+
to fail part-way through setup. On self-hosted runners without unrestricted outbound internet
|
|
35
|
+
access, the fallback download fails immediately with a TLS or connection error. The failure is
|
|
36
|
+
unexpected for teams that previously never pinned a `setup-node` step because Node 18 "just
|
|
37
|
+
worked" from the toolcache — after the removal, those workflows break silently on the next
|
|
38
|
+
runner image update. Distinct from `runner-environment-029` (Node.js 20 toolcache removal)
|
|
39
|
+
and `runner-environment-062` (ubuntu-latest default changing from Node 20 to 22).
|
|
40
|
+
fix: |
|
|
41
|
+
Upgrade to a currently-supported Node.js LTS version. Node.js 22 is the current Active LTS
|
|
42
|
+
(supported until April 2027). Update the `node-version` field in your `setup-node` step and
|
|
43
|
+
verify your `package.json` `engines` field matches the new version:
|
|
44
|
+
fix_code:
|
|
45
|
+
- language: yaml
|
|
46
|
+
label: "Upgrade to Node.js 22 (Active LTS)"
|
|
47
|
+
code: |
|
|
48
|
+
- name: Set up Node.js
|
|
49
|
+
uses: actions/setup-node@v4
|
|
50
|
+
with:
|
|
51
|
+
node-version: '22'
|
|
52
|
+
cache: 'npm'
|
|
53
|
+
- language: yaml
|
|
54
|
+
label: "Pin to .nvmrc / .node-version file for consistency"
|
|
55
|
+
code: |
|
|
56
|
+
# .nvmrc or .node-version in repo root:
|
|
57
|
+
# 22
|
|
58
|
+
|
|
59
|
+
- name: Set up Node.js
|
|
60
|
+
uses: actions/setup-node@v4
|
|
61
|
+
with:
|
|
62
|
+
node-version-file: '.nvmrc'
|
|
63
|
+
cache: 'npm'
|
|
64
|
+
- language: yaml
|
|
65
|
+
label: "Matrix test across supported LTS versions"
|
|
66
|
+
code: |
|
|
67
|
+
strategy:
|
|
68
|
+
matrix:
|
|
69
|
+
node-version: ['20', '22']
|
|
70
|
+
steps:
|
|
71
|
+
- uses: actions/setup-node@v4
|
|
72
|
+
with:
|
|
73
|
+
node-version: ${{ matrix.node-version }}
|
|
74
|
+
prevention:
|
|
75
|
+
- "Subscribe to Node.js EOL announcements at https://nodejs.org/en/about/previous-releases to know when to migrate"
|
|
76
|
+
- "Use `node-version-file: '.nvmrc'` so your CI and local environments stay in sync automatically"
|
|
77
|
+
- "Enable Dependabot or Renovate to auto-bump `node-version` in workflow files when LTS versions rotate"
|
|
78
|
+
- "Prefer `lts/*` for non-version-sensitive workflows to always track the current LTS without manual updates"
|
|
79
|
+
- "Avoid relying on the toolcache for EOL versions — always add an explicit `setup-node` step"
|
|
80
|
+
docs:
|
|
81
|
+
- url: "https://github.com/actions/setup-node"
|
|
82
|
+
label: "actions/setup-node"
|
|
83
|
+
- url: "https://nodejs.org/en/about/previous-releases"
|
|
84
|
+
label: "Node.js Release Schedule and EOL Dates"
|
|
85
|
+
- url: "https://github.com/actions/setup-node/issues/933"
|
|
86
|
+
label: "setup-node #933: Node 18 toolcache download timeout reports"
|
|
87
|
+
- url: "https://github.com/actions/runner-images"
|
|
88
|
+
label: "actions/runner-images — pre-installed toolcache contents"
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
id: runner-environment-186
|
|
2
|
+
title: "windows-2025 Runner Label Unexpectedly Includes VS 2026 — Pinned VS 2022 Paths Break"
|
|
3
|
+
category: runner-environment
|
|
4
|
+
severity: error
|
|
5
|
+
tags:
|
|
6
|
+
- windows
|
|
7
|
+
- windows-2025
|
|
8
|
+
- visual-studio
|
|
9
|
+
- runner-image
|
|
10
|
+
- msbuild
|
|
11
|
+
- cmake
|
|
12
|
+
- breaking-change
|
|
13
|
+
patterns:
|
|
14
|
+
- regex: 'Cannot find path.*Visual Studio\\2022.*because it does not exist'
|
|
15
|
+
flags: i
|
|
16
|
+
- regex: 'Visual Studio 2022.*not found|MSBuild.*17\.[0-9]+.*not available'
|
|
17
|
+
flags: i
|
|
18
|
+
- regex: 'CMake.*generator.*Visual Studio 17 2022.*not available'
|
|
19
|
+
flags: i
|
|
20
|
+
- regex: 'vswhere.*version.*\[17,18\).*returned empty|No valid VS instances found'
|
|
21
|
+
flags: i
|
|
22
|
+
- regex: 'MSB4019.*Microsoft\.CppBuild\.targets.*was not found'
|
|
23
|
+
flags: i
|
|
24
|
+
error_messages:
|
|
25
|
+
- "Cannot find path 'C:\\Program Files\\Microsoft Visual Studio\\2022\\Enterprise\\MSBuild\\Microsoft\\VC' because it does not exist."
|
|
26
|
+
- "MSB4019: The imported project 'Microsoft.CppBuild.targets' was not found. Confirm that the expression in the Import declaration is correct."
|
|
27
|
+
- "CMake Error: CMake was unable to find a build program corresponding to \"Visual Studio 17 2022\"."
|
|
28
|
+
- "The C++ toolchain version 14.30 targeting platform 'x64' is not installed. Install it from the VS Installer."
|
|
29
|
+
root_cause: |
|
|
30
|
+
In early 2026, some builds of the `windows-2025` runner image label began shipping with
|
|
31
|
+
Visual Studio 2026 (Public Preview) as the primary Visual Studio installation, removing or
|
|
32
|
+
demoting VS 2022 components that had been present in earlier `windows-2025` builds. Developers
|
|
33
|
+
who had explicitly pinned `runs-on: windows-2025` (rather than `windows-latest`) to preserve
|
|
34
|
+
VS 2022 compatibility found their workflows unexpectedly broken, because hardcoded paths to
|
|
35
|
+
`C:\Program Files\Microsoft Visual Studio\2022\...` no longer existed, and CMake generators
|
|
36
|
+
targeting "Visual Studio 17 2022" could not locate a matching installation.
|
|
37
|
+
|
|
38
|
+
This is distinct from the intentional `windows-latest` → VS 2026 migration documented in
|
|
39
|
+
`runner-environment-020`. In that case, developers pinned to a versioned label specifically
|
|
40
|
+
to avoid the change — the versioned label was supposed to be stable. The regression occurred
|
|
41
|
+
because `windows-2025` image builds that included VS 2026 were briefly pushed to the label's
|
|
42
|
+
rotation before being identified and rolled back.
|
|
43
|
+
|
|
44
|
+
Source: actions/runner-images#13638, actions/runner-images#14004.
|
|
45
|
+
fix: |
|
|
46
|
+
Pin to `windows-2022` to guarantee a VS 2022 toolchain for the foreseeable future. Use
|
|
47
|
+
`vswhere.exe` to discover Visual Studio components at runtime rather than hardcoding
|
|
48
|
+
installation paths, which protects against future image changes on any Windows label.
|
|
49
|
+
fix_code:
|
|
50
|
+
- language: yaml
|
|
51
|
+
label: "Pin to windows-2022 for guaranteed VS 2022"
|
|
52
|
+
code: |
|
|
53
|
+
jobs:
|
|
54
|
+
build:
|
|
55
|
+
# Use windows-2022 instead of windows-2025 to guarantee VS 2022 toolchain
|
|
56
|
+
runs-on: windows-2022
|
|
57
|
+
- language: yaml
|
|
58
|
+
label: "Use vswhere to discover MSBuild path at runtime"
|
|
59
|
+
code: |
|
|
60
|
+
- name: Locate MSBuild via vswhere
|
|
61
|
+
id: msbuild
|
|
62
|
+
shell: pwsh
|
|
63
|
+
run: |
|
|
64
|
+
$vswhere = "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe"
|
|
65
|
+
$msbuild = & $vswhere -latest -requires Microsoft.Component.MSBuild `
|
|
66
|
+
-find MSBuild\**\Bin\MSBuild.exe | Select-Object -First 1
|
|
67
|
+
if (-not $msbuild) { throw "MSBuild not found via vswhere" }
|
|
68
|
+
"path=$msbuild" | Out-File -Append $env:GITHUB_OUTPUT
|
|
69
|
+
|
|
70
|
+
- name: Build solution
|
|
71
|
+
shell: pwsh
|
|
72
|
+
run: |
|
|
73
|
+
& "${{ steps.msbuild.outputs.path }}" MySolution.sln /p:Configuration=Release /p:Platform=x64
|
|
74
|
+
- language: yaml
|
|
75
|
+
label: "Use CMake with dynamic VS version detection"
|
|
76
|
+
code: |
|
|
77
|
+
- name: Configure CMake
|
|
78
|
+
run: |
|
|
79
|
+
# Let CMake auto-detect the installed VS version instead of pinning generator
|
|
80
|
+
cmake -B build -DCMAKE_BUILD_TYPE=Release
|
|
81
|
+
# Avoid: cmake -G "Visual Studio 17 2022" which fails if VS 2022 is absent
|
|
82
|
+
prevention:
|
|
83
|
+
- "Use `vswhere.exe` to locate Visual Studio and MSBuild components at runtime — never hardcode installation paths"
|
|
84
|
+
- "Subscribe to the actions/runner-images releases feed to get notified when versioned labels are updated"
|
|
85
|
+
- "Avoid CMake `-G \"Visual Studio 17 2022\"` in favor of `cmake -B build` with auto-detection when possible"
|
|
86
|
+
- "For CUDA or other toolchain integrations that require a specific VS version, test on a matrix of runner labels to catch regressions early"
|
|
87
|
+
docs:
|
|
88
|
+
- url: "https://github.com/actions/runner-images/issues/13638"
|
|
89
|
+
label: "runner-images #13638: windows-2025 label includes VS2026 regression report"
|
|
90
|
+
- url: "https://github.com/actions/runner-images/issues/14004"
|
|
91
|
+
label: "runner-images #14004: VS 2022 paths missing on windows-2025"
|
|
92
|
+
- url: "https://github.com/microsoft/vswhere"
|
|
93
|
+
label: "vswhere — Visual Studio locator (Microsoft)"
|
|
94
|
+
- url: "https://github.com/actions/runner-images/blob/main/images/windows/Windows2025-Readme.md"
|
|
95
|
+
label: "Windows Server 2025 Runner Image Readme"
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
id: runner-environment-187
|
|
2
|
+
title: "ubuntu-24.04 Runner Missing software-properties-common — add-apt-repository Not Found"
|
|
3
|
+
category: runner-environment
|
|
4
|
+
severity: error
|
|
5
|
+
tags:
|
|
6
|
+
- ubuntu
|
|
7
|
+
- ubuntu-24.04
|
|
8
|
+
- apt
|
|
9
|
+
- ppa
|
|
10
|
+
- runner-image
|
|
11
|
+
- breaking-change
|
|
12
|
+
patterns:
|
|
13
|
+
- regex: 'add-apt-repository.*not found|command not found.*add-apt-repository'
|
|
14
|
+
flags: i
|
|
15
|
+
- regex: '/bin/(sh|bash).*add-apt-repository.*not found'
|
|
16
|
+
flags: i
|
|
17
|
+
- regex: 'Unable to locate executable file: add-apt-repository'
|
|
18
|
+
flags: i
|
|
19
|
+
- regex: 'No such file or directory.*add-apt-repository'
|
|
20
|
+
flags: i
|
|
21
|
+
error_messages:
|
|
22
|
+
- "/bin/sh: 1: add-apt-repository: not found"
|
|
23
|
+
- "bash: add-apt-repository: command not found"
|
|
24
|
+
- "Error: Unable to locate executable file: add-apt-repository"
|
|
25
|
+
- "/usr/bin/add-apt-repository: No such file or directory"
|
|
26
|
+
root_cause: |
|
|
27
|
+
The `ubuntu-24.04` GitHub-hosted runner image does not pre-install `software-properties-common`,
|
|
28
|
+
the Debian/Ubuntu package that provides the `add-apt-repository` command. On `ubuntu-22.04`
|
|
29
|
+
runners, `software-properties-common` was included by default, so workflows that used
|
|
30
|
+
`add-apt-repository` to add third-party PPAs (e.g., `ppa:deadsnakes/ppa` for older Python
|
|
31
|
+
versions, `ppa:graphics-drivers/ppa` for NVIDIA drivers) worked without any explicit install
|
|
32
|
+
step. After migrating to `ubuntu-24.04` — either explicitly or when `ubuntu-latest` switched
|
|
33
|
+
from 22.04 to 24.04 in March 2025 — these workflows fail immediately with "command not found".
|
|
34
|
+
|
|
35
|
+
The failure message points at the `add-apt-repository` line, but the actual missing dependency
|
|
36
|
+
is the `software-properties-common` package. Other apt commands in the same step (like
|
|
37
|
+
`apt-get update`) succeed, making the root cause less obvious.
|
|
38
|
+
fix: |
|
|
39
|
+
Install `software-properties-common` before calling `add-apt-repository`. For new workflows,
|
|
40
|
+
prefer adding apt source lists directly using a signing key, which does not require
|
|
41
|
+
`software-properties-common` and is more reproducible.
|
|
42
|
+
fix_code:
|
|
43
|
+
- language: yaml
|
|
44
|
+
label: "Install software-properties-common before using add-apt-repository"
|
|
45
|
+
code: |
|
|
46
|
+
- name: Add PPA and install package
|
|
47
|
+
run: |
|
|
48
|
+
sudo apt-get update
|
|
49
|
+
sudo apt-get install -y software-properties-common
|
|
50
|
+
sudo add-apt-repository -y ppa:deadsnakes/ppa
|
|
51
|
+
sudo apt-get update
|
|
52
|
+
sudo apt-get install -y python3.11 python3.11-venv
|
|
53
|
+
- language: yaml
|
|
54
|
+
label: "Preferred: add repository via source list (no software-properties-common needed)"
|
|
55
|
+
code: |
|
|
56
|
+
- name: Add repository via signed source list
|
|
57
|
+
run: |
|
|
58
|
+
# Download and install the repository GPG key
|
|
59
|
+
curl -fsSL https://example.com/gpg.key \
|
|
60
|
+
| sudo gpg --dearmor -o /usr/share/keyrings/example-archive-keyring.gpg
|
|
61
|
+
|
|
62
|
+
# Add the apt source list with the key reference
|
|
63
|
+
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/example-archive-keyring.gpg] \
|
|
64
|
+
https://example.com/apt stable main" \
|
|
65
|
+
| sudo tee /etc/apt/sources.list.d/example.list > /dev/null
|
|
66
|
+
|
|
67
|
+
sudo apt-get update
|
|
68
|
+
sudo apt-get install -y example-package
|
|
69
|
+
- language: yaml
|
|
70
|
+
label: "Conditionally install software-properties-common (ubuntu-24.04 only)"
|
|
71
|
+
code: |
|
|
72
|
+
- name: Install apt prerequisites
|
|
73
|
+
run: |
|
|
74
|
+
# software-properties-common is not pre-installed on ubuntu-24.04
|
|
75
|
+
sudo apt-get install -y software-properties-common
|
|
76
|
+
prevention:
|
|
77
|
+
- "Do not rely on `software-properties-common` being pre-installed — always add it as an explicit apt-get install step"
|
|
78
|
+
- "Prefer direct apt source list additions (with GPG key dearmoring) over PPAs for better reproducibility on ubuntu-24.04"
|
|
79
|
+
- "Verify pre-installed packages when migrating runner labels — check https://github.com/actions/runner-images/blob/main/images/ubuntu/Ubuntu2404-Readme.md"
|
|
80
|
+
- "Test workflows explicitly on ubuntu-24.04 before relying on ubuntu-latest defaulting to 24.04"
|
|
81
|
+
- "Use `apt-get install -y --no-install-recommends` to keep explicit and minimal dependencies"
|
|
82
|
+
docs:
|
|
83
|
+
- url: "https://github.com/actions/runner-images/blob/main/images/ubuntu/Ubuntu2404-Readme.md"
|
|
84
|
+
label: "Ubuntu 24.04 Runner Image Readme — pre-installed packages list"
|
|
85
|
+
- url: "https://github.com/actions/runner-images/issues/9848"
|
|
86
|
+
label: "runner-images #9848: ubuntu-latest migration to ubuntu-24.04 tracking issue"
|
|
87
|
+
- url: "https://manpages.ubuntu.com/manpages/noble/man1/add-apt-repository.1.html"
|
|
88
|
+
label: "add-apt-repository man page (Ubuntu Noble)"
|
|
89
|
+
- url: "https://help.launchpad.net/Packaging/PPA/InstallingSoftware"
|
|
90
|
+
label: "Launchpad PPA Installation Guide"
|