@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.
- package/errors/caching-artifacts/cache-key-windows-path-separator-never-matches.yml +107 -0
- package/errors/caching-artifacts/caching-artifacts-069.yml +133 -0
- package/errors/concurrency-timing/rerun-failed-jobs-bypasses-concurrency-group.yml +89 -0
- package/errors/concurrency-timing/workflow-run-head-branch-null-schedule-dispatch-concurrency.yml +135 -0
- package/errors/known-unsolved/empty-matrix-fromjson-workflow-failure-no-conditional-skip.yml +108 -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/checkout-v603-hash-algorithm-api-rate-limiting.yml +100 -0
- package/errors/runner-environment/macos-self-hosted-listener-aad-ghost-busy-stall.yml +126 -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/setup-node-ebaddevengines-devengines-packagemanager.yml +103 -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/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/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'
|