@htekdev/actions-debugger 1.0.14 → 1.0.16
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/dist/db/search.js +3 -1
- package/dist/db/search.js.map +1 -1
- package/dist/tools/suggest-fix.d.ts.map +1 -1
- package/dist/tools/suggest-fix.js +5 -1
- package/dist/tools/suggest-fix.js.map +1 -1
- package/errors/caching-artifacts/cache-key-too-long.yml +93 -0
- package/errors/caching-artifacts/cache-path-not-exist-skipped.yml +152 -0
- package/errors/caching-artifacts/cache-save-same-key-html-conflict.yml +109 -0
- package/errors/caching-artifacts/docker-buildx-gha-cache-capacity.yml +107 -0
- package/errors/caching-artifacts/setup-ruby-bundler-ephemeral-workdir-cache-miss.yml +147 -0
- package/errors/caching-artifacts/upload-artifact-v3-retirement-blocked.yml +123 -0
- package/errors/caching-artifacts/upload-artifact-v4-large-file-macos-hang.yml +111 -0
- package/errors/concurrency-timing/always-cleanup-5min-forced-kill.yml +140 -0
- package/errors/concurrency-timing/concurrency-group-env-context-undefined.yml +99 -0
- package/errors/concurrency-timing/required-check-pending-path-filter-skip.yml +160 -0
- package/errors/concurrency-timing/wait-timer-cancel-in-progress-starvation.yml +125 -0
- package/errors/known-unsolved/composite-action-step-timeout-minutes-ignored.yml +146 -0
- package/errors/known-unsolved/reusable-workflow-no-composite-action-call.yml +116 -0
- package/errors/known-unsolved/schedule-trigger-default-branch-only.yml +113 -0
- package/errors/known-unsolved/secrets-not-allowed-in-if-conditions.yml +149 -0
- package/errors/known-unsolved/workflow-50-rerun-limit.yml +110 -0
- package/errors/permissions-auth/check-run-status-modification-blocked.yml +134 -0
- package/errors/permissions-auth/dependabot-pr-secrets-unavailable.yml +133 -0
- package/errors/permissions-auth/fine-grained-pat-deployment-write-required.yml +146 -0
- package/errors/permissions-auth/github-app-installation-token-new-format.yml +124 -0
- package/errors/permissions-auth/github-packages-read-requires-packages-permission.yml +128 -0
- package/errors/permissions-auth/oidc-id-token-write-permission-missing.yml +169 -0
- package/errors/permissions-auth/permissions-empty-block-removes-contents-read.yml +97 -0
- package/errors/permissions-auth/reusable-workflow-permissions-not-inherited.yml +114 -0
- package/errors/runner-environment/checkout-windows-ebusy-lock.yml +124 -0
- package/errors/runner-environment/deprecated-action-version-auto-rejected.yml +89 -0
- package/errors/runner-environment/github-hosted-runner-disk-space-full.yml +85 -0
- package/errors/runner-environment/github-path-same-step-not-found.yml +114 -0
- package/errors/runner-environment/github-script-v6-octokit-rest-actions-not-function.yml +87 -0
- package/errors/runner-environment/macos-13-deprecation-brownout.yml +93 -0
- package/errors/runner-environment/macos-15-mono-nuget-removed.yml +151 -0
- package/errors/runner-environment/macos-15-xcode-simulator-sdk-policy.yml +141 -0
- package/errors/runner-environment/multi-runtime-nov2025-removal.yml +120 -0
- package/errors/runner-environment/runner-oom-exit-code-137.yml +117 -0
- package/errors/runner-environment/setup-go-go123-telemetry-cache-failure.yml +92 -0
- package/errors/runner-environment/setup-java-distribution-required.yml +108 -0
- package/errors/runner-environment/ubuntu-2004-retirement-brownout.yml +107 -0
- package/errors/runner-environment/windows-latest-d-drive-removed.yml +104 -0
- package/errors/runner-environment/windows-vs2026-cuda-host-compiler-unsupported.yml +145 -0
- package/errors/silent-failures/event-commits-empty-on-workflow-dispatch.yml +110 -0
- package/errors/silent-failures/fetch-tags-depth-one-silent-no-op.yml +77 -0
- package/errors/silent-failures/github-env-multiline-value-truncated.yml +127 -0
- package/errors/silent-failures/github-sha-pr-merge-commit-not-head.yml +150 -0
- package/errors/silent-failures/job-output-masked-as-secret-empty.yml +147 -0
- package/errors/silent-failures/upload-artifact-permissions-stripped.yml +98 -0
- package/errors/triggers/pull-request-branches-filter-matches-base-not-head.yml +140 -0
- package/errors/triggers/push-event-fires-on-branch-delete.yml +129 -0
- package/errors/triggers/push-first-commit-before-sha-zeros.yml +160 -0
- package/errors/yaml-syntax/continue-on-error-env-context-rejected.yml +130 -0
- package/errors/yaml-syntax/fromjson-empty-string-crash.yml +99 -0
- package/errors/yaml-syntax/if-bang-negation-yaml-tag.yml +145 -0
- package/errors/yaml-syntax/local-action-path-always-top-level.yml +142 -0
- package/package.json +1 -1
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
id: runner-environment-042
|
|
2
|
+
title: "actions/checkout EBUSY File Lock on Windows Self-Hosted Runners"
|
|
3
|
+
category: runner-environment
|
|
4
|
+
severity: error
|
|
5
|
+
tags:
|
|
6
|
+
- windows
|
|
7
|
+
- self-hosted
|
|
8
|
+
- checkout
|
|
9
|
+
- ebusy
|
|
10
|
+
- file-lock
|
|
11
|
+
- git-fsmonitor
|
|
12
|
+
patterns:
|
|
13
|
+
- regex: "EBUSY.*resource busy or locked"
|
|
14
|
+
flags: "i"
|
|
15
|
+
- regex: "File was unable to be removed.*EBUSY"
|
|
16
|
+
flags: "i"
|
|
17
|
+
- regex: "Unable to remove.*_temp.*EBUSY"
|
|
18
|
+
flags: "i"
|
|
19
|
+
error_messages:
|
|
20
|
+
- "Error: File was unable to be removed Error: EBUSY: resource busy or locked, rmdir 'C:\\Users\\...\\runner\\_temp\\...'"
|
|
21
|
+
- "Error: EBUSY: resource busy or locked, rmdir"
|
|
22
|
+
- "Error: The process cannot access the file because it is being used by another process"
|
|
23
|
+
root_cause: |
|
|
24
|
+
On Windows self-hosted runners, `actions/checkout` fails with an `EBUSY` (resource
|
|
25
|
+
busy or locked) error when attempting to clean up temp directories during checkout.
|
|
26
|
+
|
|
27
|
+
**Primary cause — Git FSMonitor:**
|
|
28
|
+
Git's `core.fsmonitor` daemon (enabled by default in Git 2.36+) keeps a file handle
|
|
29
|
+
open on the repository directory. When `actions/checkout` tries to remove or clean the
|
|
30
|
+
`_temp` directory between runs, the FSMonitor process holds the lock, causing EBUSY.
|
|
31
|
+
|
|
32
|
+
**Secondary causes:**
|
|
33
|
+
- Windows Defender / antivirus scanning files that checkout is trying to delete
|
|
34
|
+
- Other processes (IDE file watchers, npm watchers, running Node processes) holding
|
|
35
|
+
handles on workspace files
|
|
36
|
+
- Concurrent runner jobs accessing the same workspace directory
|
|
37
|
+
|
|
38
|
+
**Why Windows only:**
|
|
39
|
+
Linux/macOS do not enforce EBUSY locks in the same way. Windows file locking is
|
|
40
|
+
advisory on Unix but mandatory on NTFS, so the same handle that would succeed on
|
|
41
|
+
Linux causes a hard error on Windows.
|
|
42
|
+
|
|
43
|
+
Source: actions/checkout#1388
|
|
44
|
+
fix: |
|
|
45
|
+
**Option 1 (recommended): Disable Git FSMonitor on the runner**
|
|
46
|
+
|
|
47
|
+
Configure Git globally on the self-hosted runner to disable fsmonitor:
|
|
48
|
+
```
|
|
49
|
+
git config --global core.fsmonitor false
|
|
50
|
+
git config --global core.useBuiltinFSMonitor false
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
**Option 2: Add a pre-checkout cleanup step**
|
|
54
|
+
|
|
55
|
+
Kill any lingering Git processes before checkout:
|
|
56
|
+
```yaml
|
|
57
|
+
- name: Kill lingering git processes
|
|
58
|
+
shell: pwsh
|
|
59
|
+
run: Get-Process -Name "git" -ErrorAction SilentlyContinue | Stop-Process -Force
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
**Option 3: Configure antivirus exclusions**
|
|
63
|
+
|
|
64
|
+
Add the runner workspace directory (e.g., `C:\actions-runner\_work\`) to Windows
|
|
65
|
+
Defender's exclusion list on the self-hosted runner machine.
|
|
66
|
+
|
|
67
|
+
**Option 4: Use `clean: false` and handle cleanup manually**
|
|
68
|
+
|
|
69
|
+
Setting `clean: false` on `actions/checkout` prevents the step from attempting to
|
|
70
|
+
clean the workspace, avoiding the lock conflict entirely.
|
|
71
|
+
fix_code:
|
|
72
|
+
- language: yaml
|
|
73
|
+
label: "Workaround — disable git FSMonitor before checkout"
|
|
74
|
+
code: |
|
|
75
|
+
jobs:
|
|
76
|
+
build:
|
|
77
|
+
runs-on: [self-hosted, windows]
|
|
78
|
+
steps:
|
|
79
|
+
# Kill git fsmonitor daemon before checkout to release file locks
|
|
80
|
+
- name: Disable git fsmonitor
|
|
81
|
+
shell: pwsh
|
|
82
|
+
run: |
|
|
83
|
+
git config --global core.fsmonitor false
|
|
84
|
+
git config --global core.useBuiltinFSMonitor false
|
|
85
|
+
Get-Process -Name "git" -ErrorAction SilentlyContinue | Stop-Process -Force
|
|
86
|
+
|
|
87
|
+
- uses: actions/checkout@v4
|
|
88
|
+
- language: yaml
|
|
89
|
+
label: "Workaround — skip workspace clean to avoid EBUSY on _temp"
|
|
90
|
+
code: |
|
|
91
|
+
jobs:
|
|
92
|
+
build:
|
|
93
|
+
runs-on: [self-hosted, windows]
|
|
94
|
+
steps:
|
|
95
|
+
- uses: actions/checkout@v4
|
|
96
|
+
with:
|
|
97
|
+
clean: false # Skip workspace clean; avoids EBUSY on locked dirs
|
|
98
|
+
- language: yaml
|
|
99
|
+
label: "Workaround — retry checkout on EBUSY failure"
|
|
100
|
+
code: |
|
|
101
|
+
jobs:
|
|
102
|
+
build:
|
|
103
|
+
runs-on: [self-hosted, windows]
|
|
104
|
+
steps:
|
|
105
|
+
- name: Checkout with retry
|
|
106
|
+
uses: nick-fields/retry@v3
|
|
107
|
+
with:
|
|
108
|
+
timeout_minutes: 5
|
|
109
|
+
max_attempts: 3
|
|
110
|
+
command: git checkout
|
|
111
|
+
- uses: actions/checkout@v4
|
|
112
|
+
prevention:
|
|
113
|
+
- "Disable Git FSMonitor globally on Windows self-hosted runners: `git config --global core.fsmonitor false`."
|
|
114
|
+
- "Add the runner `_work` directory to Windows Defender exclusions — AV scanning causes EBUSY on files checkout needs to delete."
|
|
115
|
+
- "Avoid running multiple workflow jobs concurrently on the same workspace directory on a single Windows self-hosted runner."
|
|
116
|
+
- "Upgrade to `actions/checkout@v4` — later versions have improved retry logic and are more resilient to transient locks."
|
|
117
|
+
- "Consider using ephemeral self-hosted runners that start fresh for each job, eliminating stale workspace lock issues entirely."
|
|
118
|
+
docs:
|
|
119
|
+
- url: "https://github.com/actions/checkout/issues/1388"
|
|
120
|
+
label: "actions/checkout#1388 — EBUSY resource busy or locked on Windows self-hosted"
|
|
121
|
+
- url: "https://docs.github.com/en/actions/hosting-your-own-runners/managing-self-hosted-runners/about-self-hosted-runners"
|
|
122
|
+
label: "GitHub Docs: About self-hosted runners"
|
|
123
|
+
- url: "https://git-scm.com/docs/git-config#Documentation/git-config.txt-corefsmonitor"
|
|
124
|
+
label: "Git config: core.fsmonitor"
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
id: runner-environment-037
|
|
2
|
+
title: "Deprecated Action Version Automatically Rejected by Runner"
|
|
3
|
+
category: runner-environment
|
|
4
|
+
severity: error
|
|
5
|
+
tags:
|
|
6
|
+
- deprecated
|
|
7
|
+
- action-version
|
|
8
|
+
- actions-cache
|
|
9
|
+
- breaking-change
|
|
10
|
+
- pinning
|
|
11
|
+
- migration
|
|
12
|
+
patterns:
|
|
13
|
+
- regex: "This request has been automatically failed because it uses a deprecated version of"
|
|
14
|
+
flags: "i"
|
|
15
|
+
- regex: "uses a deprecated version of `actions/(cache|checkout|upload-artifact|download-artifact)"
|
|
16
|
+
flags: "i"
|
|
17
|
+
- regex: "Please update your workflow to use v[0-9]+ of `actions/"
|
|
18
|
+
flags: "i"
|
|
19
|
+
error_messages:
|
|
20
|
+
- "Error: This request has been automatically failed because it uses a deprecated version of `actions/cache: v4.0.2`. Please update your workflow to use v3/v4 of actions/cache. Learn more: https://github.blog/changelog/..."
|
|
21
|
+
- "Error: This request has been automatically failed because it uses a deprecated version of `actions/upload-artifact: v1`."
|
|
22
|
+
root_cause: |
|
|
23
|
+
GitHub periodically deprecates specific minor/patch version tags of official actions (e.g.,
|
|
24
|
+
actions/cache, actions/checkout, actions/upload-artifact). When a workflow pins a deprecated
|
|
25
|
+
specific version (e.g., @v4.0.2 instead of @v4), the Actions runner rejects the entire run
|
|
26
|
+
immediately with an "automatically failed" message — before executing any step logic.
|
|
27
|
+
|
|
28
|
+
This is distinct from a runtime failure: the runner halts before any user code runs, which
|
|
29
|
+
means logs contain only the rejection message and no build output.
|
|
30
|
+
|
|
31
|
+
Deprecation schedules and affected versions are announced via GitHub Changelog. Common
|
|
32
|
+
scenarios that trigger this:
|
|
33
|
+
- Pinning exact minor/patch SHA-like versions (v4.0.2) instead of major aliases (v4)
|
|
34
|
+
- Old workflow files that predate a deprecation cycle and have not been updated
|
|
35
|
+
- Third-party or internal actions that internally depend on deprecated toolkit versions
|
|
36
|
+
- Dependabot bumping a minor version that happens to be on the deprecated list
|
|
37
|
+
|
|
38
|
+
Affected actions as of 2024-2026 include actions/cache v1/v2, specific v4.0.x minor pins,
|
|
39
|
+
actions/upload-artifact v1/v2, and associated @actions/toolkit package versions used as
|
|
40
|
+
dependencies in published actions.
|
|
41
|
+
fix: |
|
|
42
|
+
Update all action `uses:` references to a currently supported version tag.
|
|
43
|
+
|
|
44
|
+
For official GitHub actions, always prefer the major version alias (e.g., @v4, @v3) rather
|
|
45
|
+
than pinning a minor or patch version. This ensures your workflow automatically receives
|
|
46
|
+
non-breaking updates and avoids deprecation gates.
|
|
47
|
+
|
|
48
|
+
To track deprecation notices proactively:
|
|
49
|
+
- Watch or subscribe to https://github.blog/changelog/ for "breaking changes" announcements
|
|
50
|
+
- Enable Dependabot for GitHub Actions in your repository
|
|
51
|
+
- Check the action's GitHub releases page for deprecation notices in release notes
|
|
52
|
+
fix_code:
|
|
53
|
+
- language: yaml
|
|
54
|
+
label: "Use major version alias instead of pinned minor version"
|
|
55
|
+
code: |
|
|
56
|
+
jobs:
|
|
57
|
+
build:
|
|
58
|
+
steps:
|
|
59
|
+
# ❌ Pinned minor version — may be auto-rejected after deprecation
|
|
60
|
+
- uses: actions/cache@v4.0.2
|
|
61
|
+
|
|
62
|
+
# ✅ Major alias — always points to latest supported minor in that major
|
|
63
|
+
- uses: actions/cache@v4
|
|
64
|
+
|
|
65
|
+
# ✅ Full SHA pin — immune to deprecation gates (security-conscious alternative)
|
|
66
|
+
- uses: actions/cache@5a3ec84eff668545956fd18022155c47c3f8e48
|
|
67
|
+
- language: yaml
|
|
68
|
+
label: "Enable Dependabot to keep action versions current"
|
|
69
|
+
code: |
|
|
70
|
+
# .github/dependabot.yml
|
|
71
|
+
version: 2
|
|
72
|
+
updates:
|
|
73
|
+
- package-ecosystem: "github-actions"
|
|
74
|
+
directory: "/"
|
|
75
|
+
schedule:
|
|
76
|
+
interval: "weekly"
|
|
77
|
+
prevention:
|
|
78
|
+
- "Use major version aliases (@v4, @v3) instead of exact minor/patch versions for official GitHub actions."
|
|
79
|
+
- "Subscribe to github.blog/changelog and watch for 'Notice of upcoming releases and breaking changes for GitHub Actions' posts."
|
|
80
|
+
- "Enable Dependabot for the github-actions ecosystem in your repository to auto-bump pinned versions."
|
|
81
|
+
- "Periodically audit your workflows for pinned minor/patch versions: grep -r 'uses:' .github/workflows/ | grep -E '@v[0-9]+\\.[0-9]+'"
|
|
82
|
+
- "When using SHA pinning for security, use a tool like StepSecurity's Harden-Runner or pin-github-action to maintain fresh SHAs."
|
|
83
|
+
docs:
|
|
84
|
+
- url: "https://github.blog/changelog/2024-12-05-notice-of-upcoming-releases-and-breaking-changes-for-github-actions/#actions-cache-v1-v2-and-actions-toolkit-cache-package-closing-down"
|
|
85
|
+
label: "GitHub Changelog — actions/cache v1/v2 deprecation notice"
|
|
86
|
+
- url: "https://github.com/orgs/community/discussions/151729"
|
|
87
|
+
label: "Community discussion #151729 — deprecated action version auto-failure"
|
|
88
|
+
- url: "https://github.com/actions/setup-python/issues/1037"
|
|
89
|
+
label: "actions/setup-python #1037 — reports of deprecated cache version failures"
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
id: runner-environment-048
|
|
2
|
+
title: "GitHub-hosted runner disk space exhausted (No space left on device)"
|
|
3
|
+
category: runner-environment
|
|
4
|
+
severity: error
|
|
5
|
+
tags:
|
|
6
|
+
- disk-space
|
|
7
|
+
- ubuntu
|
|
8
|
+
- docker
|
|
9
|
+
- storage
|
|
10
|
+
- enospc
|
|
11
|
+
patterns:
|
|
12
|
+
- regex: "No space left on device"
|
|
13
|
+
flags: "i"
|
|
14
|
+
- regex: "ENOSPC: no space left on device"
|
|
15
|
+
flags: "i"
|
|
16
|
+
- regex: "Disk usage: 100%"
|
|
17
|
+
flags: "i"
|
|
18
|
+
- regex: "write .*: no space left on device"
|
|
19
|
+
flags: "i"
|
|
20
|
+
error_messages:
|
|
21
|
+
- "No space left on device"
|
|
22
|
+
- "Error: ENOSPC: no space left on device, write"
|
|
23
|
+
- "OSError: [Errno 28] No space left on device"
|
|
24
|
+
root_cause: |
|
|
25
|
+
GitHub-hosted ubuntu-latest runners start with approximately 14-25 GB of free
|
|
26
|
+
disk space after the OS and pre-installed toolchains occupy the rest of the
|
|
27
|
+
~80 GB disk. Workflows that build large Docker images, run multi-stage builds,
|
|
28
|
+
download large artifacts, or install additional software can exhaust this
|
|
29
|
+
budget mid-job.
|
|
30
|
+
|
|
31
|
+
Common culprits:
|
|
32
|
+
- Docker build layers accumulating in /var/lib/docker (no automatic pruning)
|
|
33
|
+
- Android SDK, .NET SDKs, Haskell GHC, and other large pre-installed tools
|
|
34
|
+
consuming 50+ GB of disk that most workflows never need
|
|
35
|
+
- Multiple matrix jobs each pulling large container images on the same runner
|
|
36
|
+
(each job gets a fresh runner, but a single job's steps share one disk)
|
|
37
|
+
fix: |
|
|
38
|
+
Add a disk-space cleanup step at the start of your job before any build steps.
|
|
39
|
+
The jlumbroso/free-disk-space action removes pre-installed tools you don't
|
|
40
|
+
need, recovering 30-60 GB.
|
|
41
|
+
|
|
42
|
+
Alternatively, use docker system prune to clean up intermediate layers after
|
|
43
|
+
each build stage, or split large jobs across multiple workflows.
|
|
44
|
+
fix_code:
|
|
45
|
+
- language: yaml
|
|
46
|
+
label: "Use free-disk-space action at job start"
|
|
47
|
+
code: |
|
|
48
|
+
jobs:
|
|
49
|
+
build:
|
|
50
|
+
runs-on: ubuntu-latest
|
|
51
|
+
steps:
|
|
52
|
+
- name: Free disk space
|
|
53
|
+
uses: jlumbroso/free-disk-space@v1.3.1
|
|
54
|
+
with:
|
|
55
|
+
tool-cache: false
|
|
56
|
+
android: true
|
|
57
|
+
dotnet: true
|
|
58
|
+
haskell: true
|
|
59
|
+
large-packages: true
|
|
60
|
+
swap-storage: true
|
|
61
|
+
- uses: actions/checkout@v4
|
|
62
|
+
- name: Build Docker image
|
|
63
|
+
run: docker build -t myapp .
|
|
64
|
+
- language: yaml
|
|
65
|
+
label: "Prune Docker intermediate layers between build stages"
|
|
66
|
+
code: |
|
|
67
|
+
- name: Build builder stage
|
|
68
|
+
run: docker build --target builder -t myapp:builder .
|
|
69
|
+
- name: Prune intermediate layers
|
|
70
|
+
run: docker image prune -f
|
|
71
|
+
- name: Build final image
|
|
72
|
+
run: docker build -t myapp:final .
|
|
73
|
+
prevention:
|
|
74
|
+
- "Add jlumbroso/free-disk-space as the first step in any disk-intensive job"
|
|
75
|
+
- "Use multi-stage Docker builds and prune builder images after the final stage"
|
|
76
|
+
- "Run df -h early in the job to baseline free space and catch issues before they crash"
|
|
77
|
+
- "Consider GitHub larger runners (30-100 GB disk) for builds that legitimately need space"
|
|
78
|
+
- "Cache Docker layers with type=gha to avoid re-downloading the same base images"
|
|
79
|
+
docs:
|
|
80
|
+
- url: "https://github.com/jlumbroso/free-disk-space"
|
|
81
|
+
label: "jlumbroso/free-disk-space — reclaim disk on GitHub-hosted runners"
|
|
82
|
+
- url: "https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners/about-github-hosted-runners#supported-runners-and-hardware-resources"
|
|
83
|
+
label: "GitHub Docs — Hosted runner hardware resources and disk space"
|
|
84
|
+
- url: "https://github.com/actions/runner-images/issues/2840"
|
|
85
|
+
label: "runner-images#2840 — Disk space workarounds discussion"
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
id: runner-environment-040
|
|
2
|
+
title: "GITHUB_PATH Updates Are Not Available in the Same Step That Writes Them"
|
|
3
|
+
category: runner-environment
|
|
4
|
+
severity: silent-failure
|
|
5
|
+
tags:
|
|
6
|
+
- GITHUB_PATH
|
|
7
|
+
- GITHUB_ENV
|
|
8
|
+
- path
|
|
9
|
+
- environment-file
|
|
10
|
+
- command-not-found
|
|
11
|
+
- same-step
|
|
12
|
+
patterns:
|
|
13
|
+
- regex: "command not found"
|
|
14
|
+
flags: "i"
|
|
15
|
+
- regex: "not recognized as.*cmdlet|not recognized as.*function"
|
|
16
|
+
flags: "i"
|
|
17
|
+
- regex: "GITHUB_PATH.*same step|same step.*GITHUB_PATH"
|
|
18
|
+
flags: "i"
|
|
19
|
+
error_messages:
|
|
20
|
+
- "/bin/bash: line X: my-tool: command not found"
|
|
21
|
+
- "The term 'my-tool' is not recognized as the name of a cmdlet, function, script file, or executable program"
|
|
22
|
+
root_cause: |
|
|
23
|
+
When you write a directory path to `$GITHUB_PATH` (or an environment variable to
|
|
24
|
+
`$GITHUB_ENV`), the change is **NOT available in the same `run:` step** that writes
|
|
25
|
+
the file. It only takes effect for **subsequent steps** in the same job.
|
|
26
|
+
|
|
27
|
+
The runner reads the environment files between steps — not mid-step. The typical
|
|
28
|
+
developer mistake is:
|
|
29
|
+
|
|
30
|
+
```yaml
|
|
31
|
+
- name: Install and use tool
|
|
32
|
+
run: |
|
|
33
|
+
echo "$HOME/.local/bin" >> $GITHUB_PATH # writes to GITHUB_PATH
|
|
34
|
+
my-tool --version # ❌ fails — PATH not updated yet
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
The same applies to `$GITHUB_ENV` — variables written to the env file are not
|
|
38
|
+
accessible via `${{ env.VAR }}` or as shell variables in the same step.
|
|
39
|
+
|
|
40
|
+
Additionally, using `>` instead of `>>` to write to `$GITHUB_PATH` or `$GITHUB_ENV`
|
|
41
|
+
overwrites the entire file, wiping all previously set paths/variables and causing
|
|
42
|
+
unexpected "command not found" errors in later steps.
|
|
43
|
+
|
|
44
|
+
Sources: GitHub Community #80916, nektos/act issue #2637, GitHub Docs
|
|
45
|
+
fix: |
|
|
46
|
+
Split the install/configure step from the step that uses the tool. Write to
|
|
47
|
+
`$GITHUB_PATH` or `$GITHUB_ENV` in one step, then use the tool/variable in a
|
|
48
|
+
subsequent step.
|
|
49
|
+
|
|
50
|
+
For the current step only, modify `$PATH` directly in the shell environment
|
|
51
|
+
(not via `$GITHUB_PATH`) if you need immediate access.
|
|
52
|
+
|
|
53
|
+
Always use `>>` (append) when writing to `$GITHUB_PATH` or `$GITHUB_ENV` — never
|
|
54
|
+
`>` (overwrite).
|
|
55
|
+
fix_code:
|
|
56
|
+
- language: yaml
|
|
57
|
+
label: "Broken — tool used in same step as GITHUB_PATH write"
|
|
58
|
+
code: |
|
|
59
|
+
# ❌ BROKEN: my-tool not found because PATH not updated until next step
|
|
60
|
+
- name: Install and use tool
|
|
61
|
+
run: |
|
|
62
|
+
echo "$HOME/.local/bin" >> $GITHUB_PATH
|
|
63
|
+
my-tool --version # fails: command not found
|
|
64
|
+
- language: yaml
|
|
65
|
+
label: "Fixed — split into two steps"
|
|
66
|
+
code: |
|
|
67
|
+
# ✅ FIXED: separate steps so runner reads GITHUB_PATH between them
|
|
68
|
+
- name: Add tool to PATH
|
|
69
|
+
run: echo "$HOME/.local/bin" >> $GITHUB_PATH
|
|
70
|
+
|
|
71
|
+
- name: Use tool (PATH now includes ~/.local/bin)
|
|
72
|
+
run: my-tool --version
|
|
73
|
+
- language: yaml
|
|
74
|
+
label: "Fixed — same-step access via direct PATH export (no GITHUB_PATH)"
|
|
75
|
+
code: |
|
|
76
|
+
# ✅ ALTERNATIVE: Export PATH directly in the same step if splitting isn't possible
|
|
77
|
+
- name: Install and use tool in same step
|
|
78
|
+
run: |
|
|
79
|
+
export PATH="$HOME/.local/bin:$PATH" # takes effect immediately in this step
|
|
80
|
+
my-tool --version
|
|
81
|
+
# Also persist for later steps:
|
|
82
|
+
echo "$HOME/.local/bin" >> $GITHUB_PATH
|
|
83
|
+
- language: yaml
|
|
84
|
+
label: "Fixed — GITHUB_ENV: split the set and the use"
|
|
85
|
+
code: |
|
|
86
|
+
# ❌ BROKEN: Variable not available yet in same step
|
|
87
|
+
- run: |
|
|
88
|
+
echo "MY_VAR=hello" >> $GITHUB_ENV
|
|
89
|
+
echo "$MY_VAR" # empty — not yet loaded
|
|
90
|
+
|
|
91
|
+
# ✅ FIXED: Use in a later step
|
|
92
|
+
- run: echo "MY_VAR=hello" >> $GITHUB_ENV
|
|
93
|
+
- run: echo "$MY_VAR" # prints 'hello'
|
|
94
|
+
- language: yaml
|
|
95
|
+
label: "Warning — always append (>>) never overwrite (>)"
|
|
96
|
+
code: |
|
|
97
|
+
# ❌ BROKEN: Overwrites GITHUB_PATH, removing all previously set paths
|
|
98
|
+
echo "/new/path" > $GITHUB_PATH
|
|
99
|
+
|
|
100
|
+
# ✅ FIXED: Append to preserve existing entries
|
|
101
|
+
echo "/new/path" >> $GITHUB_PATH
|
|
102
|
+
prevention:
|
|
103
|
+
- "Never use the result of `$GITHUB_PATH` or `$GITHUB_ENV` writes in the same `run:` step — they take effect in the next step."
|
|
104
|
+
- "Always use `>>` (append) not `>` (overwrite) when writing to `$GITHUB_PATH` or `$GITHUB_ENV`."
|
|
105
|
+
- "If you need a tool available in the same step, export `PATH` directly in the shell command: `export PATH=\"/dir:$PATH\"` before calling the tool."
|
|
106
|
+
- "On Windows (PowerShell), use `Add-Content` or `Out-File -Append` — do not use `Set-Content` which overwrites the file."
|
|
107
|
+
- "Check the GitHub Actions docs section on 'environment files' to understand the step boundary at which env files are read."
|
|
108
|
+
docs:
|
|
109
|
+
- url: "https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/workflow-commands-for-github-actions#adding-a-system-path"
|
|
110
|
+
label: "GitHub Docs: Workflow commands — Adding a system path (GITHUB_PATH)"
|
|
111
|
+
- url: "https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/workflow-commands-for-github-actions#setting-an-environment-variable"
|
|
112
|
+
label: "GitHub Docs: Workflow commands — Setting an environment variable (GITHUB_ENV)"
|
|
113
|
+
- url: "https://github.com/orgs/community/discussions/80916"
|
|
114
|
+
label: "GitHub Community #80916 — GITHUB_PATH not available same step"
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
id: runner-environment-047
|
|
2
|
+
title: "actions/github-script@v6 octokit.rest.actions.* Methods Not Available (Stale Octokit Bundle)"
|
|
3
|
+
category: runner-environment
|
|
4
|
+
severity: error
|
|
5
|
+
tags:
|
|
6
|
+
- github-script
|
|
7
|
+
- octokit
|
|
8
|
+
- rest-api
|
|
9
|
+
- variables-api
|
|
10
|
+
- actions-api
|
|
11
|
+
- version-mismatch
|
|
12
|
+
patterns:
|
|
13
|
+
- regex: "github\\.rest\\.actions\\.[a-zA-Z]+ is not a function"
|
|
14
|
+
flags: "i"
|
|
15
|
+
- regex: "TypeError.*github\\.rest\\.actions\\."
|
|
16
|
+
flags: "i"
|
|
17
|
+
- regex: "Unhandled error: TypeError.*github\\.rest\\."
|
|
18
|
+
flags: "i"
|
|
19
|
+
error_messages:
|
|
20
|
+
- "TypeError: github.rest.actions.createRepoVariable is not a function"
|
|
21
|
+
- "TypeError: github.rest.actions.listRepoVariables is not a function"
|
|
22
|
+
- "TypeError: github.rest.actions.getEnvironmentVariable is not a function"
|
|
23
|
+
- "TypeError: github.rest.actions.updateRepoVariable is not a function"
|
|
24
|
+
- "Unhandled error: TypeError: github.rest.actions.createOrUpdateRepoVariable is not a function"
|
|
25
|
+
root_cause: |
|
|
26
|
+
`actions/github-script@v6` bundles `@octokit/plugin-rest-endpoint-methods` v6.3.0, which
|
|
27
|
+
predates GitHub's Variables API endpoints and several other newer REST endpoints added to the
|
|
28
|
+
GitHub API in 2023. These methods were added to the Octokit plugin in v6.8.0+.
|
|
29
|
+
|
|
30
|
+
When a workflow step calls `github.rest.actions.createRepoVariable()`,
|
|
31
|
+
`github.rest.actions.listRepoVariables()`, `github.rest.actions.listEnvironmentVariables()`,
|
|
32
|
+
or other Variables API methods, these functions simply do not exist in the bundled octokit
|
|
33
|
+
inside `github-script@v6`. JavaScript returns `undefined` when accessing the property, and
|
|
34
|
+
attempting to call it throws a `TypeError: X is not a function` that fails the step immediately.
|
|
35
|
+
|
|
36
|
+
The workflow log shows the TypeError and a non-zero exit code. The confusing part is that the
|
|
37
|
+
GitHub REST API itself fully supports these endpoints — the failure is an action version issue,
|
|
38
|
+
not an API permission or token scope issue.
|
|
39
|
+
fix: |
|
|
40
|
+
Upgrade to `actions/github-script@v7`, which ships with a significantly newer version of
|
|
41
|
+
`@octokit/plugin-rest-endpoint-methods` that includes the Variables API and all other
|
|
42
|
+
endpoints added since 2023. As a workaround when staying on v6, use `github.request()`
|
|
43
|
+
with the raw REST endpoint path to call any API method directly, bypassing the typed wrapper.
|
|
44
|
+
fix_code:
|
|
45
|
+
- language: yaml
|
|
46
|
+
label: "Upgrade to github-script@v7 (recommended)"
|
|
47
|
+
code: |
|
|
48
|
+
- uses: actions/github-script@v7 # v7 ships updated @octokit/plugin-rest-endpoint-methods
|
|
49
|
+
with:
|
|
50
|
+
script: |
|
|
51
|
+
await github.rest.actions.createRepoVariable({
|
|
52
|
+
owner: context.repo.owner,
|
|
53
|
+
repo: context.repo.repo,
|
|
54
|
+
name: 'MY_VAR',
|
|
55
|
+
value: 'my-value'
|
|
56
|
+
});
|
|
57
|
+
- language: yaml
|
|
58
|
+
label: "Workaround for v6: use github.request() with raw REST path"
|
|
59
|
+
code: |
|
|
60
|
+
- uses: actions/github-script@v6
|
|
61
|
+
with:
|
|
62
|
+
script: |
|
|
63
|
+
// Use github.request() directly — bypasses the typed wrapper
|
|
64
|
+
await github.request('POST /repos/{owner}/{repo}/actions/variables', {
|
|
65
|
+
owner: context.repo.owner,
|
|
66
|
+
repo: context.repo.repo,
|
|
67
|
+
name: 'MY_VAR',
|
|
68
|
+
value: 'my-value'
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
// List variables example
|
|
72
|
+
const { data } = await github.request(
|
|
73
|
+
'GET /repos/{owner}/{repo}/actions/variables',
|
|
74
|
+
{ owner: context.repo.owner, repo: context.repo.repo }
|
|
75
|
+
);
|
|
76
|
+
console.log(data.variables);
|
|
77
|
+
prevention:
|
|
78
|
+
- "Pin to `actions/github-script@v7` or later for any workflow using Variables API or other endpoints added after mid-2022"
|
|
79
|
+
- "When adding a new `github.rest.*` call, verify the method exists in the action version's bundled octokit before deploying"
|
|
80
|
+
- "Use `github.request()` with raw REST paths as a version-independent fallback for any endpoint call"
|
|
81
|
+
docs:
|
|
82
|
+
- url: "https://github.com/actions/github-script/issues/345"
|
|
83
|
+
label: "actions/github-script#345 — octokit.rest.actions not available"
|
|
84
|
+
- url: "https://github.com/actions/github-script/releases/tag/v7.0.0"
|
|
85
|
+
label: "actions/github-script v7.0.0 release — updated @octokit/plugin-rest-endpoint-methods"
|
|
86
|
+
- url: "https://octokit.github.io/rest.js/v18/#actions"
|
|
87
|
+
label: "Octokit REST.js — actions endpoints reference"
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
id: runner-environment-050
|
|
2
|
+
title: "macOS 13 Runner Deprecated and Removed — Jobs Fail During Brownout Windows"
|
|
3
|
+
category: runner-environment
|
|
4
|
+
severity: error
|
|
5
|
+
tags:
|
|
6
|
+
- macos-13
|
|
7
|
+
- runner-deprecation
|
|
8
|
+
- brownout
|
|
9
|
+
- migration
|
|
10
|
+
- macos-14
|
|
11
|
+
- runner-images
|
|
12
|
+
patterns:
|
|
13
|
+
- regex: "The label 'macos-13' is not present on any runner"
|
|
14
|
+
flags: "i"
|
|
15
|
+
- regex: "No runner matching the specified labels was found.*macos-13"
|
|
16
|
+
flags: "i"
|
|
17
|
+
- regex: "macos-13.*deprecated|deprecated.*macos-13"
|
|
18
|
+
flags: "i"
|
|
19
|
+
- regex: "Request 'macos-13'.*could not be satisfied"
|
|
20
|
+
flags: "i"
|
|
21
|
+
error_messages:
|
|
22
|
+
- "The label 'macos-13' is not present on any runner"
|
|
23
|
+
- "No runner matching the specified labels was found: macos-13"
|
|
24
|
+
root_cause: |
|
|
25
|
+
GitHub deprecated and eventually removed the `macos-13` and `macos-13-xlarge` runner labels
|
|
26
|
+
in 2025 (announced in runner-images#13046). GitHub applied brownout windows before full removal:
|
|
27
|
+
during these windows the macOS 13 label is temporarily unavailable and any job requesting it
|
|
28
|
+
either hangs waiting for a runner or immediately fails with a "label not present" error.
|
|
29
|
+
|
|
30
|
+
After the final retirement date, the label is gone entirely. The retirement schedule followed
|
|
31
|
+
the same brownout → retirement pattern used for Ubuntu 20.04 and Windows 2019.
|
|
32
|
+
|
|
33
|
+
Common workflows affected:
|
|
34
|
+
- iOS/macOS app CI that pinned to `macos-13` for Xcode 15 compatibility
|
|
35
|
+
- Workflows that avoided `macos-14` (Apple Silicon) due to architecture differences
|
|
36
|
+
- Repos that never updated after initially picking `macos-13` at release time
|
|
37
|
+
fix: |
|
|
38
|
+
Migrate `runs-on: macos-13` to a supported macOS label. Recommended choices:
|
|
39
|
+
|
|
40
|
+
- `macos-latest` — automatically follows GitHub's current default (tracks major version bumps)
|
|
41
|
+
- `macos-15` — macOS 15 Sequoia, ARM64 (Apple Silicon), Xcode 16+
|
|
42
|
+
- `macos-14` — macOS 14 Sonoma, ARM64 (Apple Silicon), well-supported
|
|
43
|
+
- `macos-15-intel` or `macos-14-large` — for workflows requiring x86-64 architecture
|
|
44
|
+
|
|
45
|
+
Note: macOS 14+ runners are ARM64 by default. If your build toolchain requires x86-64, use
|
|
46
|
+
an explicitly-labeled Intel variant. Test Homebrew packages, build scripts, and any binary
|
|
47
|
+
tools on the new architecture before fully migrating.
|
|
48
|
+
fix_code:
|
|
49
|
+
- language: yaml
|
|
50
|
+
label: "Migrate from macos-13 to macos-15 (ARM64)"
|
|
51
|
+
code: |
|
|
52
|
+
jobs:
|
|
53
|
+
build:
|
|
54
|
+
# Before: runs-on: macos-13
|
|
55
|
+
runs-on: macos-15 # macOS 15 Sequoia, ARM64, Xcode 16+
|
|
56
|
+
steps:
|
|
57
|
+
- uses: actions/checkout@v4
|
|
58
|
+
- name: Build and test
|
|
59
|
+
run: xcodebuild test -scheme MyApp -destination 'platform=iOS Simulator,name=iPhone 16'
|
|
60
|
+
- language: yaml
|
|
61
|
+
label: "Use macos-latest for automatic version tracking"
|
|
62
|
+
code: |
|
|
63
|
+
jobs:
|
|
64
|
+
build:
|
|
65
|
+
runs-on: macos-latest # tracks GitHub's current recommended version
|
|
66
|
+
steps:
|
|
67
|
+
- uses: actions/checkout@v4
|
|
68
|
+
- name: Build
|
|
69
|
+
run: swift build
|
|
70
|
+
- language: yaml
|
|
71
|
+
label: "Matrix testing across macOS versions"
|
|
72
|
+
code: |
|
|
73
|
+
jobs:
|
|
74
|
+
test:
|
|
75
|
+
strategy:
|
|
76
|
+
matrix:
|
|
77
|
+
os: [macos-14, macos-15]
|
|
78
|
+
runs-on: ${{ matrix.os }}
|
|
79
|
+
steps:
|
|
80
|
+
- uses: actions/checkout@v4
|
|
81
|
+
- run: swift test
|
|
82
|
+
prevention:
|
|
83
|
+
- "Subscribe to runner-images announcements to learn about deprecation timelines before brownout windows start."
|
|
84
|
+
- "Use `macos-latest` when your workflow does not require a specific OS version — it automatically follows GitHub's supported default."
|
|
85
|
+
- "Test on the new image in a feature branch before the official retirement date to catch Xcode, SDK, or toolchain differences."
|
|
86
|
+
- "For x86-64-specific toolchains, check whether an Intel variant label is available before the migration deadline."
|
|
87
|
+
docs:
|
|
88
|
+
- url: "https://github.com/actions/runner-images/issues/13046"
|
|
89
|
+
label: "runner-images#13046 — macOS 13 deprecation and brownout schedule"
|
|
90
|
+
- url: "https://github.com/actions/runner-images/releases"
|
|
91
|
+
label: "runner-images releases — current supported macOS image versions"
|
|
92
|
+
- url: "https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners/about-github-hosted-runners"
|
|
93
|
+
label: "GitHub Docs — supported GitHub-hosted runner labels"
|