@htekdev/actions-debugger 1.0.22 → 1.0.24
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/artifact-minimum-retention-one-day.yml +153 -0
- package/errors/caching-artifacts/cache-api-propagation-delay-post-save.yml +128 -0
- package/errors/caching-artifacts/cache-backend-internal-error-skipped.yml +75 -0
- package/errors/caching-artifacts/cache-hit-step-id-case-sensitive-mismatch.yml +95 -0
- package/errors/caching-artifacts/cache-save-post-step-skipped-on-failure.yml +114 -0
- package/errors/concurrency-timing/deploy-pages-in-progress-deployment-wedged.yml +70 -0
- package/errors/concurrency-timing/deployment-review-timeout-expired.yml +88 -0
- package/errors/concurrency-timing/job-concurrency-scope-per-run-not-global.yml +81 -0
- package/errors/concurrency-timing/merge-queue-concurrency-cancel-blocks-all.yml +86 -0
- package/errors/concurrency-timing/reusable-workflow-github-workflow-context-cancel.yml +124 -0
- package/errors/concurrency-timing/runner-scale-set-jobs-never-start.yml +123 -0
- package/errors/concurrency-timing/runner-temp-dir-race-concurrent-workers.yml +90 -0
- package/errors/known-unsolved/artifact-download-url-unauthenticated-404.yml +98 -0
- package/errors/known-unsolved/checkout-v6-credentials-docker-run-manual.yml +105 -0
- package/errors/known-unsolved/concurrency-groups-repo-scoped-only.yml +138 -0
- package/errors/known-unsolved/matrix-256-job-limit.yml +142 -0
- package/errors/known-unsolved/merge-group-paths-filter-not-supported.yml +137 -0
- package/errors/known-unsolved/no-job-allow-failure.yml +73 -0
- package/errors/known-unsolved/reusable-secrets-inherit-not-deep-forwarded.yml +113 -0
- package/errors/known-unsolved/schedule-cron-hours-long-queue-drift.yml +101 -0
- package/errors/permissions-auth/checkout-persist-credentials-token-write.yml +90 -0
- package/errors/permissions-auth/create-github-app-token-cross-job-token-revoked.yml +95 -0
- package/errors/permissions-auth/github-token-contents-write-missing-git-push.yml +117 -0
- package/errors/permissions-auth/org-actions-policy-blocks-unapproved-action.yml +106 -0
- package/errors/runner-environment/codeql-action-v2-deprecated.yml +110 -0
- package/errors/runner-environment/macos-26-openssl-3-system-library-breaking.yml +114 -0
- package/errors/runner-environment/macos-26-ruby-34-default-upgrade.yml +114 -0
- package/errors/runner-environment/macos-26-xcode-default-265-pin-required.yml +99 -0
- package/errors/runner-environment/macos-latest-label-switches-to-macos26.yml +127 -0
- package/errors/runner-environment/node20-removed-toolcache-default-node22.yml +104 -0
- package/errors/runner-environment/org-runner-group-dispatch-null.yml +102 -0
- package/errors/runner-environment/powershell-74-76-threadjob-module-rename.yml +124 -0
- package/errors/runner-environment/self-hosted-runner-not-found.yml +134 -0
- package/errors/runner-environment/self-hosted-runner-selinux-service-exec-failure.yml +116 -0
- package/errors/runner-environment/service-container-no-healthcheck.yml +158 -0
- package/errors/runner-environment/setup-node-v5-corepack-pnpm-not-found.yml +101 -0
- package/errors/runner-environment/setup-node-yarn-not-installed-self-hosted.yml +76 -0
- package/errors/runner-environment/setup-python-externally-managed-env-error.yml +95 -0
- package/errors/runner-environment/windows-2019-runner-retired-june2025.yml +118 -0
- package/errors/runner-environment/windows-2022-docker-daemon-not-started.yml +108 -0
- package/errors/silent-failures/cache-hit-output-string-not-boolean.yml +96 -0
- package/errors/silent-failures/checkout-lfs-pointer-not-content.yml +105 -0
- package/errors/silent-failures/reusable-workflow-output-skipped-contains-secret.yml +115 -0
- package/errors/silent-failures/setup-node-silent-download-exit-zero.yml +105 -0
- package/errors/silent-failures/setup-python-truncated-manifest-silent-exit.yml +111 -0
- package/errors/silent-failures/undefined-env-expression-empty-string-silent.yml +115 -0
- package/errors/silent-failures/windows-powershell-github-output-bash-syntax.yml +118 -0
- package/errors/triggers/fork-pr-first-time-contributor-approval-required.yml +142 -0
- package/errors/triggers/on-push-branches-glob-star-no-slash-match.yml +78 -0
- package/errors/triggers/pull-request-target-env-protection-default-branch-eval.yml +117 -0
- package/errors/triggers/required-status-check-renamed-never-passes.yml +87 -0
- package/errors/triggers/schedule-cron-self-hosted-runner-not-triggered.yml +107 -0
- package/errors/triggers/workflow-run-checkout-uses-default-branch.yml +114 -0
- package/errors/yaml-syntax/composite-action-run-shell-missing.yml +90 -0
- package/errors/yaml-syntax/composite-action-secrets-context-unavailable.yml +99 -0
- package/errors/yaml-syntax/github-script-octokit-renamed-to-github.yml +130 -0
- package/errors/yaml-syntax/labeler-v5-config-format-breaking.yml +67 -0
- package/errors/yaml-syntax/reusable-workflow-nesting-depth-exceeded.yml +113 -0
- package/errors/yaml-syntax/runs-on-expression-array-syntax-error.yml +121 -0
- package/errors/yaml-syntax/setup-go-matrix-version-float-coercion.yml +69 -0
- package/package.json +1 -1
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
id: runner-environment-066
|
|
2
|
+
title: "Service Container Unhealthy — No Healthcheck Causes Job to Run Before Container Is Ready"
|
|
3
|
+
category: runner-environment
|
|
4
|
+
severity: error
|
|
5
|
+
tags:
|
|
6
|
+
- service-container
|
|
7
|
+
- postgres
|
|
8
|
+
- mysql
|
|
9
|
+
- redis
|
|
10
|
+
- healthcheck
|
|
11
|
+
- docker
|
|
12
|
+
- connection-refused
|
|
13
|
+
patterns:
|
|
14
|
+
- regex: "db service is unhealthy"
|
|
15
|
+
flags: "i"
|
|
16
|
+
- regex: "(?:postgres|mysql|redis|service).*(?:unhealthy|not ready|failed to start)"
|
|
17
|
+
flags: "i"
|
|
18
|
+
- regex: "One or more containers failed to start"
|
|
19
|
+
flags: "i"
|
|
20
|
+
- regex: "Connection refused.*(?:5432|3306|6379)"
|
|
21
|
+
flags: "i"
|
|
22
|
+
- regex: "could not connect to server.*Connection refused"
|
|
23
|
+
flags: "i"
|
|
24
|
+
- regex: "ECONNREFUSED.*(?:5432|3306|6379)"
|
|
25
|
+
flags: "i"
|
|
26
|
+
error_messages:
|
|
27
|
+
- "Failed to initialize, db service is unhealthy."
|
|
28
|
+
- "One or more containers failed to start."
|
|
29
|
+
- "Error: connect ECONNREFUSED 127.0.0.1:5432"
|
|
30
|
+
- "could not connect to server: Connection refused"
|
|
31
|
+
- "Is the server running on that host and accepting TCP/IP connections on port 5432?"
|
|
32
|
+
- "ERROR 2002 (HY000): Can't connect to MySQL server on '127.0.0.1' (111)"
|
|
33
|
+
root_cause: |
|
|
34
|
+
GitHub Actions starts service containers (defined under `services:`) before
|
|
35
|
+
job steps begin, but it does NOT wait for the container's internal process to
|
|
36
|
+
be fully ready unless a healthcheck is configured. The runner only waits for
|
|
37
|
+
the container to be in a running state — not for the database or service
|
|
38
|
+
inside to accept connections.
|
|
39
|
+
|
|
40
|
+
Databases like PostgreSQL, MySQL, and Redis typically take several seconds
|
|
41
|
+
after the container starts before they are ready to accept connections. Without
|
|
42
|
+
a healthcheck configured via the `options:` key, GitHub Actions proceeds to
|
|
43
|
+
run job steps immediately while the service is still initializing. The first
|
|
44
|
+
step that attempts a database connection will fail with "Connection refused"
|
|
45
|
+
or "service is unhealthy."
|
|
46
|
+
|
|
47
|
+
Common misconfiguration patterns:
|
|
48
|
+
1. No `options:` block at all — the service starts but the job doesn't wait
|
|
49
|
+
for readiness. The runner polls the healthcheck status if one is present.
|
|
50
|
+
2. Wrong healthcheck command — using `pg_isready` without the correct user/host
|
|
51
|
+
flags, or using `mysqladmin ping` without the correct credentials.
|
|
52
|
+
3. Insufficient retries/timeouts — using `--health-retries 1` means a single
|
|
53
|
+
failed attempt marks the container unhealthy immediately.
|
|
54
|
+
4. Port not mapped — the `ports:` key is optional when running steps directly
|
|
55
|
+
on the runner (accessing via 127.0.0.1), but is required when steps run
|
|
56
|
+
inside a container.
|
|
57
|
+
|
|
58
|
+
Note: Even with a healthcheck, the DB container can transiently fail the
|
|
59
|
+
healthcheck during slow GH-hosted runner provisioning. Default values of
|
|
60
|
+
`--health-interval 10s --health-timeout 5s --health-retries 5` work for
|
|
61
|
+
most cases, but MySQL/MariaDB may need longer retries during first initialization.
|
|
62
|
+
fix: |
|
|
63
|
+
Add a `options:` block to your service definition with a proper Docker
|
|
64
|
+
healthcheck command. GitHub Actions reads the container's healthcheck status
|
|
65
|
+
and waits until the container reports "healthy" before starting job steps.
|
|
66
|
+
|
|
67
|
+
PostgreSQL:
|
|
68
|
+
Use `pg_isready` with `-h localhost` and the correct username.
|
|
69
|
+
|
|
70
|
+
MySQL/MariaDB:
|
|
71
|
+
Use `mysqladmin ping` with credentials matching the MYSQL_ROOT_PASSWORD.
|
|
72
|
+
|
|
73
|
+
Redis:
|
|
74
|
+
Use `redis-cli ping` — returns PONG when Redis is ready.
|
|
75
|
+
|
|
76
|
+
If the container is still failing, increase `--health-retries` and
|
|
77
|
+
`--health-start-period` to give the container more initialization time.
|
|
78
|
+
MySQL in particular needs a longer start period on its first run because it
|
|
79
|
+
initializes the data directory.
|
|
80
|
+
fix_code:
|
|
81
|
+
- language: yaml
|
|
82
|
+
label: "PostgreSQL service with proper healthcheck"
|
|
83
|
+
code: |
|
|
84
|
+
jobs:
|
|
85
|
+
test:
|
|
86
|
+
runs-on: ubuntu-latest
|
|
87
|
+
services:
|
|
88
|
+
postgres:
|
|
89
|
+
image: postgres:16
|
|
90
|
+
env:
|
|
91
|
+
POSTGRES_USER: testuser
|
|
92
|
+
POSTGRES_PASSWORD: testpass
|
|
93
|
+
POSTGRES_DB: testdb
|
|
94
|
+
ports:
|
|
95
|
+
- 5432:5432
|
|
96
|
+
options: >-
|
|
97
|
+
--health-cmd pg_isready
|
|
98
|
+
--health-interval 10s
|
|
99
|
+
--health-timeout 5s
|
|
100
|
+
--health-retries 5
|
|
101
|
+
steps:
|
|
102
|
+
- uses: actions/checkout@v4
|
|
103
|
+
- run: npm test
|
|
104
|
+
env:
|
|
105
|
+
DATABASE_URL: postgresql://testuser:testpass@localhost:5432/testdb
|
|
106
|
+
- language: yaml
|
|
107
|
+
label: "MySQL service with proper healthcheck"
|
|
108
|
+
code: |
|
|
109
|
+
jobs:
|
|
110
|
+
test:
|
|
111
|
+
runs-on: ubuntu-latest
|
|
112
|
+
services:
|
|
113
|
+
mysql:
|
|
114
|
+
image: mysql:8.0
|
|
115
|
+
env:
|
|
116
|
+
MYSQL_ROOT_PASSWORD: rootpass
|
|
117
|
+
MYSQL_DATABASE: testdb
|
|
118
|
+
ports:
|
|
119
|
+
- 3306:3306
|
|
120
|
+
options: >-
|
|
121
|
+
--health-cmd "mysqladmin ping -h 127.0.0.1 -u root -prootpass"
|
|
122
|
+
--health-interval 10s
|
|
123
|
+
--health-timeout 5s
|
|
124
|
+
--health-retries 10
|
|
125
|
+
--health-start-period 30s
|
|
126
|
+
- language: yaml
|
|
127
|
+
label: "Redis service with proper healthcheck"
|
|
128
|
+
code: |
|
|
129
|
+
jobs:
|
|
130
|
+
test:
|
|
131
|
+
runs-on: ubuntu-latest
|
|
132
|
+
services:
|
|
133
|
+
redis:
|
|
134
|
+
image: redis:7
|
|
135
|
+
ports:
|
|
136
|
+
- 6379:6379
|
|
137
|
+
options: >-
|
|
138
|
+
--health-cmd "redis-cli ping"
|
|
139
|
+
--health-interval 10s
|
|
140
|
+
--health-timeout 5s
|
|
141
|
+
--health-retries 5
|
|
142
|
+
prevention:
|
|
143
|
+
- "Always add a `options: --health-cmd ...` block to every service container — the runner will wait for 'healthy' status before running steps."
|
|
144
|
+
- "Use `--health-start-period 30s` for MySQL/MariaDB which initializes its data directory on the first run and takes longer than PostgreSQL or Redis."
|
|
145
|
+
- "Test your healthcheck command locally with `docker run --health-cmd ...` to verify it exits 0 when the service is ready."
|
|
146
|
+
- "Use `ports: - 5432:5432` when steps run directly on the runner host (ubuntu-latest); ports are optional when steps run in a container job."
|
|
147
|
+
- "Avoid hardcoded `sleep 30` workarounds — these waste time on fast machines and still fail on slow ones. Use healthchecks instead."
|
|
148
|
+
docs:
|
|
149
|
+
- url: "https://docs.github.com/en/actions/use-cases-and-examples/creating-postgresql-service-containers"
|
|
150
|
+
label: "GitHub Docs: Creating PostgreSQL service containers"
|
|
151
|
+
- url: "https://docs.github.com/en/actions/use-cases-and-examples/creating-redis-service-containers"
|
|
152
|
+
label: "GitHub Docs: Creating Redis service containers"
|
|
153
|
+
- url: "https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/running-jobs-in-a-container"
|
|
154
|
+
label: "GitHub Docs: Running jobs in a container (services section)"
|
|
155
|
+
- url: "https://stackoverflow.com/questions/60618118/docker-postgres-image-failed-to-initialize-db-service-is-unhealthy"
|
|
156
|
+
label: "Stack Overflow #60618118: db service is unhealthy (25 votes, 8.8K views)"
|
|
157
|
+
- url: "https://github.com/orgs/community/discussions/27021"
|
|
158
|
+
label: "GitHub Community #27021: MySQL service never comes up healthy"
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
id: runner-environment-060
|
|
2
|
+
title: "setup-node@v5 Cannot Locate pnpm After Corepack Enable"
|
|
3
|
+
category: runner-environment
|
|
4
|
+
severity: error
|
|
5
|
+
tags:
|
|
6
|
+
- setup-node
|
|
7
|
+
- pnpm
|
|
8
|
+
- corepack
|
|
9
|
+
- v5
|
|
10
|
+
- package-manager
|
|
11
|
+
patterns:
|
|
12
|
+
- regex: "Unable to locate executable file: pnpm"
|
|
13
|
+
flags: "i"
|
|
14
|
+
- regex: "actions/setup-node@[a-z0-9]+ # v5"
|
|
15
|
+
flags: "i"
|
|
16
|
+
- regex: "package-manager-cache: true"
|
|
17
|
+
flags: "i"
|
|
18
|
+
error_messages:
|
|
19
|
+
- "Error: Unable to locate executable file: pnpm. Please verify either the file path exists or the file can be found within a directory specified by the PATH environment variable. Also check the file mode to verify the file is executable."
|
|
20
|
+
root_cause: |
|
|
21
|
+
`actions/setup-node@v5` changed how corepack and package manager shims are
|
|
22
|
+
initialized compared to v4. In v5, the action enables `package-manager-cache: true`
|
|
23
|
+
by default and reads the `packageManager` field from `package.json` to configure
|
|
24
|
+
corepack, but it no longer automatically activates corepack shims for the pnpm
|
|
25
|
+
binary in the runner's PATH.
|
|
26
|
+
|
|
27
|
+
In v4, setup-node would run `corepack enable` implicitly as part of its package
|
|
28
|
+
manager setup, making pnpm available immediately after the action. In v5 this
|
|
29
|
+
behavior changed: corepack is configured for caching purposes but pnpm shims are
|
|
30
|
+
not written into PATH, so any subsequent `corepack enable` or direct `pnpm`
|
|
31
|
+
invocation fails with "Unable to locate executable file: pnpm."
|
|
32
|
+
|
|
33
|
+
The issue is specific to v5 because the internal action scripts now use Node 24
|
|
34
|
+
and a refactored corepack integration path that treats corepack enablement as
|
|
35
|
+
separate from the shim installation step.
|
|
36
|
+
|
|
37
|
+
Downgrading to `actions/setup-node@v4` restores the previous behavior where pnpm
|
|
38
|
+
shims are automatically available after the action.
|
|
39
|
+
fix: |
|
|
40
|
+
Use `pnpm/action-setup` BEFORE `actions/setup-node` to install pnpm independently
|
|
41
|
+
of corepack shim management. This is the officially recommended pattern for pnpm
|
|
42
|
+
on GitHub-hosted runners and works correctly with both v4 and v5 of setup-node.
|
|
43
|
+
|
|
44
|
+
Alternatively, pin to `actions/setup-node@v4` until setup-node@v5 resolves the
|
|
45
|
+
corepack shim regression.
|
|
46
|
+
|
|
47
|
+
Do NOT rely on `corepack enable` run after setup-node@v5 to make pnpm available —
|
|
48
|
+
the shim is not written even after corepack is enabled in a subsequent step.
|
|
49
|
+
fix_code:
|
|
50
|
+
- language: yaml
|
|
51
|
+
label: "Wrong: setup-node@v5 + corepack enable (pnpm not found)"
|
|
52
|
+
code: |
|
|
53
|
+
steps:
|
|
54
|
+
- uses: actions/checkout@v4
|
|
55
|
+
- uses: actions/setup-node@v5 # v5 does not write pnpm shim
|
|
56
|
+
with:
|
|
57
|
+
node-version-file: package.json
|
|
58
|
+
- run: |
|
|
59
|
+
corepack enable # pnpm still not in PATH after this
|
|
60
|
+
corepack prepare --activate
|
|
61
|
+
- run: pnpm install # Error: Unable to locate executable file: pnpm
|
|
62
|
+
- language: yaml
|
|
63
|
+
label: "Correct: pnpm/action-setup before setup-node (works with v4 and v5)"
|
|
64
|
+
code: |
|
|
65
|
+
steps:
|
|
66
|
+
- uses: actions/checkout@v4
|
|
67
|
+
- uses: pnpm/action-setup@v4 # install pnpm FIRST, independent of corepack
|
|
68
|
+
with:
|
|
69
|
+
version: 10
|
|
70
|
+
- uses: actions/setup-node@v5
|
|
71
|
+
with:
|
|
72
|
+
node-version-file: package.json
|
|
73
|
+
cache: pnpm
|
|
74
|
+
- run: pnpm install --frozen-lockfile
|
|
75
|
+
- language: yaml
|
|
76
|
+
label: "Alternative: pin to setup-node@v4 (restores previous corepack behavior)"
|
|
77
|
+
code: |
|
|
78
|
+
steps:
|
|
79
|
+
- uses: actions/checkout@v4
|
|
80
|
+
- uses: actions/setup-node@v4 # v4 writes corepack shims automatically
|
|
81
|
+
with:
|
|
82
|
+
node-version-file: package.json
|
|
83
|
+
- run: |
|
|
84
|
+
corepack enable
|
|
85
|
+
corepack prepare --activate
|
|
86
|
+
- run: pnpm install --frozen-lockfile
|
|
87
|
+
prevention:
|
|
88
|
+
- "Use pnpm/action-setup before setup-node for reliable pnpm availability regardless of setup-node version."
|
|
89
|
+
- "Do not assume corepack shim behavior is identical between setup-node major versions."
|
|
90
|
+
- "Pin action versions with SHAs (e.g. @a0853c24...) to avoid unexpected behavior changes on major bumps."
|
|
91
|
+
- "Read setup-node release notes and CHANGELOG when upgrading from v4 to v5 — corepack integration changed."
|
|
92
|
+
- "Test pnpm availability explicitly in CI by adding a debug step: run: which pnpm && pnpm --version"
|
|
93
|
+
docs:
|
|
94
|
+
- url: "https://github.com/actions/setup-node/issues/1357"
|
|
95
|
+
label: "actions/setup-node#1357: v5 fails immediately when using pnpm (31 reactions)"
|
|
96
|
+
- url: "https://github.com/pnpm/action-setup"
|
|
97
|
+
label: "pnpm/action-setup: Official pnpm GitHub Action"
|
|
98
|
+
- url: "https://nodejs.org/api/corepack.html"
|
|
99
|
+
label: "Node.js Corepack documentation"
|
|
100
|
+
- url: "https://github.com/actions/setup-node/releases"
|
|
101
|
+
label: "actions/setup-node releases and CHANGELOG"
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
id: runner-environment-074
|
|
2
|
+
title: "setup-node Does Not Install Yarn on Self-Hosted Runners"
|
|
3
|
+
category: runner-environment
|
|
4
|
+
severity: error
|
|
5
|
+
tags:
|
|
6
|
+
- setup-node
|
|
7
|
+
- yarn
|
|
8
|
+
- self-hosted-runner
|
|
9
|
+
- package-manager
|
|
10
|
+
- corepack
|
|
11
|
+
patterns:
|
|
12
|
+
- regex: "yarn.*command not found|command not found.*yarn"
|
|
13
|
+
flags: "i"
|
|
14
|
+
- regex: "yarn: not found|sh.*yarn.*127"
|
|
15
|
+
flags: "i"
|
|
16
|
+
error_messages:
|
|
17
|
+
- "yarn: command not found"
|
|
18
|
+
- "/bin/sh: 1: yarn: not found"
|
|
19
|
+
- "Process completed with exit code 127"
|
|
20
|
+
root_cause: |
|
|
21
|
+
`actions/setup-node` does NOT install Yarn on self-hosted runners. On GitHub-hosted runners,
|
|
22
|
+
Yarn is pre-installed as part of the runner image (included in ubuntu-22.04, ubuntu-24.04,
|
|
23
|
+
macOS, and Windows hosted images). When migrating to self-hosted runners, workflows that call
|
|
24
|
+
`yarn install` fail with `yarn: command not found` (exit code 127) because the binary is absent.
|
|
25
|
+
|
|
26
|
+
The action provides `cache: 'yarn'` to restore cached modules and registry URL configuration,
|
|
27
|
+
but does NOT bootstrap the Yarn binary itself. As of Node.js 16+, Yarn v2+ (Berry) is distributed
|
|
28
|
+
via Corepack, but Corepack shims are disabled by default in Node.js — setup-node@v4 requires
|
|
29
|
+
explicit `enable-corepack: true` to activate them.
|
|
30
|
+
|
|
31
|
+
159 reactions on actions/setup-node#182 (open since Dec 2021).
|
|
32
|
+
fix: |
|
|
33
|
+
Option A (Yarn v1): Install Yarn explicitly via npm in a dedicated step before using it.
|
|
34
|
+
Option B (Yarn v2/v3/v4 Berry): Enable Corepack via setup-node's `enable-corepack: true`
|
|
35
|
+
input together with a `packageManager` field in package.json specifying the exact Yarn version.
|
|
36
|
+
Option C: Use `volta-cli/action` or a custom self-hosted runner image with Yarn pre-installed.
|
|
37
|
+
fix_code:
|
|
38
|
+
- language: yaml
|
|
39
|
+
label: "Option A: install Yarn v1 explicitly (compatible with all self-hosted runners)"
|
|
40
|
+
code: |
|
|
41
|
+
steps:
|
|
42
|
+
- uses: actions/checkout@v4
|
|
43
|
+
- uses: actions/setup-node@v4
|
|
44
|
+
with:
|
|
45
|
+
node-version: '20'
|
|
46
|
+
cache: 'yarn'
|
|
47
|
+
- name: Install Yarn
|
|
48
|
+
run: npm install -g yarn@1
|
|
49
|
+
- name: Install dependencies
|
|
50
|
+
run: yarn install --frozen-lockfile
|
|
51
|
+
|
|
52
|
+
- language: yaml
|
|
53
|
+
label: "Option B: enable Corepack for Yarn v2+ (requires packageManager in package.json)"
|
|
54
|
+
code: |
|
|
55
|
+
# Requires package.json to include: "packageManager": "yarn@4.x.x"
|
|
56
|
+
steps:
|
|
57
|
+
- uses: actions/checkout@v4
|
|
58
|
+
- uses: actions/setup-node@v4
|
|
59
|
+
with:
|
|
60
|
+
node-version: '20'
|
|
61
|
+
enable-corepack: true # activates Corepack shims including the yarn binary
|
|
62
|
+
cache: 'yarn'
|
|
63
|
+
- name: Install dependencies
|
|
64
|
+
run: yarn install --immutable
|
|
65
|
+
prevention:
|
|
66
|
+
- "On self-hosted runners, never assume GitHub-hosted image tools are pre-installed — audit all tool dependencies."
|
|
67
|
+
- "Explicitly install or activate package managers (yarn, pnpm, bun) in workflow setup steps."
|
|
68
|
+
- "Use enable-corepack: true in setup-node@v4 for Yarn v2+ projects with packageManager in package.json."
|
|
69
|
+
- "Consider maintaining a custom self-hosted runner image with required package managers pre-installed."
|
|
70
|
+
docs:
|
|
71
|
+
- url: "https://github.com/actions/setup-node/issues/182"
|
|
72
|
+
label: "actions/setup-node #182 — Yarn not installed on self-hosted runners (159 reactions)"
|
|
73
|
+
- url: "https://github.com/actions/setup-node#corepack"
|
|
74
|
+
label: "setup-node — Corepack support documentation"
|
|
75
|
+
- url: "https://yarnpkg.com/corepack"
|
|
76
|
+
label: "Yarn — Corepack installation guide"
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
id: "runner-environment-073"
|
|
2
|
+
title: "pip install fails with externally-managed-environment on Ubuntu 22.04/24.04"
|
|
3
|
+
category: "runner-environment"
|
|
4
|
+
severity: "error"
|
|
5
|
+
tags:
|
|
6
|
+
- "python"
|
|
7
|
+
- "pip"
|
|
8
|
+
- "ubuntu-2204"
|
|
9
|
+
- "ubuntu-2404"
|
|
10
|
+
- "pep668"
|
|
11
|
+
- "virtualenv"
|
|
12
|
+
patterns:
|
|
13
|
+
- regex: "error: externally-managed-environment"
|
|
14
|
+
flags: "i"
|
|
15
|
+
- regex: "This environment is externally managed"
|
|
16
|
+
flags: "i"
|
|
17
|
+
- regex: "To install Python packages system-wide, try apt-get install"
|
|
18
|
+
flags: "i"
|
|
19
|
+
error_messages:
|
|
20
|
+
- "error: externally-managed-environment"
|
|
21
|
+
- "× This environment is externally managed"
|
|
22
|
+
- "╰─> To install Python packages system-wide, try apt-get install python3-xyz"
|
|
23
|
+
- "hint: See PEP 668 for the detailed specification of this behavior."
|
|
24
|
+
root_cause: |
|
|
25
|
+
PEP 668 (adopted in Python 3.11) marks system-managed Python installations as
|
|
26
|
+
"externally managed" to prevent pip from overwriting OS package manager state.
|
|
27
|
+
Ubuntu 22.04 and 24.04 runner images ship with a system Python 3.10/3.12 that
|
|
28
|
+
carries this marker, and newer versions of pip (>=22.3) enforce it.
|
|
29
|
+
|
|
30
|
+
Workflows that run bare `pip install` or `pip install -r requirements.txt` against
|
|
31
|
+
the system interpreter fail with this error. The issue did not exist on ubuntu-20.04
|
|
32
|
+
(Python 3.8) and began appearing when teams migrated to ubuntu-22.04 or ubuntu-latest
|
|
33
|
+
(which moved to ubuntu-24.04 in May 2025).
|
|
34
|
+
|
|
35
|
+
Even when setup-python is used, if the step that runs pip install activates the wrong
|
|
36
|
+
interpreter (e.g., the system Python instead of the toolcache one), the same error
|
|
37
|
+
occurs. This often happens when shell scripts or Makefiles call `python3` directly.
|
|
38
|
+
fix: |
|
|
39
|
+
Option 1 (preferred): Use a virtual environment so pip installs into an isolated,
|
|
40
|
+
non-system directory that is not subject to the externally-managed restriction.
|
|
41
|
+
|
|
42
|
+
Option 2: Pin setup-python@v5 to your required version; its toolcache interpreter
|
|
43
|
+
is not marked as externally managed and accepts pip installs freely.
|
|
44
|
+
|
|
45
|
+
Option 3 (quick fix, not recommended for production): Pass --break-system-packages.
|
|
46
|
+
fix_code:
|
|
47
|
+
- language: yaml
|
|
48
|
+
label: "Use a virtual environment (recommended)"
|
|
49
|
+
code: |
|
|
50
|
+
- uses: actions/setup-python@v5
|
|
51
|
+
with:
|
|
52
|
+
python-version: '3.12'
|
|
53
|
+
|
|
54
|
+
- name: Create virtualenv and install
|
|
55
|
+
run: |
|
|
56
|
+
python -m venv .venv
|
|
57
|
+
source .venv/bin/activate # Linux/macOS
|
|
58
|
+
# .venv\Scripts\activate # Windows
|
|
59
|
+
pip install -r requirements.txt
|
|
60
|
+
|
|
61
|
+
- name: Run with virtualenv active
|
|
62
|
+
run: |
|
|
63
|
+
source .venv/bin/activate
|
|
64
|
+
pytest
|
|
65
|
+
|
|
66
|
+
- language: yaml
|
|
67
|
+
label: "Use setup-python toolcache interpreter (pip installs without restriction)"
|
|
68
|
+
code: |
|
|
69
|
+
- uses: actions/setup-python@v5
|
|
70
|
+
with:
|
|
71
|
+
python-version: '3.12'
|
|
72
|
+
cache: 'pip'
|
|
73
|
+
|
|
74
|
+
- name: Install dependencies
|
|
75
|
+
run: pip install -r requirements.txt # uses toolcache Python, not system Python
|
|
76
|
+
|
|
77
|
+
- language: yaml
|
|
78
|
+
label: "Quick fix: --break-system-packages (not recommended)"
|
|
79
|
+
code: |
|
|
80
|
+
- name: Install dependencies
|
|
81
|
+
run: pip install --break-system-packages -r requirements.txt
|
|
82
|
+
prevention:
|
|
83
|
+
- "Always activate setup-python before any pip install call to use the toolcache interpreter instead of system Python."
|
|
84
|
+
- "Use virtual environments in CI workflows, especially when migrating from ubuntu-20.04 to 22.04/24.04."
|
|
85
|
+
- "Audit Makefiles and shell scripts that call 'python3' directly — they may bypass setup-python's PATH manipulation."
|
|
86
|
+
- "Run your workflow on ubuntu-22.04 or ubuntu-24.04 in a test branch before migrating from ubuntu-20.04."
|
|
87
|
+
docs:
|
|
88
|
+
- url: "https://peps.python.org/pep-0668/"
|
|
89
|
+
label: "PEP 668 — Marking Python base environments as externally managed"
|
|
90
|
+
- url: "https://github.com/actions/setup-python/issues/1280"
|
|
91
|
+
label: "actions/setup-python#1280 — externally-managed-environment discussion"
|
|
92
|
+
- url: "https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners#supported-software"
|
|
93
|
+
label: "GitHub Docs — Supported software on GitHub-hosted runners"
|
|
94
|
+
- url: "https://github.com/actions/runner-images/issues/11101"
|
|
95
|
+
label: "runner-images#11101 — Ubuntu 20.04 retirement tracking issue"
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
id: runner-environment-065
|
|
2
|
+
title: "Windows 2019 Runner Retired — Jobs Fail After June 30, 2025"
|
|
3
|
+
category: runner-environment
|
|
4
|
+
severity: error
|
|
5
|
+
tags:
|
|
6
|
+
- windows-2019
|
|
7
|
+
- runner-retirement
|
|
8
|
+
- deprecated
|
|
9
|
+
- windows
|
|
10
|
+
- runner-label
|
|
11
|
+
- brownout
|
|
12
|
+
patterns:
|
|
13
|
+
- regex: "windows-2019.*no longer supported"
|
|
14
|
+
flags: "i"
|
|
15
|
+
- regex: "runs-on.*windows-2019.*deprecated"
|
|
16
|
+
flags: "i"
|
|
17
|
+
- regex: "The windows-2019 runner image is no longer supported"
|
|
18
|
+
flags: "i"
|
|
19
|
+
- regex: "Error.*windows-2019.*not available"
|
|
20
|
+
flags: "i"
|
|
21
|
+
error_messages:
|
|
22
|
+
- "Error: The windows-2019 runner image is no longer supported. Migrate to windows-2022 or windows-2025."
|
|
23
|
+
- "##[error]Job failed: The runner image 'windows-2019' is deprecated and no longer supported."
|
|
24
|
+
- "Windows Server 2019 is no longer supported as a GitHub Actions runner image."
|
|
25
|
+
root_cause: |
|
|
26
|
+
The `windows-2019` runner image was retired by GitHub Actions on June 30, 2025
|
|
27
|
+
(runner-images#12045). Deprecation brownouts began June 1, 2025, during which
|
|
28
|
+
jobs using `windows-2019` would temporarily fail during scheduled brownout
|
|
29
|
+
windows (June 3, 10, 17, 24 — 13:00–21:00 UTC). After June 30, 2025, the
|
|
30
|
+
image was fully unsupported and jobs using `runs-on: windows-2019` fail
|
|
31
|
+
immediately with no runner available.
|
|
32
|
+
|
|
33
|
+
Windows Server 2019 reached End of Mainstream Support from Microsoft on
|
|
34
|
+
January 9, 2024, making it untenable as a CI runner image for security
|
|
35
|
+
and support reasons.
|
|
36
|
+
|
|
37
|
+
Key differences that may require migration work:
|
|
38
|
+
- Windows 2022 and 2025 use Visual Studio 2022 and VS 2026 respectively
|
|
39
|
+
(windows-2019 had Visual Studio 2019). MSBuild project compatibility,
|
|
40
|
+
compiler toolset versions, and SDK paths differ.
|
|
41
|
+
- Some pre-installed tools (e.g., specific .NET Framework versions, MSVC
|
|
42
|
+
compiler toolsets, legacy SDK components) were present on windows-2019
|
|
43
|
+
but not on windows-2022 or windows-2025.
|
|
44
|
+
- Windows Server 2025 images include Windows PowerShell 5.1 and
|
|
45
|
+
PowerShell 7.x; path behaviors for Windows-specific paths may differ.
|
|
46
|
+
fix: |
|
|
47
|
+
Migrate runs-on: windows-2019 to runs-on: windows-2022 or windows-2025:
|
|
48
|
+
|
|
49
|
+
1. **windows-2022** (recommended for most teams): Includes VS 2022,
|
|
50
|
+
.NET 6/7/8 LTS, and the same tool catalog as windows-2019 minus
|
|
51
|
+
legacy VS 2019 components. Most projects migrate with no changes.
|
|
52
|
+
|
|
53
|
+
2. **windows-2025** (latest, includes VS 2026): Best for projects
|
|
54
|
+
requiring the latest MSVC toolchain, Windows 11 APIs, or ARM64
|
|
55
|
+
development. Note that windows-latest now points to this image.
|
|
56
|
+
|
|
57
|
+
3. **Check MSBuild ToolsVersion**: If your project uses MSBuild with
|
|
58
|
+
explicit ToolsVersion="15.0" or "16.0" references, update to
|
|
59
|
+
ToolsVersion="Current" or leave it unspecified to use the
|
|
60
|
+
installed version.
|
|
61
|
+
|
|
62
|
+
4. **Verify .NET SDK availability**: Confirm the .NET SDK version your
|
|
63
|
+
project needs is available on the target image by checking the
|
|
64
|
+
published software inventory for windows-2022 or windows-2025.
|
|
65
|
+
fix_code:
|
|
66
|
+
- language: yaml
|
|
67
|
+
label: "Migrate from windows-2019 to windows-2022"
|
|
68
|
+
code: |
|
|
69
|
+
jobs:
|
|
70
|
+
build:
|
|
71
|
+
# windows-2019 is RETIRED as of June 30, 2025
|
|
72
|
+
# runs-on: windows-2019 ← no longer supported
|
|
73
|
+
runs-on: windows-2022 # VS 2022, .NET 8 LTS pre-installed
|
|
74
|
+
steps:
|
|
75
|
+
- uses: actions/checkout@v4
|
|
76
|
+
- name: Build
|
|
77
|
+
run: msbuild MyProject.sln /p:Configuration=Release
|
|
78
|
+
- language: yaml
|
|
79
|
+
label: "Migrate to windows-2025 with VS 2026 (latest)"
|
|
80
|
+
code: |
|
|
81
|
+
jobs:
|
|
82
|
+
build:
|
|
83
|
+
runs-on: windows-2025 # Windows Server 2025, VS 2026
|
|
84
|
+
steps:
|
|
85
|
+
- uses: actions/checkout@v4
|
|
86
|
+
- name: Setup .NET
|
|
87
|
+
uses: actions/setup-dotnet@v4
|
|
88
|
+
with:
|
|
89
|
+
dotnet-version: '8.x'
|
|
90
|
+
- name: Build
|
|
91
|
+
run: dotnet build --configuration Release
|
|
92
|
+
- language: yaml
|
|
93
|
+
label: "Matrix to test windows-2022 and windows-2025 before committing"
|
|
94
|
+
code: |
|
|
95
|
+
jobs:
|
|
96
|
+
build:
|
|
97
|
+
strategy:
|
|
98
|
+
matrix:
|
|
99
|
+
os: [windows-2022, windows-2025]
|
|
100
|
+
fail-fast: false
|
|
101
|
+
runs-on: ${{ matrix.os }}
|
|
102
|
+
steps:
|
|
103
|
+
- uses: actions/checkout@v4
|
|
104
|
+
- run: msbuild MyProject.sln
|
|
105
|
+
prevention:
|
|
106
|
+
- "Avoid pinning to specific OS-versioned runner labels (windows-2019, ubuntu-20.04) in long-lived workflows — add a review calendar reminder every 12 months to check for upcoming deprecations."
|
|
107
|
+
- "Subscribe to GitHub notifications for the actions/runner-images repository to receive deprecation announcements months before retirement."
|
|
108
|
+
- "Use `windows-latest` for flexibility where VS version compatibility isn't critical — it automatically tracks the current supported image."
|
|
109
|
+
- "After migrating, run the full test suite and check compiler/toolchain version outputs in CI to catch any implicit behavior differences."
|
|
110
|
+
docs:
|
|
111
|
+
- url: "https://github.com/actions/runner-images/issues/12045"
|
|
112
|
+
label: "runner-images #12045: Windows 2019 deprecation announcement (June 2025)"
|
|
113
|
+
- url: "https://github.com/actions/runner-images/blob/main/images/windows/Windows2022-Readme.md"
|
|
114
|
+
label: "Windows Server 2022 runner software inventory"
|
|
115
|
+
- url: "https://github.com/actions/runner-images/blob/main/images/windows/Windows2025-Readme.md"
|
|
116
|
+
label: "Windows Server 2025 runner software inventory"
|
|
117
|
+
- url: "https://docs.github.com/en/actions/using-github-hosted-runners/using-github-hosted-runners/about-github-hosted-runners"
|
|
118
|
+
label: "GitHub Docs: About GitHub-hosted runners — available images"
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
id: runner-environment-069
|
|
2
|
+
title: "Windows 2022 Runner Docker Engine Named Pipe Not Found on Start"
|
|
3
|
+
category: runner-environment
|
|
4
|
+
severity: error
|
|
5
|
+
tags:
|
|
6
|
+
- windows
|
|
7
|
+
- docker
|
|
8
|
+
- runner-image
|
|
9
|
+
- intermittent
|
|
10
|
+
- named-pipe
|
|
11
|
+
patterns:
|
|
12
|
+
- regex: "failed to connect to the docker API at npipe:////\\.?/pipe/docker_engine"
|
|
13
|
+
flags: "i"
|
|
14
|
+
- regex: "open //\\.?/pipe/docker_engine.*The system cannot find the file specified"
|
|
15
|
+
flags: "i"
|
|
16
|
+
- regex: "error during connect.*pipe/docker_engine.*daemon running"
|
|
17
|
+
flags: "i"
|
|
18
|
+
- regex: "Docker Engine.*Stopped|docker.*service.*not running"
|
|
19
|
+
flags: "i"
|
|
20
|
+
error_messages:
|
|
21
|
+
- "failed to connect to the docker API at npipe:////./pipe/docker_engine; check if the path is correct and if the daemon is running: open //./pipe/docker_engine: The system cannot find the file specified."
|
|
22
|
+
- "error during connect: Get \"http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.45/info\": open //./pipe/docker_engine: The system cannot find the file specified."
|
|
23
|
+
root_cause: |
|
|
24
|
+
On GitHub-hosted `windows-2022` runners, the Docker Engine service occasionally
|
|
25
|
+
fails to start before the workflow job begins. The Docker Engine runs as a Windows
|
|
26
|
+
service (`docker`) and the runner sometimes starts executing job steps before the
|
|
27
|
+
service has fully initialized and opened its named pipe at `//./pipe/docker_engine`.
|
|
28
|
+
|
|
29
|
+
This is an intermittent race condition between the runner agent startup and the
|
|
30
|
+
Docker Engine service startup sequence. The issue was reported in February 2026
|
|
31
|
+
(runner-images#13729) and confirmed to affect `windows-2022` at ~50% frequency
|
|
32
|
+
for some users. The `windows-2025` image is less affected.
|
|
33
|
+
|
|
34
|
+
The Docker Engine service shows `Status: Stopped` when queried immediately after
|
|
35
|
+
the runner starts. Manually starting the service (via `Start-Service docker`)
|
|
36
|
+
resolves the issue for that run. Job reruns also frequently succeed because they
|
|
37
|
+
land on a fresh host with Docker already running.
|
|
38
|
+
fix: |
|
|
39
|
+
Add a step early in your job to verify Docker is running and start it if not:
|
|
40
|
+
|
|
41
|
+
```yaml
|
|
42
|
+
- name: Ensure Docker Engine is running
|
|
43
|
+
shell: pwsh
|
|
44
|
+
run: |
|
|
45
|
+
$service = Get-Service -Name docker -ErrorAction SilentlyContinue
|
|
46
|
+
if ($service.Status -ne 'Running') {
|
|
47
|
+
Start-Service docker
|
|
48
|
+
$timeout = 60
|
|
49
|
+
$elapsed = 0
|
|
50
|
+
while ((Get-Service docker).Status -ne 'Running' -and $elapsed -lt $timeout) {
|
|
51
|
+
Start-Sleep -Seconds 2
|
|
52
|
+
$elapsed += 2
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
docker info
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
If the issue is sporadic, a simpler retry on job failure may suffice. You can
|
|
59
|
+
also switch to `windows-2025` which has a lower incidence of this race condition.
|
|
60
|
+
fix_code:
|
|
61
|
+
- language: yaml
|
|
62
|
+
label: "Guard step — ensure Docker service is running before use"
|
|
63
|
+
code: |
|
|
64
|
+
jobs:
|
|
65
|
+
build:
|
|
66
|
+
runs-on: windows-2022
|
|
67
|
+
steps:
|
|
68
|
+
- uses: actions/checkout@v4
|
|
69
|
+
|
|
70
|
+
- name: Ensure Docker Engine is running
|
|
71
|
+
shell: pwsh
|
|
72
|
+
run: |
|
|
73
|
+
$svc = Get-Service docker -ErrorAction SilentlyContinue
|
|
74
|
+
if ($null -eq $svc -or $svc.Status -ne 'Running') {
|
|
75
|
+
Write-Host "Docker service not running — starting..."
|
|
76
|
+
Start-Service docker
|
|
77
|
+
$deadline = (Get-Date).AddSeconds(60)
|
|
78
|
+
while ((Get-Service docker).Status -ne 'Running') {
|
|
79
|
+
if ((Get-Date) -gt $deadline) { throw "Docker failed to start in 60s" }
|
|
80
|
+
Start-Sleep -Seconds 2
|
|
81
|
+
}
|
|
82
|
+
Write-Host "Docker service started."
|
|
83
|
+
}
|
|
84
|
+
docker info
|
|
85
|
+
|
|
86
|
+
- name: Build Docker image
|
|
87
|
+
run: docker build -t myimage .
|
|
88
|
+
- language: yaml
|
|
89
|
+
label: "Alternative — switch to windows-2025 (less affected)"
|
|
90
|
+
code: |
|
|
91
|
+
jobs:
|
|
92
|
+
build:
|
|
93
|
+
# windows-2025 has a lower frequency of this race condition
|
|
94
|
+
runs-on: windows-2025
|
|
95
|
+
steps:
|
|
96
|
+
- uses: actions/checkout@v4
|
|
97
|
+
- name: Build Docker image
|
|
98
|
+
run: docker build -t myimage .
|
|
99
|
+
prevention:
|
|
100
|
+
- "Add a Docker health-check step before any `docker` commands on Windows runners."
|
|
101
|
+
- "Consider using `windows-2025` which has fewer reports of this race condition."
|
|
102
|
+
- "Enable job reruns — this race condition is intermittent and reruns usually succeed."
|
|
103
|
+
- "Subscribe to runner-images announcements; GitHub is tracking this as a runner startup issue."
|
|
104
|
+
docs:
|
|
105
|
+
- url: "https://github.com/actions/runner-images/issues/13729"
|
|
106
|
+
label: "GitHub Issue: windows-2022 docker not available when runner starts"
|
|
107
|
+
- url: "https://docs.github.com/en/actions/using-github-hosted-runners/using-github-hosted-runners/about-github-hosted-runners#supported-runners-and-hardware-resources"
|
|
108
|
+
label: "About GitHub-hosted runners"
|