@htekdev/actions-debugger 1.0.118 → 1.0.120
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-070.yml +94 -0
- package/errors/concurrency-timing/concurrency-timing-056.yml +127 -0
- package/errors/concurrency-timing/concurrency-timing-057.yml +115 -0
- package/errors/concurrency-timing/concurrency-timing-058.yml +121 -0
- package/errors/known-unsolved/known-unsolved-067.yml +117 -0
- package/errors/known-unsolved/known-unsolved-068.yml +124 -0
- package/errors/known-unsolved/known-unsolved-069.yml +127 -0
- package/errors/permissions-auth/permissions-auth-070.yml +136 -0
- package/errors/runner-environment/runner-environment-214.yml +107 -0
- package/errors/runner-environment/runner-environment-215.yml +93 -0
- package/errors/runner-environment/runner-environment-216.yml +82 -0
- package/errors/runner-environment/runner-environment-217.yml +99 -0
- package/errors/runner-environment/runner-environment-218.yml +111 -0
- package/errors/silent-failures/silent-failures-109.yml +119 -0
- package/errors/silent-failures/silent-failures-110.yml +91 -0
- package/errors/silent-failures/silent-failures-111.yml +107 -0
- package/errors/yaml-syntax/yaml-syntax-072.yml +93 -0
- package/errors/yaml-syntax/yaml-syntax-073.yml +103 -0
- package/package.json +1 -1
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
id: runner-environment-217
|
|
2
|
+
title: 'ubuntu-26.04 Helm 4 — `helm install --atomic` fails with unknown flag error on Helm 4.0.x–4.1.0'
|
|
3
|
+
category: runner-environment
|
|
4
|
+
severity: error
|
|
5
|
+
tags:
|
|
6
|
+
- helm
|
|
7
|
+
- helm-4
|
|
8
|
+
- ubuntu-26
|
|
9
|
+
- tool-upgrade
|
|
10
|
+
- flag-renamed
|
|
11
|
+
- atomic
|
|
12
|
+
patterns:
|
|
13
|
+
- regex: 'Error: unknown flag: --atomic'
|
|
14
|
+
flags: 'i'
|
|
15
|
+
- regex: 'helm install.*Error.*unknown flag.*atomic'
|
|
16
|
+
flags: 'i'
|
|
17
|
+
error_messages:
|
|
18
|
+
- 'Error: unknown flag: --atomic'
|
|
19
|
+
- 'Error: flag provided but not defined: --atomic'
|
|
20
|
+
root_cause: |
|
|
21
|
+
ubuntu-26.04 runner images install Helm 4. In Helm 4, the `--atomic` flag was
|
|
22
|
+
renamed to `--rollback-on-failure`. On `helm upgrade`, the old `--atomic` flag
|
|
23
|
+
was retained as a deprecated alias that emits a warning. However, on
|
|
24
|
+
`helm install`, the `--atomic` binding was accidentally omitted in Helm 4.0.0,
|
|
25
|
+
so `helm install --atomic` fails with `Error: unknown flag: --atomic` on Helm
|
|
26
|
+
versions 4.0.0 through 4.1.0.
|
|
27
|
+
|
|
28
|
+
This was reported in helm/helm#31900 and fixed in Helm 4.1.1 via PR #31901
|
|
29
|
+
(March 4, 2026), which restored `--atomic` as a deprecated alias on
|
|
30
|
+
`helm install`. However, workflows that pin specific Helm 4 versions via
|
|
31
|
+
`azure/setup-helm` at versions 4.0.0–4.1.0, or any ubuntu-26.04 image built
|
|
32
|
+
before the Helm 4.1.1+ update, will still hit this error.
|
|
33
|
+
|
|
34
|
+
`--atomic` is extremely common in Kubernetes deployment workflows because it
|
|
35
|
+
auto-rolls back failed installs and waits for all pods to be Ready.
|
|
36
|
+
fix: |
|
|
37
|
+
Replace `--atomic` with `--rollback-on-failure` in your `helm install`
|
|
38
|
+
command. The semantics are identical: on failure, Helm rolls back (uninstalls)
|
|
39
|
+
the release and returns a non-zero exit code.
|
|
40
|
+
|
|
41
|
+
Note: `--wait` is implicitly enabled when `--rollback-on-failure` is set.
|
|
42
|
+
|
|
43
|
+
If you must use `--atomic` (e.g., shared scripts that support both Helm 3 and 4),
|
|
44
|
+
pin Helm 3 with `azure/setup-helm` or ensure Helm 4.1.1+ is installed.
|
|
45
|
+
fix_code:
|
|
46
|
+
- language: yaml
|
|
47
|
+
label: 'Replace --atomic with --rollback-on-failure (Helm 4 syntax)'
|
|
48
|
+
code: |
|
|
49
|
+
- name: Deploy chart
|
|
50
|
+
run: |
|
|
51
|
+
# Helm 4 on ubuntu-26.04: --atomic is removed from helm install (4.0.x-4.1.0).
|
|
52
|
+
# Use --rollback-on-failure instead (semantically identical):
|
|
53
|
+
helm install my-release ./chart \
|
|
54
|
+
--namespace production \
|
|
55
|
+
--rollback-on-failure \
|
|
56
|
+
--timeout 5m0s
|
|
57
|
+
|
|
58
|
+
- language: yaml
|
|
59
|
+
label: 'Pin Helm version to avoid flag compatibility issues'
|
|
60
|
+
code: |
|
|
61
|
+
- name: Set up Helm
|
|
62
|
+
uses: azure/setup-helm@v5
|
|
63
|
+
with:
|
|
64
|
+
version: '3.17.x' # Use Helm 3 if --atomic is required and not yet migrated
|
|
65
|
+
# Or use Helm 4.1.1+ which restores --atomic as a deprecated alias:
|
|
66
|
+
# version: '4.1.1'
|
|
67
|
+
|
|
68
|
+
- name: Deploy chart
|
|
69
|
+
run: |
|
|
70
|
+
helm install my-release ./chart \
|
|
71
|
+
--namespace production \
|
|
72
|
+
--atomic \
|
|
73
|
+
--timeout 5m0s
|
|
74
|
+
|
|
75
|
+
- language: yaml
|
|
76
|
+
label: 'Upgrade and install combined (helm upgrade --install)'
|
|
77
|
+
code: |
|
|
78
|
+
- name: Deploy chart
|
|
79
|
+
run: |
|
|
80
|
+
# helm upgrade retains --atomic as deprecated in all Helm 4 versions.
|
|
81
|
+
# Use upgrade --install as an alternative that works across Helm 3 and 4:
|
|
82
|
+
helm upgrade --install my-release ./chart \
|
|
83
|
+
--namespace production \
|
|
84
|
+
--atomic \
|
|
85
|
+
--timeout 5m0s
|
|
86
|
+
prevention:
|
|
87
|
+
- "Use `helm upgrade --install` instead of `helm install` when possible — `--atomic` was retained on upgrade in all Helm 4 versions."
|
|
88
|
+
- "Pin Helm versions with `azure/setup-helm` to avoid silent tool version changes when ubuntu-latest migrates to ubuntu-26.04."
|
|
89
|
+
- "Replace `--atomic` with `--rollback-on-failure` in new workflows — this is the Helm 4 canonical flag name."
|
|
90
|
+
- "Run `helm version` as an early step to catch unexpected version jumps before the deployment step."
|
|
91
|
+
docs:
|
|
92
|
+
- url: 'https://github.com/helm/helm/issues/31900'
|
|
93
|
+
label: 'helm/helm#31900 — helm install --atomic no longer works in Helm 4'
|
|
94
|
+
- url: 'https://github.com/helm/helm/pull/31901'
|
|
95
|
+
label: 'helm/helm#31901 — fix: restore deprecated --atomic flag on install for backwards compatibility'
|
|
96
|
+
- url: 'https://helm.sh/docs/topics/v4_migration/'
|
|
97
|
+
label: 'Helm v4 Migration Guide — CLI flag renames'
|
|
98
|
+
- url: 'https://github.com/actions/runner-images/commit/9e3319d6b4acc306925295853d0ff41ddd5c40f0'
|
|
99
|
+
label: 'runner-images commit: ubuntu-26.04 installs Helm 4'
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
id: runner-environment-218
|
|
2
|
+
title: "docker/build-push-action 'load: true' and 'push: true' Are Mutually Exclusive"
|
|
3
|
+
category: runner-environment
|
|
4
|
+
severity: error
|
|
5
|
+
tags:
|
|
6
|
+
- docker
|
|
7
|
+
- build-push-action
|
|
8
|
+
- buildx
|
|
9
|
+
- buildkit
|
|
10
|
+
- load
|
|
11
|
+
- push
|
|
12
|
+
patterns:
|
|
13
|
+
- regex: 'load.{0,20}push cannot be both set|cannot use both --load and --push|load.*push.*incompatible|--load.*--push.*incompatible'
|
|
14
|
+
flags: 'i'
|
|
15
|
+
- regex: "contradictory options given: load and push"
|
|
16
|
+
flags: 'i'
|
|
17
|
+
error_messages:
|
|
18
|
+
- "contradictory options given: load and push cannot be both set at the same time"
|
|
19
|
+
- "ERROR: cannot use both --load and --push flags"
|
|
20
|
+
- "error: '--load' and '--push' cannot be used together"
|
|
21
|
+
- "Error: buildx failed with: error: failed to solve: load and push cannot be both set"
|
|
22
|
+
root_cause: |
|
|
23
|
+
docker/build-push-action (and the underlying docker buildx) does not support
|
|
24
|
+
setting both 'load: true' and 'push: true' in the same build step. These two
|
|
25
|
+
options are mutually exclusive:
|
|
26
|
+
|
|
27
|
+
- 'load: true' exports the built image into the local Docker daemon
|
|
28
|
+
(equivalent to --load / --output type=docker).
|
|
29
|
+
- 'push: true' pushes the image to a remote registry
|
|
30
|
+
(equivalent to --push / --output type=registry).
|
|
31
|
+
|
|
32
|
+
Both flags specify different output targets, and docker buildx cannot satisfy
|
|
33
|
+
both simultaneously with most drivers. The docker-container and kubernetes
|
|
34
|
+
drivers explicitly reject the combination. The docker driver (used without
|
|
35
|
+
explicit driver setup) may silently ignore 'push' in some versions.
|
|
36
|
+
|
|
37
|
+
Common triggers:
|
|
38
|
+
- Copying a workflow snippet that has 'push: true' and adding 'load: true'
|
|
39
|
+
for local testing without removing 'push: true'.
|
|
40
|
+
- Conditional 'push' logic using expressions that evaluate to true at the
|
|
41
|
+
same time as unconditional 'load: true'.
|
|
42
|
+
fix: |
|
|
43
|
+
Use only one of 'load' or 'push' in a single step. To both test locally and
|
|
44
|
+
push to a registry, split the build into two separate steps, or use
|
|
45
|
+
conditional logic so only one output target is active at a time.
|
|
46
|
+
|
|
47
|
+
The idiomatic pattern is:
|
|
48
|
+
- Set 'push: ${{ github.ref == 'refs/heads/main' }}' to push only on
|
|
49
|
+
default branch, and omit 'load:' entirely (or use a separate step for
|
|
50
|
+
local testing).
|
|
51
|
+
- To load the image for integration tests AND push on main, build twice:
|
|
52
|
+
once with 'load: true' for tests, once with 'push: true' for release.
|
|
53
|
+
- Use build outputs caching (cache-from/cache-to) so the second build
|
|
54
|
+
is fast.
|
|
55
|
+
fix_code:
|
|
56
|
+
- language: yaml
|
|
57
|
+
label: "Wrong — load and push both true (fails)"
|
|
58
|
+
code: |
|
|
59
|
+
- name: Build and push
|
|
60
|
+
uses: docker/build-push-action@v6
|
|
61
|
+
with:
|
|
62
|
+
context: .
|
|
63
|
+
load: true # ❌ Incompatible with push: true
|
|
64
|
+
push: true # ❌ Incompatible with load: true
|
|
65
|
+
tags: myrepo/myimage:latest
|
|
66
|
+
|
|
67
|
+
- language: yaml
|
|
68
|
+
label: "Fixed — push conditionally, no load"
|
|
69
|
+
code: |
|
|
70
|
+
- name: Build and push
|
|
71
|
+
uses: docker/build-push-action@v6
|
|
72
|
+
with:
|
|
73
|
+
context: .
|
|
74
|
+
push: ${{ github.ref == 'refs/heads/main' }}
|
|
75
|
+
tags: myrepo/myimage:latest
|
|
76
|
+
|
|
77
|
+
- language: yaml
|
|
78
|
+
label: "Fixed — load for tests, push separately on main"
|
|
79
|
+
code: |
|
|
80
|
+
- name: Build image for integration tests
|
|
81
|
+
uses: docker/build-push-action@v6
|
|
82
|
+
with:
|
|
83
|
+
context: .
|
|
84
|
+
load: true # ✅ load only — no push
|
|
85
|
+
tags: myrepo/myimage:test
|
|
86
|
+
|
|
87
|
+
- name: Run integration tests
|
|
88
|
+
run: docker run --rm myrepo/myimage:test ./run-tests.sh
|
|
89
|
+
|
|
90
|
+
- name: Push to registry (main branch only)
|
|
91
|
+
if: github.ref == 'refs/heads/main'
|
|
92
|
+
uses: docker/build-push-action@v6
|
|
93
|
+
with:
|
|
94
|
+
context: .
|
|
95
|
+
push: true # ✅ push only — no load
|
|
96
|
+
tags: myrepo/myimage:latest
|
|
97
|
+
cache-from: type=gha
|
|
98
|
+
cache-to: type=gha,mode=max
|
|
99
|
+
|
|
100
|
+
prevention:
|
|
101
|
+
- "Never set both 'load: true' and 'push: true' in the same build-push-action step."
|
|
102
|
+
- "Use 'push: ${{ condition }}' expression to conditionally push; omit 'load' in the same step."
|
|
103
|
+
- "If you need the image locally for testing and also want to push, use two separate steps."
|
|
104
|
+
- "Review docker/build-push-action README — the compatibility matrix for load, push, and outputs is documented."
|
|
105
|
+
docs:
|
|
106
|
+
- url: "https://github.com/docker/build-push-action#inputs"
|
|
107
|
+
label: "docker/build-push-action — inputs reference (load, push, outputs)"
|
|
108
|
+
- url: "https://docs.docker.com/build/building/export/"
|
|
109
|
+
label: "Docker Buildx — build output types (load vs push)"
|
|
110
|
+
- url: "https://github.com/docker/build-push-action/blob/master/README.md#multi-platform-image"
|
|
111
|
+
label: "docker/build-push-action — multi-platform and output guidance"
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
id: silent-failures-109
|
|
2
|
+
title: 'electron-forge make Silently Exits 0 on Node.js 24.16.0+ — No .exe, No Error'
|
|
3
|
+
category: silent-failures
|
|
4
|
+
severity: silent-failure
|
|
5
|
+
tags:
|
|
6
|
+
- electron-forge
|
|
7
|
+
- nodejs
|
|
8
|
+
- node24
|
|
9
|
+
- extract-zip
|
|
10
|
+
- toolcache
|
|
11
|
+
- regression
|
|
12
|
+
- windows
|
|
13
|
+
- packaging
|
|
14
|
+
patterns:
|
|
15
|
+
- regex: 'Invalid input file path.{0,80}\.exe'
|
|
16
|
+
flags: 'i'
|
|
17
|
+
- regex: 'Finalizing package\s*$'
|
|
18
|
+
flags: 'im'
|
|
19
|
+
- regex: 'electron-forge make.{0,60}exit(?:ed)? (?:with )?(?:code )?0'
|
|
20
|
+
flags: 'i'
|
|
21
|
+
- regex: 'exec\: node\: not found'
|
|
22
|
+
flags: 'i'
|
|
23
|
+
error_messages:
|
|
24
|
+
- 'Error: Invalid input file path - apps/desktop/out/<AppName>-win32-x64/<App>.exe'
|
|
25
|
+
- '❯ Finalizing package'
|
|
26
|
+
- 'exec: node: not found'
|
|
27
|
+
- '> Packaging for x64 on win32'
|
|
28
|
+
root_cause: |
|
|
29
|
+
On the ubuntu-24.04 image update from 20260518.149.1 → 20260525.161.1 and
|
|
30
|
+
the Windows Server 2022/2025 image update from 20260518 → 20260525, the
|
|
31
|
+
cached Node.js toolcache version was bumped from 24.15.0 to 24.16.0. Node.js
|
|
32
|
+
24.16.0 contains an upstream regression in the readable-stream.destroy()
|
|
33
|
+
lifecycle that breaks yauzl (a ZIP reading library) and extract-zip which
|
|
34
|
+
depends on it.
|
|
35
|
+
|
|
36
|
+
`electron-forge make` uses extract-zip internally during the "Finalizing
|
|
37
|
+
package" phase to extract the Electron binary archive. When running under
|
|
38
|
+
Node.js 24.16.0 or 26.1.0+, the forge process:
|
|
39
|
+
1. Enters all packaging subtasks within ~5 ms (each spinner shows up instantly)
|
|
40
|
+
2. Exits with code 0 — no checkmarks, no error, no output
|
|
41
|
+
3. Produces no .exe in `out/<AppName>-win32-x64/`
|
|
42
|
+
|
|
43
|
+
The same regression affects other tools that use extract-zip internally:
|
|
44
|
+
- jsvu (JS engine version updater)
|
|
45
|
+
- Any npm package that has not yet migrated away from the 6-year-old
|
|
46
|
+
unmaintained extract-zip package
|
|
47
|
+
|
|
48
|
+
The affected subtasks (Copying files → Preparing native dependencies →
|
|
49
|
+
Finalizing package) complete within milliseconds instead of minutes, which
|
|
50
|
+
is the visible telltale sign — none receive a ✓ checkmark.
|
|
51
|
+
|
|
52
|
+
Upstream issues:
|
|
53
|
+
- https://github.com/nodejs/node/issues/63487 (yauzl/extract-zip partial extraction)
|
|
54
|
+
- https://github.com/nodejs/node/issues/63638 (libuv regression on Windows)
|
|
55
|
+
- https://github.com/electron/forge/issues/4277
|
|
56
|
+
fix: |
|
|
57
|
+
Pin Node.js to 24.15.0 (last unaffected 24.x release) until Node.js 24.17.0
|
|
58
|
+
ships the upstream fix and it is rolled into the runner toolcache via
|
|
59
|
+
actions/node-versions:
|
|
60
|
+
|
|
61
|
+
- uses: actions/setup-node@v6
|
|
62
|
+
with:
|
|
63
|
+
node-version: '24.15.0'
|
|
64
|
+
|
|
65
|
+
Alternatively, downgrade to Node.js 22 LTS which is unaffected:
|
|
66
|
+
|
|
67
|
+
- uses: actions/setup-node@v6
|
|
68
|
+
with:
|
|
69
|
+
node-version: '22'
|
|
70
|
+
|
|
71
|
+
For jsvu users, the same pin applies. Track the upstream fix at
|
|
72
|
+
https://github.com/nodejs/node/issues/63487 and
|
|
73
|
+
https://github.com/electron/forge/issues/4277 for when to unpin.
|
|
74
|
+
fix_code:
|
|
75
|
+
- language: yaml
|
|
76
|
+
label: 'Pin Node.js to 24.15.0 until extract-zip regression is fixed'
|
|
77
|
+
code: |
|
|
78
|
+
steps:
|
|
79
|
+
- uses: actions/checkout@v6
|
|
80
|
+
|
|
81
|
+
- name: Set up Node.js (pin to last unaffected 24.x)
|
|
82
|
+
uses: actions/setup-node@v6
|
|
83
|
+
with:
|
|
84
|
+
node-version: '24.15.0' # 24.16.0+ breaks extract-zip / electron-forge
|
|
85
|
+
cache: 'npm'
|
|
86
|
+
|
|
87
|
+
- name: Install dependencies
|
|
88
|
+
run: npm ci
|
|
89
|
+
|
|
90
|
+
- name: Package (electron-forge)
|
|
91
|
+
run: npx electron-forge make --platform win32 --arch x64
|
|
92
|
+
- language: yaml
|
|
93
|
+
label: 'Fallback to Node.js 22 LTS (unaffected by regression)'
|
|
94
|
+
code: |
|
|
95
|
+
steps:
|
|
96
|
+
- uses: actions/setup-node@v6
|
|
97
|
+
with:
|
|
98
|
+
node-version: '22' # LTS — unaffected by 24.16.0 extract-zip regression
|
|
99
|
+
prevention:
|
|
100
|
+
- 'Pin exact Node.js minor versions in actions/setup-node — semver ranges like
|
|
101
|
+
"24" silently upgrade to patch/minor releases that may carry regressions.'
|
|
102
|
+
- 'Watch https://github.com/nodejs/node/issues/63487 and
|
|
103
|
+
https://github.com/electron/forge/issues/4277 for when the regression is
|
|
104
|
+
fixed in both Node.js upstream and electron-forge itself.'
|
|
105
|
+
- 'If forge make exits 0 but produces no output files, check whether the Node.js
|
|
106
|
+
version in use is >=24.16.0 or >=26.1.0 — the silent exit is the diagnostic.'
|
|
107
|
+
- 'Consider using a lock-file approach: pin node-version in setup-node AND add
|
|
108
|
+
a post-step assertion that the expected .exe exists before continuing.'
|
|
109
|
+
docs:
|
|
110
|
+
- url: 'https://github.com/nodejs/node/issues/63487'
|
|
111
|
+
label: 'nodejs/node #63487 — yauzl/extract-zip hang and partial extraction (readable-stream regression)'
|
|
112
|
+
- url: 'https://github.com/nodejs/node/issues/63638'
|
|
113
|
+
label: 'nodejs/node #63638 — libuv regression in Node.js 24.16.0 on Windows'
|
|
114
|
+
- url: 'https://github.com/electron/forge/issues/4277'
|
|
115
|
+
label: 'electron/forge #4277 — make exits 0 silently on Node.js 24.16.0 / extract-zip regression'
|
|
116
|
+
- url: 'https://github.com/actions/runner-images/issues/14174'
|
|
117
|
+
label: 'runner-images #14174 — Windows 2022/2025 May 25 image: electron-forge make silent exit'
|
|
118
|
+
- url: 'https://github.com/actions/runner-images/issues/14173'
|
|
119
|
+
label: 'runner-images #14173 — Puppeteer broken in ubuntu-24.04 20260525 (same root cause)'
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
id: silent-failures-110
|
|
2
|
+
title: 'setup-node v6 cache:npm silently aborts entire Windows job when npm cache directory does not exist'
|
|
3
|
+
category: silent-failures
|
|
4
|
+
severity: silent-failure
|
|
5
|
+
tags:
|
|
6
|
+
- setup-node
|
|
7
|
+
- windows
|
|
8
|
+
- npm
|
|
9
|
+
- cache
|
|
10
|
+
- silent-failure
|
|
11
|
+
- fresh-runner
|
|
12
|
+
- npm-cache-path
|
|
13
|
+
patterns:
|
|
14
|
+
- regex: 'Found in cache.*\n(?:.*\n){0,5}Post job cleanup'
|
|
15
|
+
flags: 'im'
|
|
16
|
+
- regex: 'npm config get cache.*\n(?:.*\n){0,3}(?:Detected npm|Auto caching)'
|
|
17
|
+
flags: 'im'
|
|
18
|
+
- regex: 'setup-node.*cache.*npm.*windows.*abort'
|
|
19
|
+
flags: 'i'
|
|
20
|
+
error_messages:
|
|
21
|
+
- 'Found in cache @ C:\hostedtoolcache\windows\node\22...'
|
|
22
|
+
- 'Detected npm as the package manager from package.json'
|
|
23
|
+
- 'Auto caching has been enabled for npm.'
|
|
24
|
+
root_cause: |
|
|
25
|
+
actions/setup-node@v6 with `cache: 'npm'` (or auto-detected npm caching when
|
|
26
|
+
package.json has `packageManager: npm`) calls `npm config get cache` to locate the
|
|
27
|
+
npm cache directory before registering it with actions/cache.
|
|
28
|
+
|
|
29
|
+
On fresh Windows runners (hosted or self-hosted), `C:\npm\cache` does not yet exist
|
|
30
|
+
because no prior npm install has run in this workspace. The Node.js process executing
|
|
31
|
+
`npm config get cache` internally tries to initialise the npm config directory and
|
|
32
|
+
hits an EEXIST or missing-parent-directory race in npm's cache initialisation code
|
|
33
|
+
(npm/cli#7308). The runner process exits after ~24 seconds with no error message and
|
|
34
|
+
no non-zero exit code.
|
|
35
|
+
|
|
36
|
+
The result: every step AFTER setup-node is silently skipped. The job shows as
|
|
37
|
+
"Success" or the failure appears much later in a confusing step, making this
|
|
38
|
+
extremely hard to diagnose.
|
|
39
|
+
|
|
40
|
+
Affected versions: actions/setup-node@v6.4.0+; most frequently seen on
|
|
41
|
+
`windows-latest` and `windows-2025` hosted runners.
|
|
42
|
+
fix: |
|
|
43
|
+
Remove `cache: 'npm'` from setup-node on Windows runners and handle npm caching
|
|
44
|
+
separately using actions/cache pointing at `~/.npm` or the correct Windows path.
|
|
45
|
+
|
|
46
|
+
Alternatively, run a no-op npm command before setup-node to force-create the cache
|
|
47
|
+
directory (not recommended as a long-term fix).
|
|
48
|
+
|
|
49
|
+
If npm caching is needed, use setup-node without `cache:` and add an explicit
|
|
50
|
+
actions/cache step after npm install has run at least once.
|
|
51
|
+
fix_code:
|
|
52
|
+
- language: yaml
|
|
53
|
+
label: 'Remove cache:npm from setup-node; handle caching separately'
|
|
54
|
+
code: |
|
|
55
|
+
- uses: actions/setup-node@v6
|
|
56
|
+
with:
|
|
57
|
+
node-version: '22'
|
|
58
|
+
# Do NOT set cache: 'npm' on Windows — it silently aborts on fresh runners
|
|
59
|
+
|
|
60
|
+
- name: Get npm cache dir
|
|
61
|
+
id: npm-cache-dir
|
|
62
|
+
shell: pwsh
|
|
63
|
+
run: echo "dir=$(npm config get cache)" >> $env:GITHUB_OUTPUT
|
|
64
|
+
|
|
65
|
+
- uses: actions/cache@v4
|
|
66
|
+
with:
|
|
67
|
+
path: ${{ steps.npm-cache-dir.outputs.dir }}
|
|
68
|
+
key: ${{ runner.os }}-npm-${{ hashFiles('**/package-lock.json') }}
|
|
69
|
+
restore-keys: |
|
|
70
|
+
${{ runner.os }}-npm-
|
|
71
|
+
|
|
72
|
+
- run: npm ci
|
|
73
|
+
- language: yaml
|
|
74
|
+
label: 'Cross-platform: use cache:npm only on non-Windows'
|
|
75
|
+
code: |
|
|
76
|
+
- uses: actions/setup-node@v6
|
|
77
|
+
with:
|
|
78
|
+
node-version: '22'
|
|
79
|
+
cache: ${{ runner.os != 'Windows' && 'npm' || '' }}
|
|
80
|
+
prevention:
|
|
81
|
+
- 'Never set cache: npm in setup-node for Windows-targeted jobs without verifying the npm cache directory pre-exists.'
|
|
82
|
+
- 'When targeting multiple OSes with a matrix, conditionally disable cache:npm on Windows runners.'
|
|
83
|
+
- 'After setup-node on Windows, immediately run a trivial npm command (e.g., npm --version) and verify the step succeeds before continuing.'
|
|
84
|
+
- 'Pin setup-node version and watch the changelog for fixes to the Windows npm cache init race.'
|
|
85
|
+
docs:
|
|
86
|
+
- url: 'https://github.com/unslothai/unsloth/pull/5474'
|
|
87
|
+
label: 'unsloth PR #5474 — drop cache:npm from setup-node (silent abort on Windows)'
|
|
88
|
+
- url: 'https://github.com/npm/cli/issues/7308'
|
|
89
|
+
label: 'npm/cli#7308 — EEXIST/missing-dir race in npm cache directory initialisation'
|
|
90
|
+
- url: 'https://github.com/actions/setup-node/issues/1556'
|
|
91
|
+
label: 'setup-node#1556 — setup-node silently falls through on download/extract failure'
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
id: silent-failures-111
|
|
2
|
+
title: '`helm list` shows all release states by default in Helm 4 — scripts silently return unexpected releases'
|
|
3
|
+
category: silent-failures
|
|
4
|
+
severity: silent-failure
|
|
5
|
+
tags:
|
|
6
|
+
- helm
|
|
7
|
+
- helm-4
|
|
8
|
+
- ubuntu-26
|
|
9
|
+
- tool-upgrade
|
|
10
|
+
- output-change
|
|
11
|
+
- deploy-check
|
|
12
|
+
patterns:
|
|
13
|
+
- regex: 'helm list'
|
|
14
|
+
flags: 'i'
|
|
15
|
+
error_messages:
|
|
16
|
+
- '# No error message — helm list exits 0 but returns FAILED/SUPERSEDED/UNINSTALLED releases alongside DEPLOYED ones'
|
|
17
|
+
root_cause: |
|
|
18
|
+
In Helm 3, `helm list` (without flags) only returned releases in the DEPLOYED
|
|
19
|
+
state. To see releases in all states, you had to pass `-a`/`--all`.
|
|
20
|
+
|
|
21
|
+
In Helm 4 (installed on ubuntu-26.04), `helm list` returns releases of ALL
|
|
22
|
+
states by default: DEPLOYED, FAILED, SUPERSEDED, UNINSTALLED, PENDING_INSTALL,
|
|
23
|
+
PENDING_UPGRADE, PENDING_ROLLBACK. The `-a`/`--all` flag was temporarily removed
|
|
24
|
+
(helm/helm#31784) and restored as a deprecated no-op in Helm 4.1.1+.
|
|
25
|
+
|
|
26
|
+
This causes silent failures in two common patterns:
|
|
27
|
+
|
|
28
|
+
1. **Existence check**: `helm list --filter my-release | grep my-release` returns
|
|
29
|
+
a match even if the release is in a FAILED state, causing a subsequent
|
|
30
|
+
`helm upgrade` to proceed when `helm install` should have been used instead
|
|
31
|
+
(or vice versa).
|
|
32
|
+
|
|
33
|
+
2. **Release count**: Scripts that count `helm list | wc -l` to assert a number
|
|
34
|
+
of deployed releases now count more releases than expected.
|
|
35
|
+
|
|
36
|
+
3. **CI deploy gate**: Pipelines that run `helm list` to verify a deployment
|
|
37
|
+
succeeded will see FAILED releases included in output and may incorrectly
|
|
38
|
+
conclude the deployment is present/healthy.
|
|
39
|
+
|
|
40
|
+
No error is thrown — `helm list` exits 0 in all cases. The bug is in the
|
|
41
|
+
consuming script's assumption about Helm 3 behavior.
|
|
42
|
+
fix: |
|
|
43
|
+
Filter `helm list` output explicitly by state using the `--deployed` flag
|
|
44
|
+
or the `--filter`+`--output json` approach to check actual release status.
|
|
45
|
+
|
|
46
|
+
In Helm 4, use `helm status <release>` to get the definitive state of a
|
|
47
|
+
specific release rather than parsing `helm list` output.
|
|
48
|
+
fix_code:
|
|
49
|
+
- language: yaml
|
|
50
|
+
label: 'Use --deployed flag to replicate Helm 3 default behavior'
|
|
51
|
+
code: |
|
|
52
|
+
- name: Check if release is deployed
|
|
53
|
+
run: |
|
|
54
|
+
# Helm 4 on ubuntu-26.04: helm list shows ALL states by default.
|
|
55
|
+
# Use --deployed to replicate Helm 3 default behavior:
|
|
56
|
+
DEPLOYED=$(helm list --deployed --filter "^my-release$" --short)
|
|
57
|
+
if [ -n "$DEPLOYED" ]; then
|
|
58
|
+
echo "Release is deployed — running upgrade"
|
|
59
|
+
helm upgrade my-release ./chart
|
|
60
|
+
else
|
|
61
|
+
echo "No deployed release found — running install"
|
|
62
|
+
helm install my-release ./chart
|
|
63
|
+
fi
|
|
64
|
+
|
|
65
|
+
- language: yaml
|
|
66
|
+
label: 'Use helm status for definitive state check'
|
|
67
|
+
code: |
|
|
68
|
+
- name: Check release status
|
|
69
|
+
run: |
|
|
70
|
+
# helm status exits non-zero if the release does not exist.
|
|
71
|
+
# Use --output json to get machine-parseable state:
|
|
72
|
+
STATUS=$(helm status my-release --output json 2>/dev/null | jq -r '.info.status' || echo "not-found")
|
|
73
|
+
echo "Release status: $STATUS"
|
|
74
|
+
if [ "$STATUS" = "deployed" ]; then
|
|
75
|
+
echo "Healthy — proceeding"
|
|
76
|
+
elif [ "$STATUS" = "failed" ]; then
|
|
77
|
+
echo "Previous install failed — rolling back before upgrade"
|
|
78
|
+
helm rollback my-release 0 # Roll back to last successful
|
|
79
|
+
else
|
|
80
|
+
echo "Installing fresh"
|
|
81
|
+
helm install my-release ./chart
|
|
82
|
+
fi
|
|
83
|
+
|
|
84
|
+
- language: yaml
|
|
85
|
+
label: 'Use helm list --output json for precise state parsing'
|
|
86
|
+
code: |
|
|
87
|
+
- name: List only deployed releases
|
|
88
|
+
run: |
|
|
89
|
+
# Explicitly request only DEPLOYED state, output JSON for safe parsing:
|
|
90
|
+
helm list --deployed --output json | jq '.[] | .name + " (" + .status + ")"'
|
|
91
|
+
# Do NOT rely on: helm list | grep release-name
|
|
92
|
+
# In Helm 4, this matches FAILED/SUPERSEDED releases too.
|
|
93
|
+
prevention:
|
|
94
|
+
- "Never use `helm list | grep <release>` as a deployment check — it matches any release state in Helm 4."
|
|
95
|
+
- "Use `helm list --deployed` or `helm status <release>` for definitive deployed-state checks."
|
|
96
|
+
- "When migrating to ubuntu-26.04, audit all scripts that parse `helm list` output."
|
|
97
|
+
- "Add `--output json` to `helm list` calls and parse `status` field explicitly rather than relying on line-presence checks."
|
|
98
|
+
- "Pin Helm 3 with `azure/setup-helm` if your scripts are not yet Helm 4 compatible."
|
|
99
|
+
docs:
|
|
100
|
+
- url: 'https://github.com/helm/helm/issues/31784'
|
|
101
|
+
label: 'helm/helm#31784 — Breaking change to helm list CLI command in v4'
|
|
102
|
+
- url: 'https://helm.sh/docs/topics/v4_migration/'
|
|
103
|
+
label: 'Helm v4 Migration Guide'
|
|
104
|
+
- url: 'https://helm.sh/docs/helm/helm_list/'
|
|
105
|
+
label: 'helm list command reference'
|
|
106
|
+
- url: 'https://github.com/actions/runner-images/commit/9e3319d6b4acc306925295853d0ff41ddd5c40f0'
|
|
107
|
+
label: 'runner-images commit: ubuntu-26.04 installs Helm 4'
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
id: yaml-syntax-072
|
|
2
|
+
title: 'concurrency queue: max rejected as "Unknown Property" by act and actionlint (May 2026 schema lag)'
|
|
3
|
+
category: yaml-syntax
|
|
4
|
+
severity: error
|
|
5
|
+
tags:
|
|
6
|
+
- concurrency
|
|
7
|
+
- queue
|
|
8
|
+
- act
|
|
9
|
+
- actionlint
|
|
10
|
+
- schema-validation
|
|
11
|
+
- local-ci
|
|
12
|
+
- queue-max
|
|
13
|
+
patterns:
|
|
14
|
+
- regex: 'Unknown Property queue'
|
|
15
|
+
flags: 'i'
|
|
16
|
+
- regex: 'Failed to match concurrency-mapping.*Unknown Property queue'
|
|
17
|
+
flags: 'is'
|
|
18
|
+
- regex: 'concurrency.*queue.*unknown|queue.*max.*schema.*invalid'
|
|
19
|
+
flags: 'i'
|
|
20
|
+
- regex: 'actionlint.*"queue".*unknown key'
|
|
21
|
+
flags: 'i'
|
|
22
|
+
error_messages:
|
|
23
|
+
- "Line: 4 Column 3: Unknown Property queue"
|
|
24
|
+
- "Failed to match concurrency-mapping: Line: 6 Column 3: Unknown Property queue"
|
|
25
|
+
- 'Actions YAML Schema Validation Error detected: Unknown Property queue'
|
|
26
|
+
- 'unknown key "queue" for "concurrency"'
|
|
27
|
+
root_cause: |
|
|
28
|
+
GitHub added the `queue` field to the concurrency block in May 2026 (Changelog:
|
|
29
|
+
"GitHub Actions concurrency groups now allow larger queues"). The new field accepts
|
|
30
|
+
`single` (default — one pending run) or `max` (up to 100 queued runs).
|
|
31
|
+
|
|
32
|
+
Local workflow tooling has not been updated to recognize this field:
|
|
33
|
+
|
|
34
|
+
- **nektos/act ≤0.2.88** — `pkg/schema/workflow_schema.json` defines `concurrency-mapping`
|
|
35
|
+
with only `group` and `cancel-in-progress`. Any workflow using `queue: max` or
|
|
36
|
+
`queue: single` fails immediately at schema validation, before any step runs.
|
|
37
|
+
|
|
38
|
+
- **rhysd/actionlint ≤1.7.8** — the actionlint parser similarly rejects `queue` as an
|
|
39
|
+
unknown concurrency key, blocking pre-commit hooks and CI lint gates.
|
|
40
|
+
|
|
41
|
+
This is a **tooling lag** — the workflow is perfectly valid on GitHub.com and runs
|
|
42
|
+
correctly in hosted runners. The failure only occurs in local development environments
|
|
43
|
+
and CI pipelines that use act or actionlint for pre-flight validation.
|
|
44
|
+
|
|
45
|
+
SchemaStore (github-workflow.json) already encodes the `queue` enum, so VS Code's
|
|
46
|
+
GitHub Actions extension does NOT exhibit this error.
|
|
47
|
+
fix: |
|
|
48
|
+
Until act and actionlint release updated versions with queue support, use one of:
|
|
49
|
+
|
|
50
|
+
1. Upgrade act to a version that includes PR #6097 (queue schema fix) — check
|
|
51
|
+
github.com/nektos/act for the minimum patched version.
|
|
52
|
+
|
|
53
|
+
2. Upgrade actionlint to a version that includes the fix for issue #657.
|
|
54
|
+
|
|
55
|
+
3. Skip schema validation for workflows that use queue (act: add --no-schema-valid flag;
|
|
56
|
+
actionlint: add -ignore 'queue' comment).
|
|
57
|
+
|
|
58
|
+
4. Temporarily remove queue: max while waiting for local tooling to catch up; GitHub.com
|
|
59
|
+
itself already supports it and local validation is the only blocker.
|
|
60
|
+
fix_code:
|
|
61
|
+
- language: yaml
|
|
62
|
+
label: 'Correct workflow syntax — valid on GitHub.com even if local tools reject it'
|
|
63
|
+
code: |
|
|
64
|
+
concurrency:
|
|
65
|
+
group: ${{ github.workflow }}-${{ github.ref }}
|
|
66
|
+
cancel-in-progress: false
|
|
67
|
+
queue: max # queues up to 100 pending runs instead of cancelling them
|
|
68
|
+
- language: yaml
|
|
69
|
+
label: 'Suppress actionlint error with inline ignore comment'
|
|
70
|
+
code: |
|
|
71
|
+
concurrency:
|
|
72
|
+
group: ${{ github.workflow }}-${{ github.ref }}
|
|
73
|
+
cancel-in-progress: false
|
|
74
|
+
queue: max # actionlint:ignore
|
|
75
|
+
- language: yaml
|
|
76
|
+
label: 'Skip act schema validation flag (temporary workaround)'
|
|
77
|
+
code: |
|
|
78
|
+
# In .actrc or CLI:
|
|
79
|
+
# act --no-schema-validate
|
|
80
|
+
prevention:
|
|
81
|
+
- 'Pin act and actionlint versions in your tooling and monitor their changelogs when GitHub Actions releases new YAML keys.'
|
|
82
|
+
- 'When a workflow is valid on GitHub.com but rejected locally, check if it uses a recently-added key (queue, timezone, etc.) that local tools have not caught up with.'
|
|
83
|
+
- 'Use the SchemaStore github-workflow.json schema in VS Code for real-time validation — it tends to be updated faster than act/actionlint.'
|
|
84
|
+
- 'Do not block PR merges on local-only actionlint errors when the same workflow runs successfully in GitHub Actions CI.'
|
|
85
|
+
docs:
|
|
86
|
+
- url: 'https://github.com/nektos/act/issues/6095'
|
|
87
|
+
label: 'nektos/act#6095 — concurrency.queue fails schema validation (May 2026)'
|
|
88
|
+
- url: 'https://github.com/rhysd/actionlint/issues/657'
|
|
89
|
+
label: 'rhysd/actionlint#657 — unknown key "queue" for concurrency'
|
|
90
|
+
- url: 'https://github.blog/changelog/2026-05-07-github-actions-concurrency-groups-now-allow-larger-queues/'
|
|
91
|
+
label: 'GitHub Changelog — concurrency groups now allow larger queues (May 2026)'
|
|
92
|
+
- url: 'https://docs.github.com/en/actions/reference/workflows-and-actions/workflow-syntax#concurrencyqueue'
|
|
93
|
+
label: 'GitHub Docs — concurrency.queue syntax reference'
|