@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.
- 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/environment-deployment-false-custom-protection.yml +93 -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/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/checkout-v6-cross-repo-token-override.yml +103 -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/maven-gradle-403-cache-backend-outage.yml +116 -0
- package/errors/runner-environment/node20-removed-toolcache-default-node22.yml +104 -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/yaml-syntax/case-function-runner-version-too-old.yml +100 -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/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,127 @@
|
|
|
1
|
+
id: runner-environment-064
|
|
2
|
+
title: "macos-latest Label Switching to macOS 26 — Toolchain and Brew Package Changes"
|
|
3
|
+
category: runner-environment
|
|
4
|
+
severity: warning
|
|
5
|
+
tags:
|
|
6
|
+
- macos
|
|
7
|
+
- macos-latest
|
|
8
|
+
- macos-26
|
|
9
|
+
- runner-label
|
|
10
|
+
- homebrew
|
|
11
|
+
- toolchain
|
|
12
|
+
- migration
|
|
13
|
+
patterns:
|
|
14
|
+
- regex: "macos.*26.*not supported"
|
|
15
|
+
flags: "i"
|
|
16
|
+
- regex: "No such file or directory.*clang|clang.*not found"
|
|
17
|
+
flags: "i"
|
|
18
|
+
- regex: "dyld.*Library not loaded"
|
|
19
|
+
flags: "i"
|
|
20
|
+
- regex: "Error: Cannot install in Homebrew on macOS.*without Command Line Tools"
|
|
21
|
+
flags: "i"
|
|
22
|
+
- regex: "macos-latest.*macos-26"
|
|
23
|
+
flags: "i"
|
|
24
|
+
error_messages:
|
|
25
|
+
- "clang: error: no such file or directory"
|
|
26
|
+
- "dyld[12345]: Library not loaded: /usr/local/lib/libssl.1.1.dylib"
|
|
27
|
+
- "Error: Your CLT does not support macOS 26."
|
|
28
|
+
- "xcrun: error: SDK 'iphoneos' cannot be located"
|
|
29
|
+
root_cause: |
|
|
30
|
+
Starting June 15, 2026, the `macos-latest` runner label is being migrated
|
|
31
|
+
from macOS 15 (Sequoia) to macOS 26 (runner-images#14167). The rollout
|
|
32
|
+
runs through July 15, 2026. Workflows pinned to `macos-latest` without
|
|
33
|
+
testing on macOS 26 may encounter failures from toolchain and package
|
|
34
|
+
differences between the two OS versions.
|
|
35
|
+
|
|
36
|
+
Key differences in macOS 26 runner images compared to macOS 15:
|
|
37
|
+
|
|
38
|
+
1. **Homebrew LLVM version bump**: LLVM jumped from 18 to 20 on macOS 26.
|
|
39
|
+
Hardcoded paths like `/opt/homebrew/opt/llvm@18/bin/clang` or env vars
|
|
40
|
+
referencing `llvm@18` binaries fail. POCO and other libraries built
|
|
41
|
+
against LLVM 18 ABI may link incorrectly.
|
|
42
|
+
|
|
43
|
+
2. **macOS SDK changes**: macOS 26 uses a newer Xcode and SDK toolchain.
|
|
44
|
+
Libraries and headers that existed in macOS 15 SDK may have moved,
|
|
45
|
+
been renamed, or removed under the macOS 26 (Tahoe) SDK.
|
|
46
|
+
|
|
47
|
+
3. **Homebrew formula versions**: Many Homebrew packages have newer
|
|
48
|
+
versions on macOS 26 images than on macOS 15. Formulas with no macOS 26
|
|
49
|
+
bottle may be built from source, increasing job time significantly.
|
|
50
|
+
|
|
51
|
+
4. **System library locations**: Dynamic library paths (e.g., for OpenSSL,
|
|
52
|
+
libpq, or other system libs installed via Homebrew) may differ between
|
|
53
|
+
macOS 15 and macOS 26 as Homebrew evolves its prefix structure.
|
|
54
|
+
|
|
55
|
+
5. **Xcode simulator SDK policy**: Only the 3 latest Xcode versions retain
|
|
56
|
+
platform tools/SDKs. Workflows using older Xcode/simulator versions
|
|
57
|
+
that worked on macOS 15 may not find the expected SDK on macOS 26.
|
|
58
|
+
|
|
59
|
+
Workflows that do not pin `macos-latest` and have never tested on macOS 26
|
|
60
|
+
may start failing after the migration completes.
|
|
61
|
+
fix: |
|
|
62
|
+
1. **Pin to macOS 15 temporarily**: Replace `macos-latest` with `macos-15`
|
|
63
|
+
to preserve the current behavior while you test and migrate.
|
|
64
|
+
|
|
65
|
+
2. **Test on macOS 26 before migration**: Add a matrix job with
|
|
66
|
+
`macos-26` to identify failures before `macos-latest` switches.
|
|
67
|
+
|
|
68
|
+
3. **Fix hardcoded LLVM/Clang paths**: Update any hardcoded paths like
|
|
69
|
+
`/opt/homebrew/opt/llvm@18` to use `$(brew --prefix llvm)` or install
|
|
70
|
+
the specific version you need via `brew install llvm@18`.
|
|
71
|
+
|
|
72
|
+
4. **Update Homebrew formula pins**: Check for `@version`-pinned Homebrew
|
|
73
|
+
formulas that may no longer have macOS 26 bottles and either upgrade
|
|
74
|
+
or build from source explicitly.
|
|
75
|
+
|
|
76
|
+
5. **Audit system library dependencies**: For native extensions that link
|
|
77
|
+
against system or Homebrew libraries, verify library paths with
|
|
78
|
+
`brew --prefix <lib>` at runtime rather than hardcoding them.
|
|
79
|
+
fix_code:
|
|
80
|
+
- language: yaml
|
|
81
|
+
label: "Pin to macos-15 while testing macOS 26 compatibility"
|
|
82
|
+
code: |
|
|
83
|
+
jobs:
|
|
84
|
+
build:
|
|
85
|
+
# Temporarily pin to macos-15 while migration is in progress
|
|
86
|
+
# macos-latest will point to macos-26 starting June 15, 2026
|
|
87
|
+
runs-on: macos-15
|
|
88
|
+
steps:
|
|
89
|
+
- uses: actions/checkout@v4
|
|
90
|
+
- run: make build
|
|
91
|
+
- language: yaml
|
|
92
|
+
label: "Matrix to test both macOS 15 and 26 before migration"
|
|
93
|
+
code: |
|
|
94
|
+
jobs:
|
|
95
|
+
build:
|
|
96
|
+
strategy:
|
|
97
|
+
matrix:
|
|
98
|
+
os: [macos-15, macos-26]
|
|
99
|
+
fail-fast: false
|
|
100
|
+
runs-on: ${{ matrix.os }}
|
|
101
|
+
steps:
|
|
102
|
+
- uses: actions/checkout@v4
|
|
103
|
+
- run: make build
|
|
104
|
+
- language: yaml
|
|
105
|
+
label: "Use brew --prefix to resolve dynamic LLVM/library paths"
|
|
106
|
+
code: |
|
|
107
|
+
- name: Set up LLVM paths dynamically
|
|
108
|
+
run: |
|
|
109
|
+
# Instead of hardcoded /opt/homebrew/opt/llvm@18/bin/clang:
|
|
110
|
+
LLVM_PREFIX=$(brew --prefix llvm)
|
|
111
|
+
echo "CC=${LLVM_PREFIX}/bin/clang" >> $GITHUB_ENV
|
|
112
|
+
echo "CXX=${LLVM_PREFIX}/bin/clang++" >> $GITHUB_ENV
|
|
113
|
+
echo "${LLVM_PREFIX}/bin" >> $GITHUB_PATH
|
|
114
|
+
prevention:
|
|
115
|
+
- "Never use macos-latest without testing the next macOS version first — GitHub announces label migrations weeks in advance in runner-images issues."
|
|
116
|
+
- "Pin to a specific macOS version (e.g., macos-15) for production workflows; use macos-latest only in exploratory or dependency-update workflows."
|
|
117
|
+
- "Avoid hardcoding Homebrew formula paths — always use `$(brew --prefix <formula>)` to resolve paths dynamically."
|
|
118
|
+
- "Run a matrix job spanning current and next macOS versions as part of your CI to catch breakage before a label migration lands."
|
|
119
|
+
docs:
|
|
120
|
+
- url: "https://github.com/actions/runner-images/issues/14167"
|
|
121
|
+
label: "runner-images #14167: macos-latest will use macos-26 starting June 15, 2026"
|
|
122
|
+
- url: "https://github.blog/changelog/2026-05-14-github-actions-upcoming-image-migrations/"
|
|
123
|
+
label: "GitHub Changelog: Upcoming image migrations (May 2026)"
|
|
124
|
+
- url: "https://github.com/actions/runner-images/issues/14167"
|
|
125
|
+
label: "runner-images announcement: macOS 14 deprecation starting July 6, 2026"
|
|
126
|
+
- url: "https://docs.github.com/en/actions/using-github-hosted-runners/using-github-hosted-runners/about-github-hosted-runners#standard-github-hosted-runners-for-public-repositories"
|
|
127
|
+
label: "GitHub Docs: Standard GitHub-hosted runners — available runner labels"
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
id: runner-environment-075
|
|
2
|
+
title: "Maven/Gradle 403 Forbidden when GitHub Actions cache backend is degraded"
|
|
3
|
+
category: runner-environment
|
|
4
|
+
severity: error
|
|
5
|
+
tags:
|
|
6
|
+
- maven
|
|
7
|
+
- gradle
|
|
8
|
+
- 403
|
|
9
|
+
- cache-backend
|
|
10
|
+
- outage
|
|
11
|
+
- rate-limit
|
|
12
|
+
- sonatype
|
|
13
|
+
- dependency-download
|
|
14
|
+
|
|
15
|
+
patterns:
|
|
16
|
+
- regex: "Received status code 403 from server"
|
|
17
|
+
flags: "i"
|
|
18
|
+
- regex: "Could not transfer artifact .+ from .+ Forbidden"
|
|
19
|
+
flags: "i"
|
|
20
|
+
- regex: "Our services aren't available right now"
|
|
21
|
+
flags: "i"
|
|
22
|
+
- regex: "Received HTTP 403 from Maven Repository"
|
|
23
|
+
flags: "i"
|
|
24
|
+
|
|
25
|
+
error_messages:
|
|
26
|
+
- "Could not transfer artifact org.springframework:spring-core:jar:6.1.0 from/to central (https://repo.maven.apache.org/maven2): Received status code 403 from server: Forbidden"
|
|
27
|
+
- "Received status code 403 from server: Forbidden"
|
|
28
|
+
- "Our services aren't available right now\nWe're working to restore all services as soon as possible. Please check back soon."
|
|
29
|
+
- "Exception in thread \"main\" org.gradle.api.UncheckedIOException: com.amazonaws.SdkClientException: Unable to execute HTTP request: The target server failed to respond"
|
|
30
|
+
|
|
31
|
+
root_cause: |
|
|
32
|
+
GitHub Actions cache backend (actions/cache) is an eventually-consistent distributed storage
|
|
33
|
+
system. During degradation incidents, cache restore operations fail with the message
|
|
34
|
+
"Our services aren't available right now" and exit 0 (the job continues). Maven and Gradle
|
|
35
|
+
builds that normally cache artifacts under .m2/repository or .gradle/caches fall through
|
|
36
|
+
to downloading all dependencies directly from Maven Central (repo.maven.apache.org).
|
|
37
|
+
|
|
38
|
+
GitHub-hosted runners share IP address ranges across thousands of concurrent workflow runs.
|
|
39
|
+
During a cache backend outage, every affected build simultaneously requests artifacts
|
|
40
|
+
from Maven Central. Sonatype (which operates Maven Central) rate-limits abusive traffic
|
|
41
|
+
patterns from shared IP ranges, returning HTTP 403 Forbidden. This creates a cascading
|
|
42
|
+
failure: one cache service incident causes all Java/Kotlin/Scala CI pipelines to fail
|
|
43
|
+
until the cache backend recovers.
|
|
44
|
+
|
|
45
|
+
The failure is misleading because the error comes from Maven Central, not GitHub, so
|
|
46
|
+
developers often suspect repository permissions, network configuration, or Sonatype policy
|
|
47
|
+
changes rather than GitHub infrastructure.
|
|
48
|
+
|
|
49
|
+
fix: |
|
|
50
|
+
Short-term: Check GitHub Status (githubstatus.com) for cache service incidents before
|
|
51
|
+
debugging Maven/Gradle configuration. Retry the workflow after the incident resolves.
|
|
52
|
+
|
|
53
|
+
Medium-term: Add Maven retry configuration to pom.xml or build.gradle to tolerate
|
|
54
|
+
transient 403/429 responses. Configure a secondary mirror as a fallback to reduce
|
|
55
|
+
direct Maven Central dependency.
|
|
56
|
+
|
|
57
|
+
Long-term: Host a private artifact cache (Nexus, Artifactory, or AWS CodeArtifact)
|
|
58
|
+
that proxies Maven Central. This prevents GitHub runner IP ranges from hitting Maven
|
|
59
|
+
Central directly and provides a stable fallback during GitHub cache outages.
|
|
60
|
+
|
|
61
|
+
fix_code:
|
|
62
|
+
- language: yaml
|
|
63
|
+
label: "Workflow: Add retry wrapper step for Maven builds during cache degradation"
|
|
64
|
+
code: |
|
|
65
|
+
steps:
|
|
66
|
+
- uses: actions/cache@v4
|
|
67
|
+
id: maven-cache
|
|
68
|
+
with:
|
|
69
|
+
path: ~/.m2/repository
|
|
70
|
+
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
|
|
71
|
+
restore-keys: |
|
|
72
|
+
${{ runner.os }}-maven-
|
|
73
|
+
|
|
74
|
+
- name: Check cache status and set retry flag
|
|
75
|
+
if: steps.maven-cache.outputs.cache-hit != 'true'
|
|
76
|
+
run: echo "MAVEN_OPTS=-Dmaven.artifact.threads=5" >> $GITHUB_ENV
|
|
77
|
+
|
|
78
|
+
- name: Build with Maven
|
|
79
|
+
run: mvn --batch-mode --no-transfer-progress -T 1C verify
|
|
80
|
+
|
|
81
|
+
- language: yaml
|
|
82
|
+
label: "Maven settings.xml: Add mirror fallback to reduce direct Maven Central load"
|
|
83
|
+
code: |
|
|
84
|
+
# .github/maven-settings.xml — add to repository root
|
|
85
|
+
# Reference in workflow: mvn -s .github/maven-settings.xml ...
|
|
86
|
+
#
|
|
87
|
+
# <settings>
|
|
88
|
+
# <mirrors>
|
|
89
|
+
# <mirror>
|
|
90
|
+
# <id>central-mirror</id>
|
|
91
|
+
# <mirrorOf>central</mirrorOf>
|
|
92
|
+
# <url>https://repo1.maven.org/maven2/</url>
|
|
93
|
+
# </mirror>
|
|
94
|
+
# </mirrors>
|
|
95
|
+
# </settings>
|
|
96
|
+
#
|
|
97
|
+
# Then in workflow:
|
|
98
|
+
- name: Build with Maven (mirror fallback)
|
|
99
|
+
run: mvn -s .github/maven-settings.xml --batch-mode verify
|
|
100
|
+
|
|
101
|
+
prevention:
|
|
102
|
+
- "Monitor githubstatus.com/history for GitHub Actions cache incidents before assuming build failures are configuration errors."
|
|
103
|
+
- "Add --no-transfer-progress to Maven commands to reduce output noise; add -Dmaven.artifact.threads=3 to reduce concurrent Central requests."
|
|
104
|
+
- "Configure restore-keys fallback in actions/cache so partial cache hits reduce Maven Central traffic."
|
|
105
|
+
- "Consider self-hosted Nexus or AWS CodeArtifact as a Maven Central proxy for production CI pipelines."
|
|
106
|
+
- "Add 'if: always()' or cache-miss detection to skip cache restore wait during known outages."
|
|
107
|
+
|
|
108
|
+
docs:
|
|
109
|
+
- url: "https://github.com/actions/runner/issues/4180"
|
|
110
|
+
label: "actions/runner#4180: CI Runners Failing with 403 Forbidden for Maven/Gradle (75 reactions)"
|
|
111
|
+
- url: "https://www.githubstatus.com/"
|
|
112
|
+
label: "GitHub Status — check for Actions cache service incidents"
|
|
113
|
+
- url: "https://central.sonatype.org/faq/rate-limiting/"
|
|
114
|
+
label: "Sonatype Maven Central: Rate limiting and fair use policy"
|
|
115
|
+
- url: "https://docs.github.com/en/actions/using-workflows/caching-dependencies-to-speed-up-workflows"
|
|
116
|
+
label: "GitHub Docs: Caching dependencies to speed up workflows"
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
id: runner-environment-062
|
|
2
|
+
title: "Node.js 20 Removed from Toolcache — Default Node.js Changed to 22"
|
|
3
|
+
category: runner-environment
|
|
4
|
+
severity: error
|
|
5
|
+
tags:
|
|
6
|
+
- nodejs
|
|
7
|
+
- node20
|
|
8
|
+
- node22
|
|
9
|
+
- toolcache
|
|
10
|
+
- eol
|
|
11
|
+
- setup-node
|
|
12
|
+
- runner-images
|
|
13
|
+
patterns:
|
|
14
|
+
- regex: "node: not found"
|
|
15
|
+
flags: "i"
|
|
16
|
+
- regex: "node: No such file or directory"
|
|
17
|
+
flags: "i"
|
|
18
|
+
- regex: "Downloading Node\\.js (20\\.[0-9]+\\.[0-9]+)"
|
|
19
|
+
flags: "i"
|
|
20
|
+
- regex: "engines.*node.*>=\\s*20"
|
|
21
|
+
flags: "i"
|
|
22
|
+
- regex: "error node_modules.*requires node.*20"
|
|
23
|
+
flags: "i"
|
|
24
|
+
error_messages:
|
|
25
|
+
- "node: not found"
|
|
26
|
+
- "Downloading Node.js 20.x.x (not pre-installed, downloading on demand)"
|
|
27
|
+
- "error: The engine 'node' is incompatible with this module. Expected version '^20.0.0'. Got '22.x.x'"
|
|
28
|
+
- "The engine 'node' is incompatible with this module. Expected version '>=20 <21'. Got '22.14.0'"
|
|
29
|
+
root_cause: |
|
|
30
|
+
Node.js 20 reached end-of-life on April 30, 2026. Starting with runner image
|
|
31
|
+
updates rolled out May 19–26, 2026, Node.js 20 was removed from the toolcache
|
|
32
|
+
on ALL GitHub-hosted runner images (ubuntu-22.04, ubuntu-24.04, ubuntu-26.04,
|
|
33
|
+
macos-14, macos-15, macos-26, windows-2022, windows-2025, and ARM variants).
|
|
34
|
+
|
|
35
|
+
Two distinct impacts:
|
|
36
|
+
|
|
37
|
+
1. **Default Node.js version changed**: On runners where Node.js 20 was
|
|
38
|
+
previously the default (e.g., ubuntu-22.04, ubuntu-24.04, windows-2022,
|
|
39
|
+
macos-14), the default is now Node.js 22 (Maintenance LTS). Workflows
|
|
40
|
+
that call `node` or `npm` without an explicit `actions/setup-node` step
|
|
41
|
+
will now run on Node.js 22, potentially breaking packages with strict
|
|
42
|
+
engines constraints like `"node": "^20.0.0"`.
|
|
43
|
+
|
|
44
|
+
2. **setup-node now downloads Node.js 20**: If a workflow pins
|
|
45
|
+
`node-version: '20'` via `actions/setup-node`, it will no longer find
|
|
46
|
+
Node.js 20 in the toolcache and must download it on demand. This adds
|
|
47
|
+
download time and may fail if the registry is rate-limited or the runner
|
|
48
|
+
has no internet access (self-hosted runners with air-gapped environments).
|
|
49
|
+
|
|
50
|
+
Only Node.js 22 and Node.js 24 remain pre-installed in the toolcache on all
|
|
51
|
+
runner images after this change.
|
|
52
|
+
fix: |
|
|
53
|
+
Option 1 — Upgrade to Node.js 22 or 24 (recommended):
|
|
54
|
+
Update your project to support Node.js 22 (current Maintenance LTS) or
|
|
55
|
+
Node.js 24 (Active LTS). Update package.json engines field, run tests on
|
|
56
|
+
the new version, and remove the explicit node-version pin (or update it).
|
|
57
|
+
|
|
58
|
+
Option 2 — Pin to Node.js 20 via setup-node (temporary):
|
|
59
|
+
If you cannot migrate yet, explicitly install Node.js 20 on every job
|
|
60
|
+
using `actions/setup-node`. Node.js 20 is still downloadable on demand —
|
|
61
|
+
it just won't be pre-cached. This will slow down your workflow.
|
|
62
|
+
|
|
63
|
+
Option 3 — Test with FORCE_JAVASCRIPT_ACTIONS_TO_NODE24:
|
|
64
|
+
Set `FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true` as a workflow env to test
|
|
65
|
+
how your action runtime behaves on Node.js 24 before fully migrating.
|
|
66
|
+
fix_code:
|
|
67
|
+
- language: yaml
|
|
68
|
+
label: "Upgrade to Node.js 22 (recommended)"
|
|
69
|
+
code: |
|
|
70
|
+
- name: Set up Node.js
|
|
71
|
+
uses: actions/setup-node@v4
|
|
72
|
+
with:
|
|
73
|
+
node-version: '22' # Node.js 22 is Maintenance LTS through 2026
|
|
74
|
+
cache: 'npm'
|
|
75
|
+
- language: yaml
|
|
76
|
+
label: "Pin Node.js 20 temporarily (still downloadable on demand)"
|
|
77
|
+
code: |
|
|
78
|
+
- name: Set up Node.js 20 (no longer pre-cached — will download)
|
|
79
|
+
uses: actions/setup-node@v4
|
|
80
|
+
with:
|
|
81
|
+
node-version: '20' # EOL 2026-04-30; plan your migration to v22
|
|
82
|
+
cache: 'npm'
|
|
83
|
+
- language: yaml
|
|
84
|
+
label: "Use .nvmrc / .node-version to pin version in project root"
|
|
85
|
+
code: |
|
|
86
|
+
- name: Set up Node.js from .nvmrc
|
|
87
|
+
uses: actions/setup-node@v4
|
|
88
|
+
with:
|
|
89
|
+
node-version-file: '.nvmrc' # Update .nvmrc to 22 or 24
|
|
90
|
+
cache: 'npm'
|
|
91
|
+
prevention:
|
|
92
|
+
- "Always specify an explicit node-version in actions/setup-node — never rely on the runner's ambient Node.js version."
|
|
93
|
+
- "Set `node-version-file: '.nvmrc'` and commit a .nvmrc file so all environments (local, CI, containers) use the same version."
|
|
94
|
+
- "Watch the runner-images Announcements tab for future EOL removals — set up GitHub notifications for the actions/runner-images repo."
|
|
95
|
+
- "Use `engines` in package.json with a range like `>=22 <25` to catch version incompatibilities in CI early."
|
|
96
|
+
docs:
|
|
97
|
+
- url: "https://github.com/actions/runner-images/issues/14029"
|
|
98
|
+
label: "runner-images #14029: Node.js 20 removed, default changed to 22"
|
|
99
|
+
- url: "https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/"
|
|
100
|
+
label: "GitHub Changelog: Deprecation of Node 20 on GitHub Actions runners"
|
|
101
|
+
- url: "https://github.com/nodejs/release#readme"
|
|
102
|
+
label: "Node.js Release Schedule (EOL dates)"
|
|
103
|
+
- url: "https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/using-pre-installed-software#nodejs-versions"
|
|
104
|
+
label: "GitHub Docs: Using pre-installed software — Node.js versions"
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
id: runner-environment-063
|
|
2
|
+
title: "PowerShell 7.4 → 7.6 LTS Upgrade Breaks ThreadJob Module Name and .NET Runtime"
|
|
3
|
+
category: runner-environment
|
|
4
|
+
severity: warning
|
|
5
|
+
tags:
|
|
6
|
+
- powershell
|
|
7
|
+
- powershell-76
|
|
8
|
+
- threadjob
|
|
9
|
+
- dotnet10
|
|
10
|
+
- runner-images
|
|
11
|
+
- breaking-change
|
|
12
|
+
- module
|
|
13
|
+
patterns:
|
|
14
|
+
- regex: "The term 'ThreadJob\\\\Start-ThreadJob' is not recognized"
|
|
15
|
+
flags: "i"
|
|
16
|
+
- regex: "CommandNotFoundException.*ThreadJob"
|
|
17
|
+
flags: "i"
|
|
18
|
+
- regex: "Cannot find module.*ThreadJob"
|
|
19
|
+
flags: "i"
|
|
20
|
+
- regex: "Join-Path.*cannot process argument transformation on parameter 'ChildPath'"
|
|
21
|
+
flags: "i"
|
|
22
|
+
- regex: "PowerShell.*7\\.4.*not found"
|
|
23
|
+
flags: "i"
|
|
24
|
+
error_messages:
|
|
25
|
+
- "The term 'ThreadJob\\Start-ThreadJob' is not recognized as a name of a cmdlet, function, script file, or executable program."
|
|
26
|
+
- "Cannot find module ThreadJob"
|
|
27
|
+
- "Join-Path: Cannot process argument transformation on parameter 'ChildPath'."
|
|
28
|
+
- "Get-Module: The specified module 'ThreadJob' was not found"
|
|
29
|
+
root_cause: |
|
|
30
|
+
GitHub Actions runner images are being updated from PowerShell 7.4.x to 7.6.x
|
|
31
|
+
(the latest LTS release, based on .NET 10) across all runner images between
|
|
32
|
+
June 8–15, 2026 (runner-images#14150). PowerShell 7.6 is a major.minor
|
|
33
|
+
version upgrade from 7.4 and contains several breaking changes:
|
|
34
|
+
|
|
35
|
+
1. **ThreadJob module renamed**: The `ThreadJob` module has been replaced by
|
|
36
|
+
`Microsoft.PowerShell.ThreadJob`. The `Start-ThreadJob` cmdlet itself is
|
|
37
|
+
unchanged, but any script using the module-qualified name
|
|
38
|
+
`ThreadJob\Start-ThreadJob` will throw a CommandNotFoundException because
|
|
39
|
+
the old module name no longer exists. Scripts that call `Start-ThreadJob`
|
|
40
|
+
without the module prefix continue to work.
|
|
41
|
+
|
|
42
|
+
2. **Join-Path -ChildPath is now string[]**: The `-ChildPath` parameter type
|
|
43
|
+
changed from `string` to `string[]`. In most cases this is backward-
|
|
44
|
+
compatible, but scripts with unusual argument binding patterns or that
|
|
45
|
+
pass a typed `[string]` variable explicitly may encounter parameter
|
|
46
|
+
transformation errors.
|
|
47
|
+
|
|
48
|
+
3. **.NET 10 runtime**: PowerShell 7.6 ships on .NET 10 (7.4 was on .NET 8).
|
|
49
|
+
Scripts that load .NET assemblies, use P/Invoke, or invoke .NET API
|
|
50
|
+
members that changed between .NET 8 and .NET 10 may break silently
|
|
51
|
+
or throw runtime exceptions.
|
|
52
|
+
|
|
53
|
+
4. **WildcardPattern.Escape behavior change**: `WildcardPattern.Escape` now
|
|
54
|
+
correctly escapes lone backticks. Scripts that relied on the old (incorrect)
|
|
55
|
+
no-escape behavior may produce different wildcard pattern results.
|
|
56
|
+
|
|
57
|
+
5. **Trailing space removed from event source name**: Scripts that match
|
|
58
|
+
exact event source names (e.g., for Windows Event Log) may fail to find
|
|
59
|
+
the source if they include a trailing space.
|
|
60
|
+
fix: |
|
|
61
|
+
1. Replace module-qualified ThreadJob references:
|
|
62
|
+
Find all occurrences of `ThreadJob\Start-ThreadJob` in your scripts and
|
|
63
|
+
update them to `Microsoft.PowerShell.ThreadJob\Start-ThreadJob` or simply
|
|
64
|
+
use the unqualified `Start-ThreadJob`.
|
|
65
|
+
|
|
66
|
+
2. Review Join-Path usage:
|
|
67
|
+
Scripts using `Join-Path` with `-ChildPath` should continue to work in
|
|
68
|
+
most cases. If you see parameter binding errors, check that you are not
|
|
69
|
+
passing a typed `[string]` variable in a context that is now ambiguous.
|
|
70
|
+
|
|
71
|
+
3. Test .NET assembly loading:
|
|
72
|
+
If your scripts load .NET assemblies via `Add-Type -Path` or
|
|
73
|
+
`[System.Reflection.Assembly]::LoadFrom()`, test them against .NET 10
|
|
74
|
+
to catch any API compatibility issues before the upgrade rolls out.
|
|
75
|
+
|
|
76
|
+
4. Pin PowerShell version (temporary workaround):
|
|
77
|
+
Until migration is complete, you can install a specific PowerShell version
|
|
78
|
+
via the MSI/package manager in a workflow step. This is a temporary
|
|
79
|
+
workaround and should not be the long-term solution.
|
|
80
|
+
fix_code:
|
|
81
|
+
- language: yaml
|
|
82
|
+
label: "Fix module-qualified ThreadJob reference"
|
|
83
|
+
code: |
|
|
84
|
+
# Before (PowerShell 7.4 — breaks on 7.6):
|
|
85
|
+
# $job = ThreadJob\Start-ThreadJob -ScriptBlock { ... }
|
|
86
|
+
#
|
|
87
|
+
# After (works on both 7.4 and 7.6):
|
|
88
|
+
- name: Run threaded job
|
|
89
|
+
shell: pwsh
|
|
90
|
+
run: |
|
|
91
|
+
# Option A: unqualified (works on all versions)
|
|
92
|
+
$job = Start-ThreadJob -ScriptBlock { Get-Process }
|
|
93
|
+
|
|
94
|
+
# Option B: fully qualified with new module name (7.6+)
|
|
95
|
+
$job = Microsoft.PowerShell.ThreadJob\Start-ThreadJob -ScriptBlock { Get-Process }
|
|
96
|
+
|
|
97
|
+
$result = $job | Wait-Job | Receive-Job
|
|
98
|
+
Write-Output $result
|
|
99
|
+
- language: yaml
|
|
100
|
+
label: "Verify PowerShell version in workflow to detect future upgrades early"
|
|
101
|
+
code: |
|
|
102
|
+
- name: Check PowerShell version
|
|
103
|
+
shell: pwsh
|
|
104
|
+
run: |
|
|
105
|
+
$version = $PSVersionTable.PSVersion
|
|
106
|
+
Write-Output "PowerShell version: $version"
|
|
107
|
+
if ($version.Major -lt 7 -or ($version.Major -eq 7 -and $version.Minor -lt 6)) {
|
|
108
|
+
Write-Warning "PowerShell < 7.6 detected — ensure ThreadJob references use unqualified names"
|
|
109
|
+
}
|
|
110
|
+
prevention:
|
|
111
|
+
- "Use unqualified cmdlet names (Start-ThreadJob, not ThreadJob\\Start-ThreadJob) to avoid module-name dependencies."
|
|
112
|
+
- "Add a PowerShell version check step at the start of complex pwsh workflows to detect unexpected upgrades early."
|
|
113
|
+
- "Test workflows against the next PowerShell LTS version in a matrix before the runner image upgrade lands."
|
|
114
|
+
- "Subscribe to GitHub notifications on actions/runner-images to receive Announcement issues for upcoming breaking changes."
|
|
115
|
+
- "Avoid loading .NET assemblies by absolute path in runner workflows — prefer NuGet package installation to ensure .NET runtime compatibility."
|
|
116
|
+
docs:
|
|
117
|
+
- url: "https://github.com/actions/runner-images/issues/14150"
|
|
118
|
+
label: "runner-images #14150: PowerShell will be updated from 7.4 to 7.6 LTS (Jun 8-15 2026)"
|
|
119
|
+
- url: "https://learn.microsoft.com/en-us/powershell/scripting/whats-new/what-s-new-in-powershell-76"
|
|
120
|
+
label: "PowerShell 7.6 Release Notes — breaking changes"
|
|
121
|
+
- url: "https://github.com/PowerShell/PowerShell/releases/tag/v7.6.0"
|
|
122
|
+
label: "PowerShell v7.6.0 GitHub release"
|
|
123
|
+
- url: "https://learn.microsoft.com/en-us/powershell/scripting/install/powershell-support-lifecycle"
|
|
124
|
+
label: "PowerShell support lifecycle"
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
id: runner-environment-067
|
|
2
|
+
title: "Self-Hosted Runner 'An error occurred: Runner not found'"
|
|
3
|
+
category: runner-environment
|
|
4
|
+
severity: error
|
|
5
|
+
tags:
|
|
6
|
+
- self-hosted
|
|
7
|
+
- runner
|
|
8
|
+
- runner-not-found
|
|
9
|
+
- jit
|
|
10
|
+
- registration
|
|
11
|
+
- ephemeral
|
|
12
|
+
patterns:
|
|
13
|
+
- regex: "An error occurred: Runner not found"
|
|
14
|
+
flags: "i"
|
|
15
|
+
- regex: "Runner not found"
|
|
16
|
+
flags: "i"
|
|
17
|
+
- regex: "No runner matching the specified criteria was found"
|
|
18
|
+
flags: "i"
|
|
19
|
+
- regex: "Could not find any runner that matches the selector"
|
|
20
|
+
flags: "i"
|
|
21
|
+
error_messages:
|
|
22
|
+
- "An error occurred: Runner not found"
|
|
23
|
+
- "Error: An error occurred: Runner not found"
|
|
24
|
+
- "No runner matching the specified criteria was found"
|
|
25
|
+
root_cause: |
|
|
26
|
+
"An error occurred: Runner not found" is a vague error emitted by the
|
|
27
|
+
GitHub Actions broker when it cannot match or allocate a self-hosted runner
|
|
28
|
+
for a queued job. It has multiple distinct root causes:
|
|
29
|
+
|
|
30
|
+
1. **JIT (Just-in-Time) token expiry** (most common with ARC/Kubernetes runners):
|
|
31
|
+
Ephemeral runners provisioned via Just-in-Time tokens have a short registration
|
|
32
|
+
window. If the runner process does not connect within the token validity period
|
|
33
|
+
(~60 seconds), the broker discards the registration and emits "Runner not found"
|
|
34
|
+
when the job is dispatched. This particularly affects actions-runner-controller
|
|
35
|
+
(ARC) on Kubernetes when pod startup time exceeds the JIT window.
|
|
36
|
+
|
|
37
|
+
2. **Runner de-registered before job starts**:
|
|
38
|
+
Autoscaling controllers (ARC, custom scripts) that aggressively recycle idle
|
|
39
|
+
runners may de-register the runner in the brief window between job queue and
|
|
40
|
+
job dispatch. The broker finds no runner for the job's labels.
|
|
41
|
+
|
|
42
|
+
3. **Label mismatch**:
|
|
43
|
+
The workflow specifies `runs-on: [self-hosted, linux, x64]` but the registered
|
|
44
|
+
runner has different labels (e.g., just `[self-hosted, linux]`). The broker
|
|
45
|
+
treats this as "no matching runner found" and emits the same vague error.
|
|
46
|
+
|
|
47
|
+
4. **Runner registered at wrong scope**:
|
|
48
|
+
A runner registered at the organization level is not visible to a repository
|
|
49
|
+
not in that runner's group, or vice versa. Org runner group access policy
|
|
50
|
+
may restrict which repos can use the runner.
|
|
51
|
+
|
|
52
|
+
5. **Concurrent job stealing**:
|
|
53
|
+
In autoscaling pools where multiple runners share the same label set, a
|
|
54
|
+
job token issued to one runner is occasionally "stolen" by another — the
|
|
55
|
+
original runner's job token is invalid when it tries to start. Less common
|
|
56
|
+
but documented in high-concurrency pools (actions/runner#3857, 116 reactions).
|
|
57
|
+
|
|
58
|
+
The error is intentionally vague because it covers multiple broker-side failures
|
|
59
|
+
that are indistinguishable from the runner's perspective.
|
|
60
|
+
fix: |
|
|
61
|
+
Diagnose by checking the runner registration logs first:
|
|
62
|
+
|
|
63
|
+
1. **For JIT token expiry (ARC/Kubernetes)**:
|
|
64
|
+
Reduce pod startup time — use pre-pulled images, smaller base images, or
|
|
65
|
+
warm pools. Alternatively, switch to Long-Running runners (PAT/App-registered)
|
|
66
|
+
which don't have JIT token windows. Check actions-runner-controller v0.9+
|
|
67
|
+
which extended the JIT window.
|
|
68
|
+
|
|
69
|
+
2. **For de-registered runner race condition**:
|
|
70
|
+
Add a grace period to your autoscaler before de-registering idle runners —
|
|
71
|
+
at least 60 seconds after a job completes. Use `--once` flag on ephemeral
|
|
72
|
+
runners so they only exit after completing one job, not before.
|
|
73
|
+
|
|
74
|
+
3. **For label mismatch**:
|
|
75
|
+
Run `gh api repos/{owner}/{repo}/actions/runners --jq '.[].labels'` to inspect
|
|
76
|
+
registered runner labels. Compare against the `runs-on:` in your workflow.
|
|
77
|
+
Labels are case-sensitive and must be an exact subset match.
|
|
78
|
+
|
|
79
|
+
4. **For wrong scope (org vs repo)**:
|
|
80
|
+
Check Settings → Actions → Runners in both the repo and org. Confirm the
|
|
81
|
+
runner appears under the correct scope and the runner group allows access
|
|
82
|
+
to the repository.
|
|
83
|
+
|
|
84
|
+
5. **General debugging**:
|
|
85
|
+
Enable runner diagnostic logs by setting `ACTIONS_RUNNER_DEBUG: true` and
|
|
86
|
+
`ACTIONS_STEP_DEBUG: true` as repository secrets. This enables verbose
|
|
87
|
+
broker negotiation logs in the Actions runner output.
|
|
88
|
+
fix_code:
|
|
89
|
+
- language: yaml
|
|
90
|
+
label: "Enable runner diagnostic logs to capture broker negotiation details"
|
|
91
|
+
code: |
|
|
92
|
+
# Add these as repository secrets (Settings → Secrets → Actions):
|
|
93
|
+
# ACTIONS_RUNNER_DEBUG = true
|
|
94
|
+
# ACTIONS_STEP_DEBUG = true
|
|
95
|
+
|
|
96
|
+
# Then re-run the failing job. The runner logs will include:
|
|
97
|
+
# "Checking runner for labels: [self-hosted, linux, x64]"
|
|
98
|
+
# "Connected to GitHub Actions service"
|
|
99
|
+
# "Received job assignment: ..."
|
|
100
|
+
jobs:
|
|
101
|
+
build:
|
|
102
|
+
runs-on: [self-hosted, linux, x64]
|
|
103
|
+
steps:
|
|
104
|
+
- uses: actions/checkout@v4
|
|
105
|
+
- run: echo "Runner labels verified"
|
|
106
|
+
- language: yaml
|
|
107
|
+
label: "Verify registered runner labels via GitHub API"
|
|
108
|
+
code: |
|
|
109
|
+
# Check what labels your self-hosted runners actually have:
|
|
110
|
+
# gh api repos/{owner}/{repo}/actions/runners --jq '.runners[] | {name: .name, labels: [.labels[].name]}'
|
|
111
|
+
# Example output:
|
|
112
|
+
# {"name": "my-runner", "labels": ["self-hosted", "Linux", "X64"]}
|
|
113
|
+
# Note: Labels are case-sensitive — "Linux" != "linux"
|
|
114
|
+
|
|
115
|
+
# Workflow label must match runner label exactly:
|
|
116
|
+
jobs:
|
|
117
|
+
build:
|
|
118
|
+
# Use exact case matching the runner's registered labels:
|
|
119
|
+
runs-on: [self-hosted, Linux, X64]
|
|
120
|
+
prevention:
|
|
121
|
+
- "Use explicit, versioned runner labels instead of generic `self-hosted` to make label mismatches immediately visible in the runner registration."
|
|
122
|
+
- "For ephemeral/JIT runners on Kubernetes, use pre-pulled base images and resource requests that ensure fast pod startup to avoid JIT token expiry."
|
|
123
|
+
- "Add ACTIONS_RUNNER_DEBUG=true as a repository secret during initial setup to capture detailed registration logs before the runner goes into production."
|
|
124
|
+
- "Implement health monitoring on your self-hosted runner pool — alert when the runner count drops below the minimum needed for your queue depth."
|
|
125
|
+
- "Prefer Long-Running runners over JIT ephemeral runners for workflows with unpredictable startup patterns — JIT token windows are unforgiving on slow infrastructure."
|
|
126
|
+
docs:
|
|
127
|
+
- url: "https://github.com/actions/runner/issues/3857"
|
|
128
|
+
label: "actions/runner #3857: 'An error occurred: Runner not found' (116 reactions)"
|
|
129
|
+
- url: "https://docs.github.com/en/actions/hosting-your-own-runners/managing-self-hosted-runners/monitoring-and-troubleshooting-self-hosted-runners"
|
|
130
|
+
label: "GitHub Docs: Monitoring and troubleshooting self-hosted runners"
|
|
131
|
+
- url: "https://docs.github.com/en/actions/hosting-your-own-runners/managing-self-hosted-runners/using-labels-with-self-hosted-runners"
|
|
132
|
+
label: "GitHub Docs: Using labels with self-hosted runners"
|
|
133
|
+
- url: "https://docs.github.com/en/actions/security-for-github-actions/security-guides/security-hardening-for-github-actions#hardening-for-self-hosted-runners"
|
|
134
|
+
label: "GitHub Docs: Security hardening for self-hosted runners"
|