@htekdev/actions-debugger 1.0.117 → 1.0.119
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-069.yml +133 -0
- 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/workflow-run-head-branch-null-schedule-dispatch-concurrency.yml +135 -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/node-action-post-step-wrong-inputs-nested-composite.yml +133 -0
- package/errors/known-unsolved/ubuntu-24-04-arm64-missing-binder-ashmem-kernel-modules.yml +149 -0
- package/errors/permissions-auth/permissions-auth-069.yml +161 -0
- package/errors/runner-environment/arc-autoscalinglistener-ephemeralrunnerset-stale-after-upgrade.yml +134 -0
- package/errors/runner-environment/broker-server-socket-exception-nat-timeout-linux.yml +114 -0
- package/errors/runner-environment/runner-environment-210.yml +105 -0
- package/errors/runner-environment/runner-environment-213.yml +142 -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/runner-environment/ubuntu-24-man-db-dpkg-trigger-apt-install-stall.yml +94 -0
- package/errors/runner-environment/ubuntu-26-04-missing-preinstalled-tools.yml +178 -0
- package/errors/runner-environment/upload-artifact-v6-proxy-headers-leak-strict-proxy-fail.yml +101 -0
- package/errors/silent-failures/silent-failures-108.yml +108 -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/triggers/pull-request-labeled-fires-all-labels-no-name-filter.yml +110 -0
- package/errors/yaml-syntax/duplicate-step-id-within-job-scope-validation-error.yml +130 -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,178 @@
|
|
|
1
|
+
id: runner-environment-212
|
|
2
|
+
title: 'ubuntu-26.04 Runner Image Removes Many Pre-installed Tools — grunt, gulp, tsc, webpack, lerna, fastlane, Pulumi, Julia, Miniconda Absent'
|
|
3
|
+
category: runner-environment
|
|
4
|
+
severity: error
|
|
5
|
+
tags:
|
|
6
|
+
- ubuntu-26.04
|
|
7
|
+
- runner-image
|
|
8
|
+
- pre-installed-tools
|
|
9
|
+
- migration
|
|
10
|
+
- breaking-change
|
|
11
|
+
- nodejs-tools
|
|
12
|
+
- toolset
|
|
13
|
+
patterns:
|
|
14
|
+
- regex: 'grunt: command not found|grunt.*not found.*ubuntu'
|
|
15
|
+
flags: 'i'
|
|
16
|
+
- regex: 'gulp: command not found|gulp.*not found.*ubuntu'
|
|
17
|
+
flags: 'i'
|
|
18
|
+
- regex: '(tsc|webpack|webpack-cli|lerna|newman|parcel): command not found'
|
|
19
|
+
flags: 'i'
|
|
20
|
+
- regex: 'fastlane: command not found|fastlane.*not found.*ubuntu'
|
|
21
|
+
flags: 'i'
|
|
22
|
+
- regex: 'pulumi: command not found|julia: command not found|conda: command not found'
|
|
23
|
+
flags: 'i'
|
|
24
|
+
error_messages:
|
|
25
|
+
- '/usr/bin/env: grunt: No such file or directory'
|
|
26
|
+
- 'grunt: command not found'
|
|
27
|
+
- 'webpack: command not found'
|
|
28
|
+
- 'tsc: command not found'
|
|
29
|
+
- 'gulp: command not found'
|
|
30
|
+
- 'lerna: command not found'
|
|
31
|
+
- 'newman: command not found'
|
|
32
|
+
- 'parcel: command not found'
|
|
33
|
+
- 'fastlane: command not found'
|
|
34
|
+
- 'pulumi: command not found'
|
|
35
|
+
- 'julia: command not found'
|
|
36
|
+
- 'conda: command not found'
|
|
37
|
+
root_cause: |
|
|
38
|
+
The ubuntu-26.04 GitHub Actions hosted runner image deliberately removes many
|
|
39
|
+
tools that were pre-installed on ubuntu-22.04 and ubuntu-24.04. The toolset
|
|
40
|
+
was slimmed as part of the ubuntu-26.04 image build (runner-images commit
|
|
41
|
+
9e3319d, `[ubuntu-26] Adjust installed software`, May 2026).
|
|
42
|
+
|
|
43
|
+
**Removed global Node.js CLI tools** (previously installed via npm globally):
|
|
44
|
+
- `grunt` / `grunt-cli`
|
|
45
|
+
- `gulp` / `gulp-cli`
|
|
46
|
+
- `tsc` (TypeScript compiler, was pre-installed globally)
|
|
47
|
+
- `webpack` and `webpack-cli`
|
|
48
|
+
- `lerna` (monorepo manager)
|
|
49
|
+
- `newman` (Postman CLI runner)
|
|
50
|
+
- `parcel` (zero-config bundler)
|
|
51
|
+
|
|
52
|
+
**Removed Ruby gems:**
|
|
53
|
+
- `fastlane` (iOS/Android CI automation)
|
|
54
|
+
|
|
55
|
+
**Removed language runtimes / tools:**
|
|
56
|
+
- `julia` (Julia language, x86_64 only — was in ubuntu-24.04 x64)
|
|
57
|
+
- `miniconda` / `conda` (x86_64 only — was in ubuntu-24.04 x64)
|
|
58
|
+
- `pulumi` (IaC CLI, both x86_64 and ARM64)
|
|
59
|
+
|
|
60
|
+
**Removed system utilities:**
|
|
61
|
+
- `mercurial` (hg version control)
|
|
62
|
+
- `haveged` (entropy daemon)
|
|
63
|
+
- `mediainfo` (media analysis tool)
|
|
64
|
+
- `sphinxsearch` (full-text search server)
|
|
65
|
+
|
|
66
|
+
**Other significant changes on ubuntu-26.04 vs ubuntu-24.04:**
|
|
67
|
+
- **Helm**: updated from 3.x → 4.x (get-helm-4 installer)
|
|
68
|
+
- **Docker Compose**: updated from 2.40.3 → 5.1.3 (major version bump)
|
|
69
|
+
- **Java default**: changed from Java 21 → Java 25
|
|
70
|
+
- `Fastlane` removed from rubygems pre-install
|
|
71
|
+
|
|
72
|
+
Workflows that rely on these tools being pre-installed without an explicit
|
|
73
|
+
installation step will fail immediately on ubuntu-26.04 with "command not
|
|
74
|
+
found" errors.
|
|
75
|
+
fix: |
|
|
76
|
+
Explicitly install any removed tools in your workflow steps before use.
|
|
77
|
+
|
|
78
|
+
For global Node.js tools, add an installation step at the start of your job:
|
|
79
|
+
|
|
80
|
+
```yaml
|
|
81
|
+
- name: Install build tools
|
|
82
|
+
run: npm install -g grunt-cli gulp-cli typescript webpack webpack-cli lerna newman parcel
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
For fastlane:
|
|
86
|
+
```yaml
|
|
87
|
+
- name: Install fastlane
|
|
88
|
+
run: gem install fastlane
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
For Pulumi:
|
|
92
|
+
```yaml
|
|
93
|
+
- uses: pulumi/actions@v6
|
|
94
|
+
# or
|
|
95
|
+
- name: Install Pulumi CLI
|
|
96
|
+
run: curl -fsSL https://get.pulumi.com | sh
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
For Julia:
|
|
100
|
+
```yaml
|
|
101
|
+
- uses: julia-actions/setup-julia@v2
|
|
102
|
+
with:
|
|
103
|
+
version: '1'
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
For Conda / Miniconda:
|
|
107
|
+
```yaml
|
|
108
|
+
- uses: conda-incubator/setup-miniconda@v3
|
|
109
|
+
with:
|
|
110
|
+
auto-activate-base: true
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
For Java 21 (if Java 25 default breaks your build):
|
|
114
|
+
```yaml
|
|
115
|
+
- uses: actions/setup-java@v4
|
|
116
|
+
with:
|
|
117
|
+
java-version: '21'
|
|
118
|
+
distribution: 'temurin'
|
|
119
|
+
```
|
|
120
|
+
fix_code:
|
|
121
|
+
- language: yaml
|
|
122
|
+
label: 'Explicitly install removed Node.js tools and pin Java version on ubuntu-26.04'
|
|
123
|
+
code: |
|
|
124
|
+
jobs:
|
|
125
|
+
build:
|
|
126
|
+
runs-on: ubuntu-26.04 # or ubuntu-latest when it aliases ubuntu-26.04
|
|
127
|
+
steps:
|
|
128
|
+
- uses: actions/checkout@v6
|
|
129
|
+
|
|
130
|
+
# Install tools removed from ubuntu-26.04 pre-installed toolset
|
|
131
|
+
- name: Install missing build tools
|
|
132
|
+
run: |
|
|
133
|
+
npm install -g grunt-cli typescript webpack webpack-cli lerna
|
|
134
|
+
gem install fastlane
|
|
135
|
+
|
|
136
|
+
# Pin Java version explicitly — ubuntu-26.04 defaults to Java 25
|
|
137
|
+
- uses: actions/setup-java@v4
|
|
138
|
+
with:
|
|
139
|
+
java-version: '21'
|
|
140
|
+
distribution: 'temurin'
|
|
141
|
+
|
|
142
|
+
- name: Build
|
|
143
|
+
run: |
|
|
144
|
+
tsc --version # now available
|
|
145
|
+
grunt build # now available
|
|
146
|
+
- language: yaml
|
|
147
|
+
label: 'Guard workflow with image-conditional tool install'
|
|
148
|
+
code: |
|
|
149
|
+
jobs:
|
|
150
|
+
build:
|
|
151
|
+
runs-on: ${{ matrix.os }}
|
|
152
|
+
strategy:
|
|
153
|
+
matrix:
|
|
154
|
+
os: [ubuntu-24.04, ubuntu-26.04]
|
|
155
|
+
steps:
|
|
156
|
+
- uses: actions/checkout@v6
|
|
157
|
+
|
|
158
|
+
# Install tools only when running on ubuntu-26.04
|
|
159
|
+
# where they are not pre-installed
|
|
160
|
+
- name: Install tools absent on ubuntu-26.04
|
|
161
|
+
if: startsWith(matrix.os, 'ubuntu-26')
|
|
162
|
+
run: npm install -g grunt-cli gulp-cli typescript webpack webpack-cli lerna newman
|
|
163
|
+
|
|
164
|
+
- name: Build
|
|
165
|
+
run: grunt build
|
|
166
|
+
prevention:
|
|
167
|
+
- 'Do not rely on pre-installed tools being available across Ubuntu runner generations — explicitly install all tools your workflow depends on.'
|
|
168
|
+
- 'Pin Java version with actions/setup-java rather than relying on the image default Java version, which changed from 21 to 25 on ubuntu-26.04.'
|
|
169
|
+
- 'Use actions/setup-node + local project devDependencies instead of globally pre-installed Node.js tools (grunt, webpack, tsc, etc.).'
|
|
170
|
+
- 'Review the ubuntu-26.04 software manifest before migrating workflows from ubuntu-24.04 or ubuntu-latest.'
|
|
171
|
+
- 'When ubuntu-latest eventually aliases ubuntu-26.04, workflows that assume pre-installed tools from ubuntu-24.04 will break silently or with "command not found" errors.'
|
|
172
|
+
docs:
|
|
173
|
+
- url: 'https://github.com/actions/runner-images/commit/9e3319d6b4acc306925295853d0ff41ddd5c40f0'
|
|
174
|
+
label: 'runner-images commit 9e3319d — [ubuntu-26] Adjust installed software (May 2026)'
|
|
175
|
+
- url: 'https://github.com/actions/runner-images/blob/main/images/ubuntu/Ubuntu2604-Readme.md'
|
|
176
|
+
label: 'ubuntu-26.04 installed software manifest'
|
|
177
|
+
- url: 'https://github.com/actions/runner-images/issues/14150'
|
|
178
|
+
label: 'runner-images #14150 — PowerShell 7.4→7.6 announcement (lists ubuntu-26.04 as supported image)'
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
id: runner-environment-208
|
|
2
|
+
title: 'upload-artifact@v6 fails behind strict corporate proxy — ECONNRESET or HTTP 400 on CONNECT tunnel'
|
|
3
|
+
category: runner-environment
|
|
4
|
+
severity: error
|
|
5
|
+
tags:
|
|
6
|
+
- upload-artifact
|
|
7
|
+
- v6
|
|
8
|
+
- proxy
|
|
9
|
+
- self-hosted
|
|
10
|
+
- ECONNRESET
|
|
11
|
+
- corporate-network
|
|
12
|
+
- azure-storage
|
|
13
|
+
patterns:
|
|
14
|
+
- regex: 'Proxy connection ended before receiving CONNECT response'
|
|
15
|
+
flags: 'i'
|
|
16
|
+
- regex: 'Unable to make request: ECONNRESET'
|
|
17
|
+
flags: 'i'
|
|
18
|
+
- regex: 'upload-artifact@v[6-9]'
|
|
19
|
+
flags: 'i'
|
|
20
|
+
error_messages:
|
|
21
|
+
- 'Error: Proxy connection ended before receiving CONNECT response'
|
|
22
|
+
- 'Error: Unable to make request: ECONNRESET'
|
|
23
|
+
- 'HTTP 400 Bad Request from proxy'
|
|
24
|
+
root_cause: |
|
|
25
|
+
`actions/upload-artifact@v6` switched its Azure Blob Storage client from
|
|
26
|
+
`@azure/storage-blob` backed by `@azure/core-http` (used in v4/v5) to
|
|
27
|
+
`@azure/storage-blob` backed by `@azure/core-rest-pipeline` and
|
|
28
|
+
`@typespec/ts-http-runtime`.
|
|
29
|
+
|
|
30
|
+
The `proxyPolicy` in `@typespec/ts-http-runtime` contains a bug: it leaks
|
|
31
|
+
destination HTTP request headers — including `content-type`, `content-length`,
|
|
32
|
+
`x-ms-version`, and `accept` — directly into the HTTP `CONNECT` tunnel
|
|
33
|
+
request sent to the corporate proxy. RFC 9110 §9.3.6 does not expect
|
|
34
|
+
`CONNECT` requests to carry a `Content-Length`, and many strict enterprise
|
|
35
|
+
forward proxies (Squid with strict policies, Zscaler, BlueCoat, some HAProxy
|
|
36
|
+
configurations) reject `CONNECT` requests with unexpected headers.
|
|
37
|
+
|
|
38
|
+
This manifests as:
|
|
39
|
+
- `Proxy connection ended before receiving CONNECT response` — proxy drops
|
|
40
|
+
the connection before sending `200 Connection established`
|
|
41
|
+
- `ECONNRESET` — proxy resets the TCP connection
|
|
42
|
+
- HTTP 400 Bad Request — proxy rejects the malformed CONNECT
|
|
43
|
+
|
|
44
|
+
The issue does NOT reproduce with permissive proxies like default Squid
|
|
45
|
+
(which is why GitHub's own CI did not catch it). Only strict corporate proxies
|
|
46
|
+
that validate CONNECT request headers are affected.
|
|
47
|
+
|
|
48
|
+
`actions/upload-artifact@v5` uses the older `@azure/core-http` stack which
|
|
49
|
+
sends proper CONNECT tunnels without leaking headers, so workflows that pin
|
|
50
|
+
to v5 are not affected.
|
|
51
|
+
|
|
52
|
+
The fix was shipped in `actions/upload-artifact@v7.0.1` (April 12, 2026),
|
|
53
|
+
which bumps `@actions/artifact` to a version that uses the fixed
|
|
54
|
+
`@typespec/ts-http-runtime` proxyPolicy.
|
|
55
|
+
fix: |
|
|
56
|
+
**Preferred fix:** Upgrade to `actions/upload-artifact@v7` (v7.0.1 or later):
|
|
57
|
+
|
|
58
|
+
```yaml
|
|
59
|
+
- uses: actions/upload-artifact@v7
|
|
60
|
+
with:
|
|
61
|
+
name: build-artifacts
|
|
62
|
+
path: dist/
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
**Temporary workaround (stay on v6):** Set the `HTTPS_PROXY` environment
|
|
66
|
+
variable AND apply a one-liner patch to strip headers from the ProxyAgent
|
|
67
|
+
call inside the cached action source:
|
|
68
|
+
|
|
69
|
+
```yaml
|
|
70
|
+
- name: Patch upload-artifact proxy headers bug
|
|
71
|
+
run: |
|
|
72
|
+
for f in $(find "${GITHUB_WORKSPACE}/../.." -name "index.js" \
|
|
73
|
+
-path "*actions/upload-artifact*dist*" 2>/dev/null); do
|
|
74
|
+
sed -i 's/ProxyAgent(proxyUrl, { headers })/ProxyAgent(proxyUrl)/g' "$f"
|
|
75
|
+
done
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
**Do NOT downgrade to v5** in new workflows; v5 relies on deprecated
|
|
79
|
+
dependencies. Upgrading to v7 is the correct long-term fix.
|
|
80
|
+
fix_code:
|
|
81
|
+
- language: yaml
|
|
82
|
+
label: 'Upgrade to upload-artifact@v7 (recommended)'
|
|
83
|
+
code: |
|
|
84
|
+
- name: Upload build artifacts
|
|
85
|
+
uses: actions/upload-artifact@v7
|
|
86
|
+
with:
|
|
87
|
+
name: build-artifacts
|
|
88
|
+
path: dist/
|
|
89
|
+
retention-days: 7
|
|
90
|
+
prevention:
|
|
91
|
+
- 'Always upgrade upload-artifact to @v7 or later on self-hosted runners that sit behind a corporate proxy'
|
|
92
|
+
- 'When adding new @v6 steps, test on a runner behind your actual proxy before deploying to all pipelines'
|
|
93
|
+
- 'If the proxy blocks the artifact upload step silently, enable RUNNER_DEBUG=1 to see the full CONNECT request/response cycle'
|
|
94
|
+
- 'Pin to upload-artifact@v7.0.1 or later — earlier v7 releases were not published, v7.0.1 is the first tagged release'
|
|
95
|
+
docs:
|
|
96
|
+
- url: 'https://github.com/actions/upload-artifact/issues/747'
|
|
97
|
+
label: 'upload-artifact#747 — V6 upload stalled behind proxy (10 reactions)'
|
|
98
|
+
- url: 'https://github.com/actions/upload-artifact/pull/792'
|
|
99
|
+
label: 'upload-artifact#792 — Fix proxy headers leak errconnect on strict proxies'
|
|
100
|
+
- url: 'https://github.com/actions/upload-artifact/releases/tag/v7.0.1'
|
|
101
|
+
label: 'upload-artifact v7.0.1 release notes — includes proxy fix'
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
id: silent-failures-108
|
|
2
|
+
title: 'Service container entrypoint: key silently clears Dockerfile CMD — Docker Compose semantics differ from Docker CLI'
|
|
3
|
+
category: silent-failures
|
|
4
|
+
severity: silent-failure
|
|
5
|
+
tags:
|
|
6
|
+
- service-container
|
|
7
|
+
- docker
|
|
8
|
+
- entrypoint
|
|
9
|
+
- command
|
|
10
|
+
- docker-compose
|
|
11
|
+
- breaking-change
|
|
12
|
+
- april-2026
|
|
13
|
+
patterns:
|
|
14
|
+
- regex: 'service.*container.*unhealthy|health.*check.*failed.*service'
|
|
15
|
+
flags: 'i'
|
|
16
|
+
- regex: 'Connection refused.*service|service.*port.*not.*reachable'
|
|
17
|
+
flags: 'i'
|
|
18
|
+
- regex: 'exec.*not.*enough.*arguments|usage:.*\[command\].*\[args\]'
|
|
19
|
+
flags: 'i'
|
|
20
|
+
error_messages:
|
|
21
|
+
- 'Error: Service container failed health check after entrypoint override'
|
|
22
|
+
- 'Connection refused: service port not accepting connections'
|
|
23
|
+
- 'exec: not enough arguments — entrypoint launched without expected CMD'
|
|
24
|
+
root_cause: |
|
|
25
|
+
GitHub Actions added explicit `entrypoint` and `command` keys for service containers
|
|
26
|
+
in the Early April 2026 update. These keys use **Docker Compose semantics**, which
|
|
27
|
+
differ from Docker CLI semantics in one critical way:
|
|
28
|
+
|
|
29
|
+
**Docker CLI** (`docker run --entrypoint /wrapper.sh image`):
|
|
30
|
+
- Overrides the image ENTRYPOINT
|
|
31
|
+
- **Keeps** the image CMD from the Dockerfile
|
|
32
|
+
|
|
33
|
+
**Docker Compose** / GitHub Actions `services.<name>.entrypoint` key:
|
|
34
|
+
- Overrides the image ENTRYPOINT
|
|
35
|
+
- **Clears the image CMD** — the container starts with no CMD arguments
|
|
36
|
+
|
|
37
|
+
This means that if a developer specifies only `entrypoint:` in a service container
|
|
38
|
+
(to wrap or replace the image's startup script) and does not also specify `command:`,
|
|
39
|
+
the container runs the new entrypoint with no arguments. For images that require CMD
|
|
40
|
+
arguments to function (e.g., a PostgreSQL image running `postgres`, a Redis image
|
|
41
|
+
running `redis-server`), the container may exit immediately, enter an error loop, or
|
|
42
|
+
start in a degraded mode.
|
|
43
|
+
|
|
44
|
+
The failure is silent because:
|
|
45
|
+
- The container may still pass a health check if it starts at all
|
|
46
|
+
- The job continues even if the service is in an unexpected state
|
|
47
|
+
- No GitHub Actions error is emitted for CMD mismatch
|
|
48
|
+
|
|
49
|
+
Example: migrating from `options: --entrypoint /wrapper.sh` (which preserved CMD)
|
|
50
|
+
to `entrypoint: /wrapper.sh` (which clears CMD) silently changes the container's
|
|
51
|
+
startup behaviour.
|
|
52
|
+
fix: |
|
|
53
|
+
Always specify `command:` alongside `entrypoint:` in service container configuration
|
|
54
|
+
to explicitly provide the CMD arguments that the original Dockerfile would have
|
|
55
|
+
passed. Do not assume entrypoint-only overrides will inherit the Dockerfile CMD.
|
|
56
|
+
|
|
57
|
+
To preserve the original image's CMD, look up the image's Dockerfile CMD
|
|
58
|
+
(e.g., via `docker inspect <image> --format '{{.Config.Cmd}}'`) and replicate
|
|
59
|
+
it in the `command:` key.
|
|
60
|
+
fix_code:
|
|
61
|
+
- language: yaml
|
|
62
|
+
label: 'Broken — entrypoint only, silently clears CMD (Docker Compose semantics)'
|
|
63
|
+
code: |
|
|
64
|
+
services:
|
|
65
|
+
db:
|
|
66
|
+
image: postgres:16
|
|
67
|
+
# WRONG: entrypoint alone clears the Dockerfile CMD ["postgres"]
|
|
68
|
+
# The container starts /wrapper.sh with no arguments — postgres never runs
|
|
69
|
+
entrypoint: /wrapper.sh
|
|
70
|
+
|
|
71
|
+
- language: yaml
|
|
72
|
+
label: 'Fixed — specify command: to preserve the intended CMD arguments'
|
|
73
|
+
code: |
|
|
74
|
+
services:
|
|
75
|
+
db:
|
|
76
|
+
image: postgres:16
|
|
77
|
+
env:
|
|
78
|
+
POSTGRES_PASSWORD: test
|
|
79
|
+
# Wrap the entrypoint AND preserve the original CMD
|
|
80
|
+
entrypoint: /wrapper.sh
|
|
81
|
+
command: ["postgres"] # explicit CMD to preserve what Dockerfile would pass
|
|
82
|
+
|
|
83
|
+
- language: yaml
|
|
84
|
+
label: 'Alternative — use options: --entrypoint if you want to keep Dockerfile CMD'
|
|
85
|
+
code: |
|
|
86
|
+
services:
|
|
87
|
+
db:
|
|
88
|
+
image: postgres:16
|
|
89
|
+
env:
|
|
90
|
+
POSTGRES_PASSWORD: test
|
|
91
|
+
# Legacy approach: Docker CLI semantics — preserves Dockerfile CMD automatically
|
|
92
|
+
options: >-
|
|
93
|
+
--entrypoint /wrapper.sh
|
|
94
|
+
--health-cmd "pg_isready -U postgres"
|
|
95
|
+
--health-interval 5s
|
|
96
|
+
|
|
97
|
+
prevention:
|
|
98
|
+
- 'When using the new entrypoint: key on a service container, always pair it with an explicit command: key — never rely on the Dockerfile CMD being inherited.'
|
|
99
|
+
- 'If migrating from options: --entrypoint to the new entrypoint: key, remember that the options: approach preserved CMD while the new key does not.'
|
|
100
|
+
- 'Test service container health immediately after adding entrypoint: overrides — a passing health check may mask CMD loss if the entrypoint script does not require CMD arguments.'
|
|
101
|
+
- 'Run docker inspect <image> --format "{{.Config.Cmd}}" locally to discover what CMD values the Dockerfile sets before overriding entrypoint in CI.'
|
|
102
|
+
docs:
|
|
103
|
+
- url: 'https://github.blog/changelog/2026-04-02-github-actions-early-april-2026-updates/#customizing-entrypoints-for-service-containers'
|
|
104
|
+
label: 'GitHub Changelog: Customizing entrypoints for service containers (April 2026)'
|
|
105
|
+
- url: 'https://docs.github.com/en/actions/writing-workflows/workflow-syntax-for-github-actions#jobsjob_idservicesservice_identrypoint'
|
|
106
|
+
label: 'GitHub Docs: jobs.<id>.services.<id>.entrypoint syntax'
|
|
107
|
+
- url: 'https://docs.docker.com/compose/compose-file/05-services/#entrypoint'
|
|
108
|
+
label: 'Docker Compose docs: entrypoint key clears CMD'
|
|
@@ -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'
|