@htekdev/actions-debugger 1.0.117 → 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/caching-artifacts-069.yml +133 -0
- package/errors/concurrency-timing/workflow-run-head-branch-null-schedule-dispatch-concurrency.yml +135 -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/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,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'
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
id: triggers-070
|
|
2
|
+
title: '`on: pull_request: types: [labeled]` fires for every label applied to a PR —
|
|
3
|
+
no trigger-level label-name filter exists; must use `if:` condition'
|
|
4
|
+
category: triggers
|
|
5
|
+
severity: silent-failure
|
|
6
|
+
tags:
|
|
7
|
+
- pull_request
|
|
8
|
+
- labeled
|
|
9
|
+
- label
|
|
10
|
+
- types
|
|
11
|
+
- label-name-filter
|
|
12
|
+
- deployment-gate
|
|
13
|
+
patterns:
|
|
14
|
+
- regex: 'types:\s*[\[\n].*labeled'
|
|
15
|
+
flags: 'si'
|
|
16
|
+
error_messages:
|
|
17
|
+
- "No error — workflow runs for every label applied to the PR, including unrelated labels"
|
|
18
|
+
- "No error — workflow run count is higher than expected; runs appear for all label events"
|
|
19
|
+
root_cause: |
|
|
20
|
+
When `types: [labeled]` is added to a `pull_request` trigger, the workflow fires for
|
|
21
|
+
EVERY label applied to the pull request — not only a specific label. There is no
|
|
22
|
+
trigger-level filter for label names. GitHub Actions does not support syntax like
|
|
23
|
+
`types: [labeled: 'deploy-preview']` or `label: 'X'` at the trigger level.
|
|
24
|
+
|
|
25
|
+
Teams building label-gated workflows (deploy-preview, run-integration-tests,
|
|
26
|
+
approved-for-staging, force-rebuild) are surprised to find the workflow fires for
|
|
27
|
+
entirely unrelated labels ('bug', 'enhancement', 'wontfix', 'good first issue').
|
|
28
|
+
The result is:
|
|
29
|
+
- Excessive workflow runs that show up in the Actions tab for every label event
|
|
30
|
+
- Wasted CI minutes for runs that skip all meaningful steps
|
|
31
|
+
- Unexpected side effects if the workflow performs mutations (deploy, comment, notify)
|
|
32
|
+
that should only happen for the specific label
|
|
33
|
+
|
|
34
|
+
This is distinct from the related issue triggers-030 ("labeled NOT in default types"):
|
|
35
|
+
- triggers-030: workflow NEVER fires because labeled is missing from default types
|
|
36
|
+
- triggers-070: workflow fires TOO OFTEN because ALL label events trigger it
|
|
37
|
+
|
|
38
|
+
The behavior is documented: `types: [labeled]` is a webhook activity type filter,
|
|
39
|
+
not a payload content filter. Payload-level filtering (label name, PR author, etc.)
|
|
40
|
+
must be done via `if:` conditions on jobs or steps.
|
|
41
|
+
fix: |
|
|
42
|
+
Add a job-level `if:` condition filtering on `github.event.label.name`. This is the
|
|
43
|
+
only mechanism — no trigger-level label-name filtering exists.
|
|
44
|
+
|
|
45
|
+
Key context properties for label-based filtering:
|
|
46
|
+
- `github.event.action` — 'labeled' or 'unlabeled'
|
|
47
|
+
- `github.event.label.name` — the label JUST applied (only set for labeled/unlabeled events)
|
|
48
|
+
- `github.event.pull_request.labels.*.name` — ALL current labels on the PR (useful for
|
|
49
|
+
opened/synchronize/reopened events where a label may already be present)
|
|
50
|
+
fix_code:
|
|
51
|
+
- language: yaml
|
|
52
|
+
label: 'WRONG — fires for every label including unrelated ones'
|
|
53
|
+
code: |
|
|
54
|
+
on:
|
|
55
|
+
pull_request:
|
|
56
|
+
types: [labeled]
|
|
57
|
+
|
|
58
|
+
jobs:
|
|
59
|
+
deploy-preview:
|
|
60
|
+
runs-on: ubuntu-latest
|
|
61
|
+
steps:
|
|
62
|
+
- run: echo "Deploying preview..."
|
|
63
|
+
# Runs for EVERY label: 'bug', 'wontfix', 'enhancement', 'deploy-preview', etc.
|
|
64
|
+
- language: yaml
|
|
65
|
+
label: 'RIGHT — filter by specific label name with job-level if:'
|
|
66
|
+
code: |
|
|
67
|
+
on:
|
|
68
|
+
pull_request:
|
|
69
|
+
types: [labeled]
|
|
70
|
+
|
|
71
|
+
jobs:
|
|
72
|
+
deploy-preview:
|
|
73
|
+
if: github.event.label.name == 'deploy-preview'
|
|
74
|
+
runs-on: ubuntu-latest
|
|
75
|
+
steps:
|
|
76
|
+
- run: echo "Deploying preview for PR #${{ github.event.pull_request.number }}"
|
|
77
|
+
- language: yaml
|
|
78
|
+
label: 'RIGHT — label gate that works for both labeled events AND already-labeled PRs'
|
|
79
|
+
code: |
|
|
80
|
+
on:
|
|
81
|
+
pull_request:
|
|
82
|
+
types:
|
|
83
|
+
- opened
|
|
84
|
+
- synchronize
|
|
85
|
+
- reopened
|
|
86
|
+
- labeled # fires when any label is applied; filter below by name
|
|
87
|
+
|
|
88
|
+
jobs:
|
|
89
|
+
deploy-preview:
|
|
90
|
+
if: |
|
|
91
|
+
(github.event.action == 'labeled' && github.event.label.name == 'deploy-preview') ||
|
|
92
|
+
(github.event.action != 'labeled' && contains(github.event.pull_request.labels.*.name, 'deploy-preview'))
|
|
93
|
+
runs-on: ubuntu-latest
|
|
94
|
+
steps:
|
|
95
|
+
- run: echo "Deploying preview..."
|
|
96
|
+
prevention:
|
|
97
|
+
- "Always pair `types: [labeled]` with `if: github.event.label.name == 'your-label'` at the job
|
|
98
|
+
level to gate on the specific label."
|
|
99
|
+
- 'Document which label triggers which workflow in a comment near the trigger definition.'
|
|
100
|
+
- 'Test label-gated workflows by applying both the expected label AND an unrelated label to verify
|
|
101
|
+
the `if:` filter correctly skips unintended runs.'
|
|
102
|
+
- 'Consider using only `types: [labeled]` (not opened/sync/reopened) if the workflow should only
|
|
103
|
+
run when the label is freshly applied, not on every code push to already-labeled PRs.'
|
|
104
|
+
docs:
|
|
105
|
+
- url: 'https://docs.github.com/en/actions/writing-workflows/choosing-when-your-workflow-runs/events-that-trigger-workflows#pull_request'
|
|
106
|
+
label: 'GitHub Docs: pull_request event — labeled activity type'
|
|
107
|
+
- url: 'https://docs.github.com/en/webhooks/webhook-events-and-payloads#pull_request'
|
|
108
|
+
label: 'GitHub Webhook Docs: pull_request payload (label field)'
|
|
109
|
+
- url: 'https://stackoverflow.com/questions/62325286/run-github-actions-when-pull-requests-have-a-specific-label'
|
|
110
|
+
label: 'Stack Overflow: Run GitHub Actions when pull requests have a specific label (43 votes)'
|