@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.
@@ -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)'