@htekdev/actions-debugger 1.0.116 → 1.0.118

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (22) hide show
  1. package/errors/caching-artifacts/cache-key-windows-path-separator-never-matches.yml +107 -0
  2. package/errors/caching-artifacts/caching-artifacts-069.yml +133 -0
  3. package/errors/concurrency-timing/rerun-failed-jobs-bypasses-concurrency-group.yml +89 -0
  4. package/errors/concurrency-timing/workflow-run-head-branch-null-schedule-dispatch-concurrency.yml +135 -0
  5. package/errors/known-unsolved/empty-matrix-fromjson-workflow-failure-no-conditional-skip.yml +108 -0
  6. package/errors/known-unsolved/node-action-post-step-wrong-inputs-nested-composite.yml +133 -0
  7. package/errors/known-unsolved/ubuntu-24-04-arm64-missing-binder-ashmem-kernel-modules.yml +149 -0
  8. package/errors/permissions-auth/permissions-auth-069.yml +161 -0
  9. package/errors/runner-environment/arc-autoscalinglistener-ephemeralrunnerset-stale-after-upgrade.yml +134 -0
  10. package/errors/runner-environment/broker-server-socket-exception-nat-timeout-linux.yml +114 -0
  11. package/errors/runner-environment/checkout-v603-hash-algorithm-api-rate-limiting.yml +100 -0
  12. package/errors/runner-environment/macos-self-hosted-listener-aad-ghost-busy-stall.yml +126 -0
  13. package/errors/runner-environment/runner-environment-210.yml +105 -0
  14. package/errors/runner-environment/runner-environment-213.yml +142 -0
  15. package/errors/runner-environment/setup-node-ebaddevengines-devengines-packagemanager.yml +103 -0
  16. package/errors/runner-environment/ubuntu-24-man-db-dpkg-trigger-apt-install-stall.yml +94 -0
  17. package/errors/runner-environment/ubuntu-26-04-missing-preinstalled-tools.yml +178 -0
  18. package/errors/runner-environment/upload-artifact-v6-proxy-headers-leak-strict-proxy-fail.yml +101 -0
  19. package/errors/silent-failures/silent-failures-108.yml +108 -0
  20. package/errors/triggers/pull-request-labeled-fires-all-labels-no-name-filter.yml +110 -0
  21. package/errors/yaml-syntax/duplicate-step-id-within-job-scope-validation-error.yml +130 -0
  22. package/package.json +1 -1
