@htekdev/actions-debugger 1.0.13 → 1.0.15
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/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/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/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/az-powershell-14-to-15-breaking.yml +108 -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-15-mono-nuget-removed.yml +151 -0
- package/errors/runner-environment/macos-15-xcode-simulator-sdk-policy.yml +141 -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-2204-precached-docker-removed.yml +110 -0
- package/errors/runner-environment/windows-latest-d-drive-removed.yml +104 -0
- package/errors/runner-environment/windows-msvc-ltcg-mixed-image-versions.yml +112 -0
- package/errors/runner-environment/windows-vs2026-cuda-host-compiler-unsupported.yml +145 -0
- package/errors/silent-failures/app-store-ios26-sdk-required.yml +113 -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/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,114 @@
|
|
|
1
|
+
id: permissions-auth-012
|
|
2
|
+
title: "Reusable Workflow Permissions Not Inherited from Caller — Must Be Granted Explicitly"
|
|
3
|
+
category: permissions-auth
|
|
4
|
+
severity: error
|
|
5
|
+
tags:
|
|
6
|
+
- reusable-workflow
|
|
7
|
+
- permissions
|
|
8
|
+
- github-token
|
|
9
|
+
- caller
|
|
10
|
+
- contents
|
|
11
|
+
patterns:
|
|
12
|
+
- regex: "is requesting '([^']+)', but is only allowed '([^']+)'"
|
|
13
|
+
flags: "i"
|
|
14
|
+
- regex: "The workflow.*is requesting.*but is only allowed"
|
|
15
|
+
flags: "i"
|
|
16
|
+
- regex: "Resource not accessible by integration"
|
|
17
|
+
flags: "i"
|
|
18
|
+
error_messages:
|
|
19
|
+
- "The workflow is not valid. .github/workflows/caller.yml: Error calling workflow 'org/repo/.github/workflows/reusable.yml@main'. The workflow 'org/repo/.github/workflows/reusable.yml@main' is requesting 'contents: read', but is only allowed 'contents: none'."
|
|
20
|
+
- "Resource not accessible by integration"
|
|
21
|
+
root_cause: |
|
|
22
|
+
When a workflow calls a reusable workflow using `jobs.<job>.uses`, the called workflow
|
|
23
|
+
runs with a GITHUB_TOKEN whose permissions are the INTERSECTION of:
|
|
24
|
+
1. The permissions declared in the caller workflow (or job)
|
|
25
|
+
2. The permissions the called reusable workflow needs
|
|
26
|
+
|
|
27
|
+
Reusable workflows do NOT automatically inherit the caller's permissions. If the caller
|
|
28
|
+
workflow declares a restrictive permissions block (or relies on repository-default
|
|
29
|
+
read-all), but the reusable workflow declares or needs broader permissions, the call
|
|
30
|
+
fails at validation time with:
|
|
31
|
+
|
|
32
|
+
"The workflow 'X' is requesting 'contents: read', but is only allowed 'contents: none'."
|
|
33
|
+
|
|
34
|
+
This also manifests at runtime as "Resource not accessible by integration" (HTTP 403)
|
|
35
|
+
when the reusable workflow's steps attempt API calls or git operations that require
|
|
36
|
+
permissions not granted by the caller.
|
|
37
|
+
|
|
38
|
+
Common scenarios:
|
|
39
|
+
- Caller explicitly sets `permissions: {}` (no permissions) for security hardening
|
|
40
|
+
- Caller sets only `id-token: write` for OIDC but reusable workflow needs `contents: read`
|
|
41
|
+
- Repository setting "Read and write permissions" is overridden to "Read repository
|
|
42
|
+
contents and packages permissions" at org level, reducing the default token scope
|
|
43
|
+
- Caller passes `secrets: inherit` but forgets to also pass `permissions:`
|
|
44
|
+
|
|
45
|
+
Source: GitHub Community Discussion #52665
|
|
46
|
+
fix: |
|
|
47
|
+
Explicitly grant the required permission scopes in the **caller** workflow, at either
|
|
48
|
+
the workflow level or the specific job level that uses the reusable workflow.
|
|
49
|
+
|
|
50
|
+
To discover which permissions a reusable workflow needs, check its `on.workflow_call`
|
|
51
|
+
declaration or read its steps to see which GitHub API/resource operations it performs.
|
|
52
|
+
|
|
53
|
+
Follow least privilege: grant only what the reusable workflow actually needs, not
|
|
54
|
+
blanket read-all.
|
|
55
|
+
fix_code:
|
|
56
|
+
- language: yaml
|
|
57
|
+
label: "Broken — caller grants no permissions, reusable workflow needs contents"
|
|
58
|
+
code: |
|
|
59
|
+
# ❌ BROKEN: caller sets permissions: {} — reusable workflow inherits none
|
|
60
|
+
name: Release
|
|
61
|
+
on: push
|
|
62
|
+
|
|
63
|
+
permissions: {} # Locks down all permissions — nothing passes through
|
|
64
|
+
|
|
65
|
+
jobs:
|
|
66
|
+
release:
|
|
67
|
+
uses: my-org/shared-workflows/.github/workflows/release.yml@main
|
|
68
|
+
# Error: release.yml requests 'contents: write' but caller allows 'contents: none'
|
|
69
|
+
- language: yaml
|
|
70
|
+
label: "Fixed — grant required scopes explicitly at the job level"
|
|
71
|
+
code: |
|
|
72
|
+
# ✅ FIXED: grant only what the reusable workflow needs
|
|
73
|
+
name: Release
|
|
74
|
+
on: push
|
|
75
|
+
|
|
76
|
+
permissions: {} # Lock down at workflow level for security
|
|
77
|
+
|
|
78
|
+
jobs:
|
|
79
|
+
release:
|
|
80
|
+
permissions:
|
|
81
|
+
contents: write # Required by the reusable workflow for creating releases
|
|
82
|
+
id-token: write # Required for OIDC if the reusable workflow uses it
|
|
83
|
+
uses: my-org/shared-workflows/.github/workflows/release.yml@main
|
|
84
|
+
- language: yaml
|
|
85
|
+
label: "Fixed — grant permissions at workflow level when multiple jobs use reusable workflows"
|
|
86
|
+
code: |
|
|
87
|
+
# ✅ FIXED: grant at workflow level when multiple jobs need the same scopes
|
|
88
|
+
name: CI
|
|
89
|
+
on: [push, pull_request]
|
|
90
|
+
|
|
91
|
+
permissions:
|
|
92
|
+
contents: read # Needed for checkout in reusable workflows
|
|
93
|
+
packages: write # Needed for reusable workflow that publishes packages
|
|
94
|
+
pull-requests: write # Needed for reusable workflow that adds PR comments
|
|
95
|
+
|
|
96
|
+
jobs:
|
|
97
|
+
build:
|
|
98
|
+
uses: my-org/shared-workflows/.github/workflows/build.yml@main
|
|
99
|
+
publish:
|
|
100
|
+
needs: build
|
|
101
|
+
uses: my-org/shared-workflows/.github/workflows/publish.yml@main
|
|
102
|
+
prevention:
|
|
103
|
+
- "Always read the reusable workflow's steps to know which permissions it needs before calling it."
|
|
104
|
+
- "Test reusable workflow calls from a caller with explicit `permissions: {}` first — failures reveal required scopes."
|
|
105
|
+
- "Document required permissions in the reusable workflow's `on.workflow_call` block as comments."
|
|
106
|
+
- "When adding `permissions:` to a caller, remember that declaring ANY permission sets all others to `none` — enumerate every scope you need."
|
|
107
|
+
- "Use job-level `permissions:` rather than workflow-level to apply least-privilege per job."
|
|
108
|
+
docs:
|
|
109
|
+
- url: "https://docs.github.com/en/actions/sharing-automations/reusing-workflows"
|
|
110
|
+
label: "Reusing workflows — permissions and access"
|
|
111
|
+
- url: "https://github.com/orgs/community/discussions/52665"
|
|
112
|
+
label: "GitHub Community #52665 — reusable workflow permissions"
|
|
113
|
+
- url: "https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/controlling-permissions-for-github_token"
|
|
114
|
+
label: "Controlling permissions for GITHUB_TOKEN"
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
id: runner-environment-034
|
|
2
|
+
title: "Azure PowerShell Az Module Upgraded from 14.x to 15.x on All Runner Images"
|
|
3
|
+
category: runner-environment
|
|
4
|
+
severity: error
|
|
5
|
+
tags:
|
|
6
|
+
- azure
|
|
7
|
+
- powershell
|
|
8
|
+
- az-module
|
|
9
|
+
- breaking-change
|
|
10
|
+
- runner-image
|
|
11
|
+
- migration
|
|
12
|
+
patterns:
|
|
13
|
+
- regex: "Az\\.(?:Accounts|Compute|Storage|Network|Resources|KeyVault|Sql|Monitor).*not recognized|The term '.*-Az.*' is not recognized"
|
|
14
|
+
flags: "i"
|
|
15
|
+
- regex: "Install-Module.*Az.*RequiredVersion.*14"
|
|
16
|
+
flags: "i"
|
|
17
|
+
- regex: "Get-AzVM|Set-AzVMExtension|New-AzResourceGroup.*parameter.*was not found|does not exist in the cmdlet"
|
|
18
|
+
flags: "i"
|
|
19
|
+
- regex: "CommandNotFoundException.*Az\\.|ParameterBindingException.*Az\\."
|
|
20
|
+
flags: "i"
|
|
21
|
+
error_messages:
|
|
22
|
+
- "The term 'Get-AzXxx' is not recognized as a name of a cmdlet"
|
|
23
|
+
- "A parameter cannot be found that matches parameter name"
|
|
24
|
+
- "Cannot process argument transformation on parameter"
|
|
25
|
+
- "Object reference not set to an instance of an object"
|
|
26
|
+
root_cause: |
|
|
27
|
+
The Azure PowerShell (Az) module was upgraded from version 14.6.0 to 15.6.1 on all
|
|
28
|
+
GitHub-hosted runner images beginning June 8, 2026 (completing June 15, 2026).
|
|
29
|
+
This is a major version bump (14 → 15) and includes breaking changes:
|
|
30
|
+
|
|
31
|
+
- **Removed cmdlets**: Several deprecated cmdlets from Az 14.x were dropped with no
|
|
32
|
+
backward-compatible alias.
|
|
33
|
+
- **Parameter changes**: Some cmdlets have altered parameter names, types, or
|
|
34
|
+
removed optional parameters that were previously accepted.
|
|
35
|
+
- **Output type changes**: Return objects from certain cmdlets have changed shape,
|
|
36
|
+
breaking pipeline expressions like `(Get-AzXxx).Property`.
|
|
37
|
+
- **ARM64 images affected disproportionately**: windows-11-arm64 and
|
|
38
|
+
windows-11-vs2026-arm64 jumped from Az 12.5.0 directly to 15.6.1 — a 3-major-version
|
|
39
|
+
leap with significantly more accumulated breaking changes.
|
|
40
|
+
|
|
41
|
+
Unlike other software installed on runner images, the Az PowerShell module does NOT
|
|
42
|
+
have an LTS version — only the latest release receives security fixes and support.
|
|
43
|
+
Microsoft discontinued support for Az 14.x as of the 15.x release cycle.
|
|
44
|
+
|
|
45
|
+
The runner images affected and their before/after versions:
|
|
46
|
+
- ubuntu-22.04, ubuntu-24.04, macos-14/15/26, windows-2022/2025/2025-vs2026: 14.6.0 → 15.6.1
|
|
47
|
+
- windows-11-arm64, windows-11-vs2026-arm64: 12.5.0 → 15.6.1
|
|
48
|
+
|
|
49
|
+
Source: actions/runner-images#14104
|
|
50
|
+
fix: |
|
|
51
|
+
**Option 1 — Pin to Az 14.6.0** (temporary fix while migrating):
|
|
52
|
+
Add an explicit Install-Module step at the start of any job using Az cmdlets.
|
|
53
|
+
|
|
54
|
+
**Option 2 — Migrate to Az 15.x** (recommended long-term):
|
|
55
|
+
Review the Az 15.x migration guide and update scripts to use the new cmdlet names,
|
|
56
|
+
parameters, and output types. Run `Get-AzVersion` to confirm the version in use.
|
|
57
|
+
|
|
58
|
+
**Diagnosis**: Use `Get-Module -Name Az.* -ListAvailable | Select Name, Version` to
|
|
59
|
+
confirm which Az module version is installed on the current runner.
|
|
60
|
+
fix_code:
|
|
61
|
+
- language: yaml
|
|
62
|
+
label: "Pin Az module to 14.6.0 for immediate rollback"
|
|
63
|
+
code: |
|
|
64
|
+
jobs:
|
|
65
|
+
deploy:
|
|
66
|
+
runs-on: ubuntu-latest
|
|
67
|
+
steps:
|
|
68
|
+
- name: Pin Azure PowerShell to 14.6.0
|
|
69
|
+
shell: pwsh
|
|
70
|
+
run: |
|
|
71
|
+
Install-Module -Name Az -RequiredVersion 14.6.0 -Force -AllowClobber -Scope CurrentUser
|
|
72
|
+
Import-Module Az -RequiredVersion 14.6.0
|
|
73
|
+
|
|
74
|
+
- name: Azure login
|
|
75
|
+
uses: azure/login@v2
|
|
76
|
+
with:
|
|
77
|
+
client-id: ${{ secrets.AZURE_CLIENT_ID }}
|
|
78
|
+
tenant-id: ${{ secrets.AZURE_TENANT_ID }}
|
|
79
|
+
subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
|
|
80
|
+
|
|
81
|
+
- name: Run Azure operations
|
|
82
|
+
shell: pwsh
|
|
83
|
+
run: |
|
|
84
|
+
# Your existing Az 14.x scripts
|
|
85
|
+
Get-AzVM -ResourceGroupName $env:RG_NAME
|
|
86
|
+
- language: yaml
|
|
87
|
+
label: "Verify installed Az version (diagnosis step)"
|
|
88
|
+
code: |
|
|
89
|
+
- name: Check Az module version
|
|
90
|
+
shell: pwsh
|
|
91
|
+
run: |
|
|
92
|
+
Get-Module -Name Az.Accounts -ListAvailable | Select-Object Name, Version
|
|
93
|
+
Get-AzVersion
|
|
94
|
+
prevention:
|
|
95
|
+
- "Subscribe to actions/runner-images announcements to get advance warning of Az module version changes."
|
|
96
|
+
- "Pin the Az module version explicitly in all CI workflows using `Install-Module -RequiredVersion` rather than relying on the runner image default."
|
|
97
|
+
- "Test Az-based workflows against the new version by temporarily installing Az 15.x before the runner image rollout date."
|
|
98
|
+
- "Review the Az 15.x migration guide (https://learn.microsoft.com/en-us/powershell/azure/migrate-az-15.0.0) when upgrading."
|
|
99
|
+
- "Use `Get-AzVersion` at the start of troublesome workflows to emit the exact Az version to logs."
|
|
100
|
+
docs:
|
|
101
|
+
- url: "https://github.com/actions/runner-images/issues/14104"
|
|
102
|
+
label: "runner-images#14104 — Az module update announcement (14.6.0 → 15.6.1)"
|
|
103
|
+
- url: "https://learn.microsoft.com/en-us/powershell/azure/migrate-az-15.0.0"
|
|
104
|
+
label: "Az 15.x migration guide"
|
|
105
|
+
- url: "https://learn.microsoft.com/en-us/powershell/azure/azureps-support-lifecycle"
|
|
106
|
+
label: "Az PowerShell support lifecycle"
|
|
107
|
+
- url: "https://learn.microsoft.com/en-us/powershell/azure/release-notes-azureps"
|
|
108
|
+
label: "Az PowerShell release notes"
|
|
@@ -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"
|