@htekdev/actions-debugger 1.0.23 → 1.0.25

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/errors/caching-artifacts/artifact-minimum-retention-one-day.yml +153 -0
  2. package/errors/caching-artifacts/cache-api-propagation-delay-post-save.yml +128 -0
  3. package/errors/caching-artifacts/cache-backend-internal-error-skipped.yml +75 -0
  4. package/errors/caching-artifacts/cache-hit-step-id-case-sensitive-mismatch.yml +95 -0
  5. package/errors/caching-artifacts/cache-save-post-step-skipped-on-failure.yml +114 -0
  6. package/errors/concurrency-timing/deploy-pages-in-progress-deployment-wedged.yml +70 -0
  7. package/errors/concurrency-timing/deployment-review-timeout-expired.yml +88 -0
  8. package/errors/concurrency-timing/job-concurrency-scope-per-run-not-global.yml +81 -0
  9. package/errors/concurrency-timing/merge-queue-concurrency-cancel-blocks-all.yml +86 -0
  10. package/errors/concurrency-timing/reusable-workflow-github-workflow-context-cancel.yml +124 -0
  11. package/errors/concurrency-timing/runner-scale-set-jobs-never-start.yml +123 -0
  12. package/errors/concurrency-timing/runner-temp-dir-race-concurrent-workers.yml +90 -0
  13. package/errors/known-unsolved/artifact-download-url-unauthenticated-404.yml +98 -0
  14. package/errors/known-unsolved/checkout-v6-credentials-docker-run-manual.yml +105 -0
  15. package/errors/known-unsolved/concurrency-groups-repo-scoped-only.yml +138 -0
  16. package/errors/known-unsolved/environment-deployment-false-custom-protection.yml +93 -0
  17. package/errors/known-unsolved/matrix-256-job-limit.yml +142 -0
  18. package/errors/known-unsolved/merge-group-paths-filter-not-supported.yml +137 -0
  19. package/errors/known-unsolved/no-job-allow-failure.yml +73 -0
  20. package/errors/known-unsolved/schedule-cron-hours-long-queue-drift.yml +101 -0
  21. package/errors/permissions-auth/checkout-persist-credentials-token-write.yml +90 -0
  22. package/errors/permissions-auth/checkout-v6-cross-repo-token-override.yml +103 -0
  23. package/errors/permissions-auth/create-github-app-token-cross-job-token-revoked.yml +95 -0
  24. package/errors/permissions-auth/github-token-contents-write-missing-git-push.yml +117 -0
  25. package/errors/permissions-auth/org-actions-policy-blocks-unapproved-action.yml +106 -0
  26. package/errors/runner-environment/codeql-action-v2-deprecated.yml +110 -0
  27. package/errors/runner-environment/macos-26-openssl-3-system-library-breaking.yml +114 -0
  28. package/errors/runner-environment/macos-26-ruby-34-default-upgrade.yml +114 -0
  29. package/errors/runner-environment/macos-26-xcode-default-265-pin-required.yml +99 -0
  30. package/errors/runner-environment/macos-latest-label-switches-to-macos26.yml +127 -0
  31. package/errors/runner-environment/maven-gradle-403-cache-backend-outage.yml +116 -0
  32. package/errors/runner-environment/node20-removed-toolcache-default-node22.yml +104 -0
  33. package/errors/runner-environment/powershell-74-76-threadjob-module-rename.yml +124 -0
  34. package/errors/runner-environment/self-hosted-runner-not-found.yml +134 -0
  35. package/errors/runner-environment/self-hosted-runner-selinux-service-exec-failure.yml +116 -0
  36. package/errors/runner-environment/service-container-no-healthcheck.yml +158 -0
  37. package/errors/runner-environment/setup-node-v5-corepack-pnpm-not-found.yml +101 -0
  38. package/errors/runner-environment/setup-node-yarn-not-installed-self-hosted.yml +76 -0
  39. package/errors/runner-environment/setup-python-externally-managed-env-error.yml +95 -0
  40. package/errors/runner-environment/windows-2019-runner-retired-june2025.yml +118 -0
  41. package/errors/runner-environment/windows-2022-docker-daemon-not-started.yml +108 -0
  42. package/errors/silent-failures/cache-hit-output-string-not-boolean.yml +96 -0
  43. package/errors/silent-failures/checkout-lfs-pointer-not-content.yml +105 -0
  44. package/errors/silent-failures/reusable-workflow-output-skipped-contains-secret.yml +115 -0
  45. package/errors/silent-failures/setup-node-silent-download-exit-zero.yml +105 -0
  46. package/errors/silent-failures/setup-python-truncated-manifest-silent-exit.yml +111 -0
  47. package/errors/silent-failures/undefined-env-expression-empty-string-silent.yml +115 -0
  48. package/errors/silent-failures/windows-powershell-github-output-bash-syntax.yml +118 -0
  49. package/errors/triggers/fork-pr-first-time-contributor-approval-required.yml +142 -0
  50. package/errors/triggers/on-push-branches-glob-star-no-slash-match.yml +78 -0
  51. package/errors/triggers/pull-request-target-env-protection-default-branch-eval.yml +117 -0
  52. package/errors/triggers/required-status-check-renamed-never-passes.yml +87 -0
  53. package/errors/triggers/schedule-cron-self-hosted-runner-not-triggered.yml +107 -0
  54. package/errors/yaml-syntax/case-function-runner-version-too-old.yml +100 -0
  55. package/errors/yaml-syntax/composite-action-run-shell-missing.yml +90 -0
  56. package/errors/yaml-syntax/composite-action-secrets-context-unavailable.yml +99 -0
  57. package/errors/yaml-syntax/github-script-octokit-renamed-to-github.yml +130 -0
  58. package/errors/yaml-syntax/labeler-v5-config-format-breaking.yml +67 -0
  59. package/errors/yaml-syntax/runs-on-expression-array-syntax-error.yml +121 -0
  60. package/errors/yaml-syntax/setup-go-matrix-version-float-coercion.yml +69 -0
  61. package/package.json +1 -1