@@ -0,0 +1,103 @@
1
+ id: runner-environment-204
2
+ title: 'setup-node fails with EBADDEVENGINES when devEngines.packageManager requires a newer npm than Node ships'
3
+ category: runner-environment
4
+ severity: error
5
+ tags:
6
+ - setup-node
7
+ - npm
8
+ - devEngines
9
+ - EBADDEVENGINES
10
+ - package-manager
11
+ - node-22
12
+ - package-json
13
+ patterns:
14
+ - regex: 'npm error code EBADDEVENGINES'
15
+ flags: 'i'
16
+ - regex: 'EBADDEVENGINES.*Invalid devEngines\.packageManager'
17
+ flags: 'i'
18
+ - regex: 'Invalid semver version.*does not match.*for "packageManager"'
19
+ flags: 'i'
20
+ - regex: 'npm config get cache.*EBADDEVENGINES'
21
+ flags: 'si'
22
+ error_messages:
23
+ - 'npm error code EBADDEVENGINES'
24
+ - 'npm error EBADDEVENGINES The developer of this package has specified the following through devEngines'
25
+ - 'npm error EBADDEVENGINES Invalid devEngines.packageManager'
26
+ - 'npm error EBADDEVENGINES Invalid semver version "^11.10.0" does not match "10.9.7" for "packageManager"'
27
+ - '/opt/hostedtoolcache/node/22.22.2/x64/bin/npm config get cache'
28
+ root_cause: |
29
+ actions/setup-node detects the package manager by running `npm config get cache`
30
+ early in its initialization — before any user-specified npm upgrade step can run.
31
+ When package.json contains a `devEngines.packageManager` field specifying a minimum
32
+ npm version higher than the version bundled with the selected Node.js release, npm
33
+ enforces the devEngines constraint and exits with EBADDEVENGINES during that preflight
34
+ `npm config get cache` call, causing setup-node to fail immediately.
35
+
36
+ Example: Node.js v22 ships with npm v10. If package.json requires:
37
+ "devEngines": { "packageManager": { "name": "npm", "version": "^11.10.0" } }
38
+ then npm v10 raises EBADDEVENGINES, aborting setup-node before the user can run
39
+ `npm install --global npm@latest` in a subsequent step.
40
+
41
+ The `devEngines` field (npm RFC) was introduced in Node.js 22's era and allows
42
+ packages to declare their required toolchain. npm 10.x enforces it strictly by
43
+ default. Source: actions/setup-node#1553.
44
+ fix: |
45
+ Option 1 — Use the npm-version input on setup-node (recommended):
46
+ If setup-node applies the npm-version upgrade before its package manager detection,
47
+ the correct npm version will already be present when devEngines is checked.
48
+ Test this first; behaviour may depend on setup-node version.
49
+
50
+ Option 2 — Set devEngines.packageManager.onFail to "warn" in package.json:
51
+ npm 10.9+ supports an `onFail` sub-field that downgrades the constraint violation
52
+ from fatal error to warning. This allows CI to proceed and install the required
53
+ npm in a subsequent step.
54
+
55
+ Option 3 — Use explicit node-version instead of node-version-file:
56
+ When node-version-file is used, setup-node reads package.json to determine the
57
+ Node version, which may trigger the devEngines check. Using an explicit
58
+ node-version string avoids reading package.json entirely for version resolution.
59
+
60
+ Option 4 — Remove or relax devEngines.packageManager for CI use:
61
+ Consider whether the devEngines constraint is necessary for CI vs local dev.
62
+ A `.npmrc` with `engine-strict=false` in the repo will disable enforcement
63
+ for all npm operations in that directory, but this also affects local installs.
64
+ fix_code:
65
+ - language: yaml
66
+ label: 'Option 1 — use npm-version input to pre-install required npm'
67
+ code: |
68
+ - uses: actions/setup-node@v6
69
+ with:
70
+ node-version-file: package.json # Reads engines.node
71
+ npm-version: '11' # Pre-installs npm 11 before devEngines check
72
+ - language: yaml
73
+ label: 'Option 3 — use explicit node-version to skip package.json parsing'
74
+ code: |
75
+ - uses: actions/setup-node@v6
76
+ with:
77
+ node-version: '22' # Explicit version; does not read package.json
78
+ # Install required npm explicitly in a later step
79
+ - run: npm install --global npm@^11.10.0
80
+ - language: json
81
+ label: 'Option 2 — set onFail: warn in package.json to prevent fatal error'
82
+ code: |
83
+ {
84
+ "devEngines": {
85
+ "packageManager": {
86
+ "name": "npm",
87
+ "version": "^11.10.0",
88
+ "onFail": "warn"
89
+ }
90
+ }
91
+ }
92
+ prevention:
93
+ - 'When adopting devEngines.packageManager in package.json, test the CI setup-node step immediately — it may fail before your npm upgrade step can run'
94
+ - 'Set devEngines.packageManager.onFail: "warn" in any repo where CI installs the required npm version dynamically rather than having it pre-installed'
95
+ - 'Use the npm-version input on setup-node when your package.json requires a specific npm version via devEngines'
96
+ - 'Avoid relying on node-version-file if your package.json contains strict devEngines constraints and you need to upgrade the package manager in CI'
97
+ docs:
98
+ - url: 'https://github.com/actions/setup-node/issues/1553'
99
+ label: 'actions/setup-node#1553: npm config get cache fails with EBADDEVENGINES'
100
+ - url: 'https://docs.npmjs.com/cli/v11/configuring-npm/package-json#devengines'
101
+ label: 'npm docs: devEngines field in package.json'
102
+ - url: 'https://github.com/nodejs/package-maintenance/issues/539'
103
+ label: 'Node.js RFC: devEngines field specification'
@@ -0,0 +1,94 @@
1
+ id: runner-environment-207
2
+ title: 'ubuntu-24.04 man-db dpkg trigger stalls apt-get install for minutes'
3
+ category: runner-environment
4
+ severity: warning
5
+ tags:
6
+ - ubuntu-24.04
7
+ - apt-get
8
+ - man-db
9
+ - dpkg-trigger
10
+ - package-installation
11
+ - self-hosted
12
+ patterns:
13
+ - regex: 'Processing triggers for man-db \('
14
+ flags: 'i'
15
+ - regex: 'man-db \(2\.1[0-9]\.[0-9]'
16
+ flags: 'i'
17
+ error_messages:
18
+ - 'Processing triggers for man-db (2.12.0-4build2) ...'
19
+ - 'Processing triggers for man-db ...'
20
+ root_cause: |
21
+ The `man-db` package is pre-installed on ubuntu-24.04 GitHub-hosted runner
22
+ images (and is commonly present on self-hosted Ubuntu 24.04 runners). When
23
+ any `apt-get install` step installs or upgrades a package that ships man
24
+ pages, the dpkg trigger for `man-db` fires automatically and rebuilds the
25
+ entire manual-page database.
26
+
27
+ On ubuntu-24.04 runners, this database regeneration reads and writes several
28
+ gigabytes of data through the runner's I/O subsystem, which is heavily
29
+ shared and has limited I/O resources. The trigger typically hangs the step
30
+ for **1–7+ minutes** even for simple package installs like `cmake` or
31
+ `libssl-dev`.
32
+
33
+ GitHub fixed this in hosted runner image ubuntu24/20251102.99 (November
34
+ 2025) by removing `man-db` from the default image. However, self-hosted
35
+ runners on Ubuntu 24.04 that predate this fix, Docker-based container jobs
36
+ using ubuntu:24.04, and pinned runner image versions remain affected.
37
+
38
+ The equivalent tzdata hang (`sudo DEBIAN_FRONTEND=noninteractive apt-get ...`)
39
+ is a separate issue caused by interactive prompts; the man-db issue is
40
+ distinct — it stalls silently with no interactive prompt.
41
+ fix: |
42
+ **For self-hosted runners or container jobs (manual fix):**
43
+
44
+ Add a step before package installation to remove man-db:
45
+
46
+ ```yaml
47
+ - name: Disable man-db trigger
48
+ run: sudo rm -f /var/lib/man-db/auto-update
49
+ ```
50
+
51
+ Or uninstall man-db entirely:
52
+
53
+ ```yaml
54
+ - name: Remove man-db
55
+ run: sudo apt-get remove -y --purge man-db 2>/dev/null || true
56
+ ```
57
+
58
+ **For GitHub-hosted runners:**
59
+ Upgrade to ubuntu-24.04 runner image version ubuntu24/20251102.99 or later.
60
+ The latest ubuntu-24.04 label automatically uses a fixed image.
61
+
62
+ **Minimal impact workaround (all runners):**
63
+ Use `DEBIAN_FRONTEND=noninteractive` — this avoids tzdata prompts but does
64
+ NOT prevent the man-db trigger. You must use the `rm -f /var/lib/man-db/auto-update`
65
+ approach to suppress the trigger.
66
+ fix_code:
67
+ - language: yaml
68
+ label: 'Disable man-db trigger before apt-get install'
69
+ code: |
70
+ - name: Remove man-db auto-update trigger
71
+ run: sudo rm -f /var/lib/man-db/auto-update
72
+
73
+ - name: Install dependencies
74
+ run: sudo apt-get install -y cmake libssl-dev
75
+ - language: yaml
76
+ label: 'Uninstall man-db entirely (self-hosted runners)'
77
+ code: |
78
+ - name: Remove man-db (prevents dpkg trigger overhead)
79
+ run: sudo apt-get remove -y --purge man-db 2>/dev/null || true
80
+
81
+ - name: Install dependencies
82
+ run: sudo apt-get install -y cmake libssl-dev
83
+ prevention:
84
+ - 'Add a man-db removal step at the top of jobs that run apt-get install on self-hosted ubuntu-24.04 runners'
85
+ - 'On GitHub-hosted runners, always use the current ubuntu-24.04 label (not pinned image SHAs from before November 2025)'
86
+ - 'For Docker container jobs, use an image that does not pre-install man-db, or add the removal step to your Dockerfile'
87
+ - 'Set a job-level timeout-minutes so that an unexpected man-db stall does not consume runner quota for hours'
88
+ docs:
89
+ - url: 'https://github.com/actions/runner/issues/4030'
90
+ label: 'actions/runner#4030 — man-db trigger severely stalls apt-get on ubuntu-24.04'
91
+ - url: 'https://github.com/actions/runner-images/issues/10977'
92
+ label: 'runner-images#10977 — Disable man-db dpkg trigger (fixed in ubuntu24/20251102.99)'
93
+ - url: 'https://bugs.launchpad.net/ubuntu/+source/man-db/+bug/2073797'
94
+ label: 'Ubuntu bug #2073797 — man-db trigger performance regression'
@@ -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'