@@ -0,0 +1,116 @@
1
+ id: runner-environment-068
2
+ title: "Self-Hosted Runner Service Fails on RHEL/CentOS — SELinux Blocks runsvc.sh with status=203/EXEC"
3
+ category: runner-environment
4
+ severity: error
5
+ tags:
6
+ - self-hosted
7
+ - selinux
8
+ - rhel
9
+ - centos
10
+ - oracle-linux
11
+ - service
12
+ - systemd
13
+ patterns:
14
+ - regex: "status=203/EXEC|code=exited.*status=203"
15
+ flags: "i"
16
+ - regex: "runsvc\\.sh.*failed|svc\\.sh.*start.*fail|runner.*service.*203"
17
+ flags: "i"
18
+ - regex: "avc.*denied.*runner|selinux.*denied.*exec.*runsvc"
19
+ flags: "i"
20
+ error_messages:
21
+ - "Active: failed (Result: exit-code)"
22
+ - "Main PID: XXXX (code=exited, status=203/EXEC)"
23
+ - "Failed to execute: Permission denied"
24
+ - "svc install succeeded but svc start exits immediately with status=203/EXEC"
25
+ root_cause: |
26
+ On SELinux-enforcing Linux distributions (RHEL, CentOS, Oracle Linux, AlmaLinux,
27
+ Rocky Linux), the GitHub Actions self-hosted runner service fails to start with
28
+ systemd exit code 203/EXEC when run via sudo ./svc.sh start.
29
+
30
+ The root cause is a SELinux security context mismatch:
31
+ 1. GitHub's ./config.sh creates runsvc.sh and run.sh with the security context
32
+ of the installing user's SSH/interactive session (e.g., unconfined_u:object_r:user_home_t:s0).
33
+ 2. When systemd launches the service, it executes the script in a more restricted
34
+ domain context. SELinux enforces that service scripts must have a context
35
+ allowing execution from the systemd context.
36
+ 3. The user_home_t label applied during installation does not permit execution by
37
+ systemd, so the exec() syscall is denied before the process can start.
38
+ 4. Running ./run.sh directly in an interactive shell works because interactive
39
+ shells run in a more permissive SELinux context that allows user_home_t exec.
40
+
41
+ Exit code 203/EXEC specifically means systemd failed during exec() — not during
42
+ runtime — confirming SELinux is the blocker rather than a configuration or
43
+ dependency issue.
44
+ fix: |
45
+ Apply the correct SELinux security context to the runner service scripts using
46
+ the chcon command. The usr_t type permits execution by systemd service contexts.
47
+
48
+ Step 1 — Fix runsvc.sh context (required):
49
+ cd /path/to/runner
50
+ sudo chcon system_u:object_r:usr_t:s0 runsvc.sh
51
+
52
+ Step 2 — Fix run.sh context (required if service starts but crashes immediately):
53
+ sudo chcon system_u:object_r:usr_t:s0 run.sh
54
+
55
+ Step 3 — Start the service:
56
+ sudo ./svc.sh start
57
+ sudo ./svc.sh status # Should show: Active: active (running)
58
+
59
+ For persistent context that survives runner upgrades and ./config.sh reinstalls,
60
+ use semanage fcontext to write the context rule permanently. This requires the
61
+ policycoreutils-python-utils package.
62
+ fix_code:
63
+ - language: yaml
64
+ label: "Fix SELinux context — run these commands on the host (not in workflow)"
65
+ code: |
66
+ # Navigate to the runner installation directory
67
+ cd /home/github-runner/actions-runner
68
+
69
+ # Step 1: Fix runsvc.sh SELinux context (required)
70
+ sudo chcon system_u:object_r:usr_t:s0 runsvc.sh
71
+
72
+ # Step 2: Fix run.sh as well (needed if service crashes immediately after start)
73
+ sudo chcon system_u:object_r:usr_t:s0 run.sh
74
+
75
+ # Step 3: Start the runner service
76
+ sudo ./svc.sh start
77
+
78
+ # Step 4: Verify the service is running
79
+ sudo ./svc.sh status
80
+ # Expected output: Active: active (running)
81
+
82
+ - language: yaml
83
+ label: "Persistent SELinux context via semanage (survives reinstalls)"
84
+ code: |
85
+ # Install policycoreutils-python-utils if semanage is not available
86
+ # sudo dnf install policycoreutils-python-utils
87
+
88
+ RUNNER_DIR="/home/github-runner/actions-runner"
89
+
90
+ # Add permanent file context rules
91
+ sudo semanage fcontext -a -t usr_t "${RUNNER_DIR}/runsvc.sh"
92
+ sudo semanage fcontext -a -t usr_t "${RUNNER_DIR}/run.sh"
93
+
94
+ # Apply rules to existing files
95
+ sudo restorecon -v "${RUNNER_DIR}/runsvc.sh"
96
+ sudo restorecon -v "${RUNNER_DIR}/run.sh"
97
+
98
+ # Verify contexts are set correctly
99
+ ls -lZ "${RUNNER_DIR}/runsvc.sh" "${RUNNER_DIR}/run.sh"
100
+ # Expected: system_u:object_r:usr_t:s0
101
+
102
+ # Start the runner service
103
+ sudo ./svc.sh start
104
+ prevention:
105
+ - "After ./config.sh on SELinux-enforcing systems, always run chcon on runsvc.sh before ./svc.sh start."
106
+ - "Use semanage fcontext for persistent context that survives runner upgrades and reinstalls."
107
+ - "Add chcon steps to your runner provisioning runbooks and Ansible/Terraform automation."
108
+ - "Verify SELinux denials with: sudo ausearch -m avc -ts recent | grep runner"
109
+ - "Consider using the RHEL runner container image which handles SELinux context automatically."
110
+ docs:
111
+ - url: "https://stackoverflow.com/questions/71818706/github-self-hosted-runner-fails-to-run-as-a-service-on-rh-linux"
112
+ label: "Stack Overflow: Self-hosted runner fails as service on RH Linux (17-vote answer)"
113
+ - url: "https://docs.github.com/en/actions/hosting-your-own-runners/managing-self-hosted-runners/configuring-the-self-hosted-runner-application-as-a-service"
114
+ label: "GitHub Docs: Configuring the self-hosted runner as a service"
115
+ - url: "https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/8/html/using_selinux/changing-selinux-contexts_using-selinux"
116
+ label: "Red Hat Docs: Changing SELinux file contexts with chcon"
@@ -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"