@htekdev/actions-debugger 1.0.23 → 1.0.24
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/errors/caching-artifacts/artifact-minimum-retention-one-day.yml +153 -0
- package/errors/caching-artifacts/cache-api-propagation-delay-post-save.yml +128 -0
- package/errors/caching-artifacts/cache-backend-internal-error-skipped.yml +75 -0
- package/errors/caching-artifacts/cache-hit-step-id-case-sensitive-mismatch.yml +95 -0
- package/errors/caching-artifacts/cache-save-post-step-skipped-on-failure.yml +114 -0
- package/errors/concurrency-timing/deploy-pages-in-progress-deployment-wedged.yml +70 -0
- package/errors/concurrency-timing/deployment-review-timeout-expired.yml +88 -0
- package/errors/concurrency-timing/job-concurrency-scope-per-run-not-global.yml +81 -0
- package/errors/concurrency-timing/merge-queue-concurrency-cancel-blocks-all.yml +86 -0
- package/errors/concurrency-timing/reusable-workflow-github-workflow-context-cancel.yml +124 -0
- package/errors/concurrency-timing/runner-scale-set-jobs-never-start.yml +123 -0
- package/errors/concurrency-timing/runner-temp-dir-race-concurrent-workers.yml +90 -0
- package/errors/known-unsolved/artifact-download-url-unauthenticated-404.yml +98 -0
- package/errors/known-unsolved/checkout-v6-credentials-docker-run-manual.yml +105 -0
- package/errors/known-unsolved/concurrency-groups-repo-scoped-only.yml +138 -0
- package/errors/known-unsolved/matrix-256-job-limit.yml +142 -0
- package/errors/known-unsolved/merge-group-paths-filter-not-supported.yml +137 -0
- package/errors/known-unsolved/no-job-allow-failure.yml +73 -0
- package/errors/known-unsolved/schedule-cron-hours-long-queue-drift.yml +101 -0
- package/errors/permissions-auth/checkout-persist-credentials-token-write.yml +90 -0
- package/errors/permissions-auth/create-github-app-token-cross-job-token-revoked.yml +95 -0
- package/errors/permissions-auth/github-token-contents-write-missing-git-push.yml +117 -0
- package/errors/permissions-auth/org-actions-policy-blocks-unapproved-action.yml +106 -0
- package/errors/runner-environment/codeql-action-v2-deprecated.yml +110 -0
- package/errors/runner-environment/macos-26-openssl-3-system-library-breaking.yml +114 -0
- package/errors/runner-environment/macos-26-ruby-34-default-upgrade.yml +114 -0
- package/errors/runner-environment/macos-26-xcode-default-265-pin-required.yml +99 -0
- package/errors/runner-environment/macos-latest-label-switches-to-macos26.yml +127 -0
- package/errors/runner-environment/node20-removed-toolcache-default-node22.yml +104 -0
- package/errors/runner-environment/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/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,76 @@
|
|
|
1
|
+
id: runner-environment-074
|
|
2
|
+
title: "setup-node Does Not Install Yarn on Self-Hosted Runners"
|
|
3
|
+
category: runner-environment
|
|
4
|
+
severity: error
|
|
5
|
+
tags:
|
|
6
|
+
- setup-node
|
|
7
|
+
- yarn
|
|
8
|
+
- self-hosted-runner
|
|
9
|
+
- package-manager
|
|
10
|
+
- corepack
|
|
11
|
+
patterns:
|
|
12
|
+
- regex: "yarn.*command not found|command not found.*yarn"
|
|
13
|
+
flags: "i"
|
|
14
|
+
- regex: "yarn: not found|sh.*yarn.*127"
|
|
15
|
+
flags: "i"
|
|
16
|
+
error_messages:
|
|
17
|
+
- "yarn: command not found"
|
|
18
|
+
- "/bin/sh: 1: yarn: not found"
|
|
19
|
+
- "Process completed with exit code 127"
|
|
20
|
+
root_cause: |
|
|
21
|
+
`actions/setup-node` does NOT install Yarn on self-hosted runners. On GitHub-hosted runners,
|
|
22
|
+
Yarn is pre-installed as part of the runner image (included in ubuntu-22.04, ubuntu-24.04,
|
|
23
|
+
macOS, and Windows hosted images). When migrating to self-hosted runners, workflows that call
|
|
24
|
+
`yarn install` fail with `yarn: command not found` (exit code 127) because the binary is absent.
|
|
25
|
+
|
|
26
|
+
The action provides `cache: 'yarn'` to restore cached modules and registry URL configuration,
|
|
27
|
+
but does NOT bootstrap the Yarn binary itself. As of Node.js 16+, Yarn v2+ (Berry) is distributed
|
|
28
|
+
via Corepack, but Corepack shims are disabled by default in Node.js — setup-node@v4 requires
|
|
29
|
+
explicit `enable-corepack: true` to activate them.
|
|
30
|
+
|
|
31
|
+
159 reactions on actions/setup-node#182 (open since Dec 2021).
|
|
32
|
+
fix: |
|
|
33
|
+
Option A (Yarn v1): Install Yarn explicitly via npm in a dedicated step before using it.
|
|
34
|
+
Option B (Yarn v2/v3/v4 Berry): Enable Corepack via setup-node's `enable-corepack: true`
|
|
35
|
+
input together with a `packageManager` field in package.json specifying the exact Yarn version.
|
|
36
|
+
Option C: Use `volta-cli/action` or a custom self-hosted runner image with Yarn pre-installed.
|
|
37
|
+
fix_code:
|
|
38
|
+
- language: yaml
|
|
39
|
+
label: "Option A: install Yarn v1 explicitly (compatible with all self-hosted runners)"
|
|
40
|
+
code: |
|
|
41
|
+
steps:
|
|
42
|
+
- uses: actions/checkout@v4
|
|
43
|
+
- uses: actions/setup-node@v4
|
|
44
|
+
with:
|
|
45
|
+
node-version: '20'
|
|
46
|
+
cache: 'yarn'
|
|
47
|
+
- name: Install Yarn
|
|
48
|
+
run: npm install -g yarn@1
|
|
49
|
+
- name: Install dependencies
|
|
50
|
+
run: yarn install --frozen-lockfile
|
|
51
|
+
|
|
52
|
+
- language: yaml
|
|
53
|
+
label: "Option B: enable Corepack for Yarn v2+ (requires packageManager in package.json)"
|
|
54
|
+
code: |
|
|
55
|
+
# Requires package.json to include: "packageManager": "yarn@4.x.x"
|
|
56
|
+
steps:
|
|
57
|
+
- uses: actions/checkout@v4
|
|
58
|
+
- uses: actions/setup-node@v4
|
|
59
|
+
with:
|
|
60
|
+
node-version: '20'
|
|
61
|
+
enable-corepack: true # activates Corepack shims including the yarn binary
|
|
62
|
+
cache: 'yarn'
|
|
63
|
+
- name: Install dependencies
|
|
64
|
+
run: yarn install --immutable
|
|
65
|
+
prevention:
|
|
66
|
+
- "On self-hosted runners, never assume GitHub-hosted image tools are pre-installed — audit all tool dependencies."
|
|
67
|
+
- "Explicitly install or activate package managers (yarn, pnpm, bun) in workflow setup steps."
|
|
68
|
+
- "Use enable-corepack: true in setup-node@v4 for Yarn v2+ projects with packageManager in package.json."
|
|
69
|
+
- "Consider maintaining a custom self-hosted runner image with required package managers pre-installed."
|
|
70
|
+
docs:
|
|
71
|
+
- url: "https://github.com/actions/setup-node/issues/182"
|
|
72
|
+
label: "actions/setup-node #182 — Yarn not installed on self-hosted runners (159 reactions)"
|
|
73
|
+
- url: "https://github.com/actions/setup-node#corepack"
|
|
74
|
+
label: "setup-node — Corepack support documentation"
|
|
75
|
+
- url: "https://yarnpkg.com/corepack"
|
|
76
|
+
label: "Yarn — Corepack installation guide"
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
id: "runner-environment-073"
|
|
2
|
+
title: "pip install fails with externally-managed-environment on Ubuntu 22.04/24.04"
|
|
3
|
+
category: "runner-environment"
|
|
4
|
+
severity: "error"
|
|
5
|
+
tags:
|
|
6
|
+
- "python"
|
|
7
|
+
- "pip"
|
|
8
|
+
- "ubuntu-2204"
|
|
9
|
+
- "ubuntu-2404"
|
|
10
|
+
- "pep668"
|
|
11
|
+
- "virtualenv"
|
|
12
|
+
patterns:
|
|
13
|
+
- regex: "error: externally-managed-environment"
|
|
14
|
+
flags: "i"
|
|
15
|
+
- regex: "This environment is externally managed"
|
|
16
|
+
flags: "i"
|
|
17
|
+
- regex: "To install Python packages system-wide, try apt-get install"
|
|
18
|
+
flags: "i"
|
|
19
|
+
error_messages:
|
|
20
|
+
- "error: externally-managed-environment"
|
|
21
|
+
- "× This environment is externally managed"
|
|
22
|
+
- "╰─> To install Python packages system-wide, try apt-get install python3-xyz"
|
|
23
|
+
- "hint: See PEP 668 for the detailed specification of this behavior."
|
|
24
|
+
root_cause: |
|
|
25
|
+
PEP 668 (adopted in Python 3.11) marks system-managed Python installations as
|
|
26
|
+
"externally managed" to prevent pip from overwriting OS package manager state.
|
|
27
|
+
Ubuntu 22.04 and 24.04 runner images ship with a system Python 3.10/3.12 that
|
|
28
|
+
carries this marker, and newer versions of pip (>=22.3) enforce it.
|
|
29
|
+
|
|
30
|
+
Workflows that run bare `pip install` or `pip install -r requirements.txt` against
|
|
31
|
+
the system interpreter fail with this error. The issue did not exist on ubuntu-20.04
|
|
32
|
+
(Python 3.8) and began appearing when teams migrated to ubuntu-22.04 or ubuntu-latest
|
|
33
|
+
(which moved to ubuntu-24.04 in May 2025).
|
|
34
|
+
|
|
35
|
+
Even when setup-python is used, if the step that runs pip install activates the wrong
|
|
36
|
+
interpreter (e.g., the system Python instead of the toolcache one), the same error
|
|
37
|
+
occurs. This often happens when shell scripts or Makefiles call `python3` directly.
|
|
38
|
+
fix: |
|
|
39
|
+
Option 1 (preferred): Use a virtual environment so pip installs into an isolated,
|
|
40
|
+
non-system directory that is not subject to the externally-managed restriction.
|
|
41
|
+
|
|
42
|
+
Option 2: Pin setup-python@v5 to your required version; its toolcache interpreter
|
|
43
|
+
is not marked as externally managed and accepts pip installs freely.
|
|
44
|
+
|
|
45
|
+
Option 3 (quick fix, not recommended for production): Pass --break-system-packages.
|
|
46
|
+
fix_code:
|
|
47
|
+
- language: yaml
|
|
48
|
+
label: "Use a virtual environment (recommended)"
|
|
49
|
+
code: |
|
|
50
|
+
- uses: actions/setup-python@v5
|
|
51
|
+
with:
|
|
52
|
+
python-version: '3.12'
|
|
53
|
+
|
|
54
|
+
- name: Create virtualenv and install
|
|
55
|
+
run: |
|
|
56
|
+
python -m venv .venv
|
|
57
|
+
source .venv/bin/activate # Linux/macOS
|
|
58
|
+
# .venv\Scripts\activate # Windows
|
|
59
|
+
pip install -r requirements.txt
|
|
60
|
+
|
|
61
|
+
- name: Run with virtualenv active
|
|
62
|
+
run: |
|
|
63
|
+
source .venv/bin/activate
|
|
64
|
+
pytest
|
|
65
|
+
|
|
66
|
+
- language: yaml
|
|
67
|
+
label: "Use setup-python toolcache interpreter (pip installs without restriction)"
|
|
68
|
+
code: |
|
|
69
|
+
- uses: actions/setup-python@v5
|
|
70
|
+
with:
|
|
71
|
+
python-version: '3.12'
|
|
72
|
+
cache: 'pip'
|
|
73
|
+
|
|
74
|
+
- name: Install dependencies
|
|
75
|
+
run: pip install -r requirements.txt # uses toolcache Python, not system Python
|
|
76
|
+
|
|
77
|
+
- language: yaml
|
|
78
|
+
label: "Quick fix: --break-system-packages (not recommended)"
|
|
79
|
+
code: |
|
|
80
|
+
- name: Install dependencies
|
|
81
|
+
run: pip install --break-system-packages -r requirements.txt
|
|
82
|
+
prevention:
|
|
83
|
+
- "Always activate setup-python before any pip install call to use the toolcache interpreter instead of system Python."
|
|
84
|
+
- "Use virtual environments in CI workflows, especially when migrating from ubuntu-20.04 to 22.04/24.04."
|
|
85
|
+
- "Audit Makefiles and shell scripts that call 'python3' directly — they may bypass setup-python's PATH manipulation."
|
|
86
|
+
- "Run your workflow on ubuntu-22.04 or ubuntu-24.04 in a test branch before migrating from ubuntu-20.04."
|
|
87
|
+
docs:
|
|
88
|
+
- url: "https://peps.python.org/pep-0668/"
|
|
89
|
+
label: "PEP 668 — Marking Python base environments as externally managed"
|
|
90
|
+
- url: "https://github.com/actions/setup-python/issues/1280"
|
|
91
|
+
label: "actions/setup-python#1280 — externally-managed-environment discussion"
|
|
92
|
+
- url: "https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners#supported-software"
|
|
93
|
+
label: "GitHub Docs — Supported software on GitHub-hosted runners"
|
|
94
|
+
- url: "https://github.com/actions/runner-images/issues/11101"
|
|
95
|
+
label: "runner-images#11101 — Ubuntu 20.04 retirement tracking issue"
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
id: runner-environment-065
|
|
2
|
+
title: "Windows 2019 Runner Retired — Jobs Fail After June 30, 2025"
|
|
3
|
+
category: runner-environment
|
|
4
|
+
severity: error
|
|
5
|
+
tags:
|
|
6
|
+
- windows-2019
|
|
7
|
+
- runner-retirement
|
|
8
|
+
- deprecated
|
|
9
|
+
- windows
|
|
10
|
+
- runner-label
|
|
11
|
+
- brownout
|
|
12
|
+
patterns:
|
|
13
|
+
- regex: "windows-2019.*no longer supported"
|
|
14
|
+
flags: "i"
|
|
15
|
+
- regex: "runs-on.*windows-2019.*deprecated"
|
|
16
|
+
flags: "i"
|
|
17
|
+
- regex: "The windows-2019 runner image is no longer supported"
|
|
18
|
+
flags: "i"
|
|
19
|
+
- regex: "Error.*windows-2019.*not available"
|
|
20
|
+
flags: "i"
|
|
21
|
+
error_messages:
|
|
22
|
+
- "Error: The windows-2019 runner image is no longer supported. Migrate to windows-2022 or windows-2025."
|
|
23
|
+
- "##[error]Job failed: The runner image 'windows-2019' is deprecated and no longer supported."
|
|
24
|
+
- "Windows Server 2019 is no longer supported as a GitHub Actions runner image."
|
|
25
|
+
root_cause: |
|
|
26
|
+
The `windows-2019` runner image was retired by GitHub Actions on June 30, 2025
|
|
27
|
+
(runner-images#12045). Deprecation brownouts began June 1, 2025, during which
|
|
28
|
+
jobs using `windows-2019` would temporarily fail during scheduled brownout
|
|
29
|
+
windows (June 3, 10, 17, 24 — 13:00–21:00 UTC). After June 30, 2025, the
|
|
30
|
+
image was fully unsupported and jobs using `runs-on: windows-2019` fail
|
|
31
|
+
immediately with no runner available.
|
|
32
|
+
|
|
33
|
+
Windows Server 2019 reached End of Mainstream Support from Microsoft on
|
|
34
|
+
January 9, 2024, making it untenable as a CI runner image for security
|
|
35
|
+
and support reasons.
|
|
36
|
+
|
|
37
|
+
Key differences that may require migration work:
|
|
38
|
+
- Windows 2022 and 2025 use Visual Studio 2022 and VS 2026 respectively
|
|
39
|
+
(windows-2019 had Visual Studio 2019). MSBuild project compatibility,
|
|
40
|
+
compiler toolset versions, and SDK paths differ.
|
|
41
|
+
- Some pre-installed tools (e.g., specific .NET Framework versions, MSVC
|
|
42
|
+
compiler toolsets, legacy SDK components) were present on windows-2019
|
|
43
|
+
but not on windows-2022 or windows-2025.
|
|
44
|
+
- Windows Server 2025 images include Windows PowerShell 5.1 and
|
|
45
|
+
PowerShell 7.x; path behaviors for Windows-specific paths may differ.
|
|
46
|
+
fix: |
|
|
47
|
+
Migrate runs-on: windows-2019 to runs-on: windows-2022 or windows-2025:
|
|
48
|
+
|
|
49
|
+
1. **windows-2022** (recommended for most teams): Includes VS 2022,
|
|
50
|
+
.NET 6/7/8 LTS, and the same tool catalog as windows-2019 minus
|
|
51
|
+
legacy VS 2019 components. Most projects migrate with no changes.
|
|
52
|
+
|
|
53
|
+
2. **windows-2025** (latest, includes VS 2026): Best for projects
|
|
54
|
+
requiring the latest MSVC toolchain, Windows 11 APIs, or ARM64
|
|
55
|
+
development. Note that windows-latest now points to this image.
|
|
56
|
+
|
|
57
|
+
3. **Check MSBuild ToolsVersion**: If your project uses MSBuild with
|
|
58
|
+
explicit ToolsVersion="15.0" or "16.0" references, update to
|
|
59
|
+
ToolsVersion="Current" or leave it unspecified to use the
|
|
60
|
+
installed version.
|
|
61
|
+
|
|
62
|
+
4. **Verify .NET SDK availability**: Confirm the .NET SDK version your
|
|
63
|
+
project needs is available on the target image by checking the
|
|
64
|
+
published software inventory for windows-2022 or windows-2025.
|
|
65
|
+
fix_code:
|
|
66
|
+
- language: yaml
|
|
67
|
+
label: "Migrate from windows-2019 to windows-2022"
|
|
68
|
+
code: |
|
|
69
|
+
jobs:
|
|
70
|
+
build:
|
|
71
|
+
# windows-2019 is RETIRED as of June 30, 2025
|
|
72
|
+
# runs-on: windows-2019 ← no longer supported
|
|
73
|
+
runs-on: windows-2022 # VS 2022, .NET 8 LTS pre-installed
|
|
74
|
+
steps:
|
|
75
|
+
- uses: actions/checkout@v4
|
|
76
|
+
- name: Build
|
|
77
|
+
run: msbuild MyProject.sln /p:Configuration=Release
|
|
78
|
+
- language: yaml
|
|
79
|
+
label: "Migrate to windows-2025 with VS 2026 (latest)"
|
|
80
|
+
code: |
|
|
81
|
+
jobs:
|
|
82
|
+
build:
|
|
83
|
+
runs-on: windows-2025 # Windows Server 2025, VS 2026
|
|
84
|
+
steps:
|
|
85
|
+
- uses: actions/checkout@v4
|
|
86
|
+
- name: Setup .NET
|
|
87
|
+
uses: actions/setup-dotnet@v4
|
|
88
|
+
with:
|
|
89
|
+
dotnet-version: '8.x'
|
|
90
|
+
- name: Build
|
|
91
|
+
run: dotnet build --configuration Release
|
|
92
|
+
- language: yaml
|
|
93
|
+
label: "Matrix to test windows-2022 and windows-2025 before committing"
|
|
94
|
+
code: |
|
|
95
|
+
jobs:
|
|
96
|
+
build:
|
|
97
|
+
strategy:
|
|
98
|
+
matrix:
|
|
99
|
+
os: [windows-2022, windows-2025]
|
|
100
|
+
fail-fast: false
|
|
101
|
+
runs-on: ${{ matrix.os }}
|
|
102
|
+
steps:
|
|
103
|
+
- uses: actions/checkout@v4
|
|
104
|
+
- run: msbuild MyProject.sln
|
|
105
|
+
prevention:
|
|
106
|
+
- "Avoid pinning to specific OS-versioned runner labels (windows-2019, ubuntu-20.04) in long-lived workflows — add a review calendar reminder every 12 months to check for upcoming deprecations."
|
|
107
|
+
- "Subscribe to GitHub notifications for the actions/runner-images repository to receive deprecation announcements months before retirement."
|
|
108
|
+
- "Use `windows-latest` for flexibility where VS version compatibility isn't critical — it automatically tracks the current supported image."
|
|
109
|
+
- "After migrating, run the full test suite and check compiler/toolchain version outputs in CI to catch any implicit behavior differences."
|
|
110
|
+
docs:
|
|
111
|
+
- url: "https://github.com/actions/runner-images/issues/12045"
|
|
112
|
+
label: "runner-images #12045: Windows 2019 deprecation announcement (June 2025)"
|
|
113
|
+
- url: "https://github.com/actions/runner-images/blob/main/images/windows/Windows2022-Readme.md"
|
|
114
|
+
label: "Windows Server 2022 runner software inventory"
|
|
115
|
+
- url: "https://github.com/actions/runner-images/blob/main/images/windows/Windows2025-Readme.md"
|
|
116
|
+
label: "Windows Server 2025 runner software inventory"
|
|
117
|
+
- url: "https://docs.github.com/en/actions/using-github-hosted-runners/using-github-hosted-runners/about-github-hosted-runners"
|
|
118
|
+
label: "GitHub Docs: About GitHub-hosted runners — available images"
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
id: runner-environment-069
|
|
2
|
+
title: "Windows 2022 Runner Docker Engine Named Pipe Not Found on Start"
|
|
3
|
+
category: runner-environment
|
|
4
|
+
severity: error
|
|
5
|
+
tags:
|
|
6
|
+
- windows
|
|
7
|
+
- docker
|
|
8
|
+
- runner-image
|
|
9
|
+
- intermittent
|
|
10
|
+
- named-pipe
|
|
11
|
+
patterns:
|
|
12
|
+
- regex: "failed to connect to the docker API at npipe:////\\.?/pipe/docker_engine"
|
|
13
|
+
flags: "i"
|
|
14
|
+
- regex: "open //\\.?/pipe/docker_engine.*The system cannot find the file specified"
|
|
15
|
+
flags: "i"
|
|
16
|
+
- regex: "error during connect.*pipe/docker_engine.*daemon running"
|
|
17
|
+
flags: "i"
|
|
18
|
+
- regex: "Docker Engine.*Stopped|docker.*service.*not running"
|
|
19
|
+
flags: "i"
|
|
20
|
+
error_messages:
|
|
21
|
+
- "failed to connect to the docker API at npipe:////./pipe/docker_engine; check if the path is correct and if the daemon is running: open //./pipe/docker_engine: The system cannot find the file specified."
|
|
22
|
+
- "error during connect: Get \"http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.45/info\": open //./pipe/docker_engine: The system cannot find the file specified."
|
|
23
|
+
root_cause: |
|
|
24
|
+
On GitHub-hosted `windows-2022` runners, the Docker Engine service occasionally
|
|
25
|
+
fails to start before the workflow job begins. The Docker Engine runs as a Windows
|
|
26
|
+
service (`docker`) and the runner sometimes starts executing job steps before the
|
|
27
|
+
service has fully initialized and opened its named pipe at `//./pipe/docker_engine`.
|
|
28
|
+
|
|
29
|
+
This is an intermittent race condition between the runner agent startup and the
|
|
30
|
+
Docker Engine service startup sequence. The issue was reported in February 2026
|
|
31
|
+
(runner-images#13729) and confirmed to affect `windows-2022` at ~50% frequency
|
|
32
|
+
for some users. The `windows-2025` image is less affected.
|
|
33
|
+
|
|
34
|
+
The Docker Engine service shows `Status: Stopped` when queried immediately after
|
|
35
|
+
the runner starts. Manually starting the service (via `Start-Service docker`)
|
|
36
|
+
resolves the issue for that run. Job reruns also frequently succeed because they
|
|
37
|
+
land on a fresh host with Docker already running.
|
|
38
|
+
fix: |
|
|
39
|
+
Add a step early in your job to verify Docker is running and start it if not:
|
|
40
|
+
|
|
41
|
+
```yaml
|
|
42
|
+
- name: Ensure Docker Engine is running
|
|
43
|
+
shell: pwsh
|
|
44
|
+
run: |
|
|
45
|
+
$service = Get-Service -Name docker -ErrorAction SilentlyContinue
|
|
46
|
+
if ($service.Status -ne 'Running') {
|
|
47
|
+
Start-Service docker
|
|
48
|
+
$timeout = 60
|
|
49
|
+
$elapsed = 0
|
|
50
|
+
while ((Get-Service docker).Status -ne 'Running' -and $elapsed -lt $timeout) {
|
|
51
|
+
Start-Sleep -Seconds 2
|
|
52
|
+
$elapsed += 2
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
docker info
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
If the issue is sporadic, a simpler retry on job failure may suffice. You can
|
|
59
|
+
also switch to `windows-2025` which has a lower incidence of this race condition.
|
|
60
|
+
fix_code:
|
|
61
|
+
- language: yaml
|
|
62
|
+
label: "Guard step — ensure Docker service is running before use"
|
|
63
|
+
code: |
|
|
64
|
+
jobs:
|
|
65
|
+
build:
|
|
66
|
+
runs-on: windows-2022
|
|
67
|
+
steps:
|
|
68
|
+
- uses: actions/checkout@v4
|
|
69
|
+
|
|
70
|
+
- name: Ensure Docker Engine is running
|
|
71
|
+
shell: pwsh
|
|
72
|
+
run: |
|
|
73
|
+
$svc = Get-Service docker -ErrorAction SilentlyContinue
|
|
74
|
+
if ($null -eq $svc -or $svc.Status -ne 'Running') {
|
|
75
|
+
Write-Host "Docker service not running — starting..."
|
|
76
|
+
Start-Service docker
|
|
77
|
+
$deadline = (Get-Date).AddSeconds(60)
|
|
78
|
+
while ((Get-Service docker).Status -ne 'Running') {
|
|
79
|
+
if ((Get-Date) -gt $deadline) { throw "Docker failed to start in 60s" }
|
|
80
|
+
Start-Sleep -Seconds 2
|
|
81
|
+
}
|
|
82
|
+
Write-Host "Docker service started."
|
|
83
|
+
}
|
|
84
|
+
docker info
|
|
85
|
+
|
|
86
|
+
- name: Build Docker image
|
|
87
|
+
run: docker build -t myimage .
|
|
88
|
+
- language: yaml
|
|
89
|
+
label: "Alternative — switch to windows-2025 (less affected)"
|
|
90
|
+
code: |
|
|
91
|
+
jobs:
|
|
92
|
+
build:
|
|
93
|
+
# windows-2025 has a lower frequency of this race condition
|
|
94
|
+
runs-on: windows-2025
|
|
95
|
+
steps:
|
|
96
|
+
- uses: actions/checkout@v4
|
|
97
|
+
- name: Build Docker image
|
|
98
|
+
run: docker build -t myimage .
|
|
99
|
+
prevention:
|
|
100
|
+
- "Add a Docker health-check step before any `docker` commands on Windows runners."
|
|
101
|
+
- "Consider using `windows-2025` which has fewer reports of this race condition."
|
|
102
|
+
- "Enable job reruns — this race condition is intermittent and reruns usually succeed."
|
|
103
|
+
- "Subscribe to runner-images announcements; GitHub is tracking this as a runner startup issue."
|
|
104
|
+
docs:
|
|
105
|
+
- url: "https://github.com/actions/runner-images/issues/13729"
|
|
106
|
+
label: "GitHub Issue: windows-2022 docker not available when runner starts"
|
|
107
|
+
- url: "https://docs.github.com/en/actions/using-github-hosted-runners/using-github-hosted-runners/about-github-hosted-runners#supported-runners-and-hardware-resources"
|
|
108
|
+
label: "About GitHub-hosted runners"
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
id: silent-failures-031
|
|
2
|
+
title: "cache-hit Output Is a String Not a Boolean — Bare true Comparison Always False"
|
|
3
|
+
category: silent-failures
|
|
4
|
+
severity: silent-failure
|
|
5
|
+
tags:
|
|
6
|
+
- actions/cache
|
|
7
|
+
- cache-hit
|
|
8
|
+
- string-comparison
|
|
9
|
+
- boolean-coercion
|
|
10
|
+
- conditional
|
|
11
|
+
- step-outputs
|
|
12
|
+
patterns:
|
|
13
|
+
- regex: "cache-hit\\s*[!=]=\\s*true(?!')"
|
|
14
|
+
flags: "i"
|
|
15
|
+
- regex: "if:\\s+steps\\.\\w+\\.outputs\\.cache-hit\\s*$"
|
|
16
|
+
flags: "im"
|
|
17
|
+
error_messages:
|
|
18
|
+
- "steps.cache.outputs.cache-hit == true"
|
|
19
|
+
- "steps.cache.outputs.cache-hit != true"
|
|
20
|
+
root_cause: |
|
|
21
|
+
The `cache-hit` output from `actions/cache` and `actions/cache/restore` is a **string** value
|
|
22
|
+
(`'true'` or `'false'`), not a native boolean. GitHub Actions expression syntax uses strict
|
|
23
|
+
equality for `==` — there is no implicit type coercion between strings and booleans.
|
|
24
|
+
|
|
25
|
+
This means:
|
|
26
|
+
- `steps.cache.outputs.cache-hit == true` → ALWAYS false (string 'true' ≠ boolean true)
|
|
27
|
+
- `steps.cache.outputs.cache-hit != true` → ALWAYS true (install step always runs)
|
|
28
|
+
- `if: steps.cache.outputs.cache-hit` → ALWAYS true ('false' is a non-empty string)
|
|
29
|
+
|
|
30
|
+
The most destructive case: `if: steps.cache.outputs.cache-hit != true` is intended to
|
|
31
|
+
skip the install step on cache hit, but it always evaluates to `true` (runs every time),
|
|
32
|
+
so the install always runs even after a successful cache restore. Build times remain
|
|
33
|
+
unchanged, no error is shown, and the caching appears to be broken.
|
|
34
|
+
|
|
35
|
+
This applies to ALL GitHub Actions step outputs — they are always strings. A separate
|
|
36
|
+
but related issue is `cache-hit-restore-keys-misleading` (cache-hit is 'true' on partial
|
|
37
|
+
key match); this entry covers the unquoted boolean comparison pattern specifically.
|
|
38
|
+
fix: |
|
|
39
|
+
Always compare `cache-hit` to the string `'true'` with single quotes:
|
|
40
|
+
|
|
41
|
+
- Skip install on cache hit: `if: steps.cache.outputs.cache-hit != 'true'`
|
|
42
|
+
- Confirm cache was used: `if: steps.cache.outputs.cache-hit == 'true'`
|
|
43
|
+
|
|
44
|
+
Do NOT use bare `true` / `false` (without quotes) in comparisons with step outputs.
|
|
45
|
+
Do NOT use `if: steps.cache.outputs.cache-hit` as a truthy check — the string 'false'
|
|
46
|
+
is truthy in most contexts and will always pass.
|
|
47
|
+
fix_code:
|
|
48
|
+
- language: yaml
|
|
49
|
+
label: "Correct string comparison for cache-hit (single quotes required)"
|
|
50
|
+
code: |
|
|
51
|
+
- name: Cache node_modules
|
|
52
|
+
id: cache
|
|
53
|
+
uses: actions/cache@v4
|
|
54
|
+
with:
|
|
55
|
+
path: node_modules
|
|
56
|
+
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
|
|
57
|
+
|
|
58
|
+
# ❌ WRONG: string 'true' != boolean true → always runs (never skips on cache hit)
|
|
59
|
+
- name: Install (broken — always runs)
|
|
60
|
+
if: steps.cache.outputs.cache-hit != true
|
|
61
|
+
run: npm ci
|
|
62
|
+
|
|
63
|
+
# ✅ CORRECT: compare to string 'true' with single quotes
|
|
64
|
+
- name: Install (correct — skips on cache hit)
|
|
65
|
+
if: steps.cache.outputs.cache-hit != 'true'
|
|
66
|
+
run: npm ci
|
|
67
|
+
- language: yaml
|
|
68
|
+
label: "Full cache-then-install pattern with correct comparisons"
|
|
69
|
+
code: |
|
|
70
|
+
- uses: actions/cache@v4
|
|
71
|
+
id: npm-cache
|
|
72
|
+
with:
|
|
73
|
+
path: ~/.npm
|
|
74
|
+
key: ${{ runner.os }}-npm-${{ hashFiles('**/package-lock.json') }}
|
|
75
|
+
restore-keys: |
|
|
76
|
+
${{ runner.os }}-npm-
|
|
77
|
+
|
|
78
|
+
- name: Install dependencies
|
|
79
|
+
if: steps.npm-cache.outputs.cache-hit != 'true'
|
|
80
|
+
run: npm ci
|
|
81
|
+
|
|
82
|
+
- name: Confirm cache was used
|
|
83
|
+
if: steps.npm-cache.outputs.cache-hit == 'true'
|
|
84
|
+
run: echo "Cache hit — install skipped"
|
|
85
|
+
prevention:
|
|
86
|
+
- "Always compare step outputs to string literals with quotes: `== 'true'` not `== true`."
|
|
87
|
+
- "Remember: ALL GitHub Actions step outputs are strings — never native booleans or numbers."
|
|
88
|
+
- "Use `actionlint` to lint workflow YAML; it detects boolean vs string type mismatches in conditionals."
|
|
89
|
+
- "Verify caching is working by observing run time reduction — a successful cache hit noticeably speeds up installs."
|
|
90
|
+
docs:
|
|
91
|
+
- url: "https://github.com/actions/cache#outputs"
|
|
92
|
+
label: "actions/cache README: outputs — cache-hit is a string"
|
|
93
|
+
- url: "https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/contexts#steps-context"
|
|
94
|
+
label: "GitHub Docs: steps context — all outputs are strings"
|
|
95
|
+
- url: "https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/evaluate-expressions-in-workflows-and-actions#operators"
|
|
96
|
+
label: "GitHub Docs: Expression operators — == uses strict equality"
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
id: silent-failures-033
|
|
2
|
+
title: "actions/checkout lfs: true Leaves LFS Pointer Metadata Instead of Actual File Content"
|
|
3
|
+
category: silent-failures
|
|
4
|
+
severity: silent-failure
|
|
5
|
+
tags:
|
|
6
|
+
- checkout
|
|
7
|
+
- git-lfs
|
|
8
|
+
- lfs
|
|
9
|
+
- pointer-file
|
|
10
|
+
- large-file-storage
|
|
11
|
+
- self-hosted
|
|
12
|
+
patterns:
|
|
13
|
+
- regex: "version https://git-lfs\\.github\\.com/spec/v1"
|
|
14
|
+
flags: "i"
|
|
15
|
+
- regex: "oid\\s+sha256:[0-9a-f]{64}"
|
|
16
|
+
flags: "i"
|
|
17
|
+
- regex: "lfs:\\s*true"
|
|
18
|
+
flags: "i"
|
|
19
|
+
error_messages:
|
|
20
|
+
- "version https://git-lfs.github.com/spec/v1"
|
|
21
|
+
- "oid sha256:f23e4c2b1244bc93085dbccf17c447e54..."
|
|
22
|
+
- "size 58951008"
|
|
23
|
+
root_cause: |
|
|
24
|
+
When actions/checkout runs with lfs: true, it configures LFS credentials and
|
|
25
|
+
attempts to download actual file content for LFS-tracked files. However, the
|
|
26
|
+
step can exit 0 (success) while leaving LFS pointer metadata files on disk
|
|
27
|
+
instead of the actual binary or text content.
|
|
28
|
+
|
|
29
|
+
This happens silently in several situations:
|
|
30
|
+
|
|
31
|
+
- Self-hosted runners without git-lfs installed: the LFS fetch is skipped
|
|
32
|
+
because the binary is not present. No error is emitted.
|
|
33
|
+
- LFS bandwidth quota exhausted: GitHub's LFS bandwidth limit (1 GB/month
|
|
34
|
+
free tier) is silently hit; pointer files remain without a clear warning.
|
|
35
|
+
- Private cross-repo LFS: checking out a different repository with lfs: true
|
|
36
|
+
using a token may fail LFS authentication without surfacing an error.
|
|
37
|
+
- Fork pull requests: LFS objects contributed from fork branches may not be
|
|
38
|
+
accessible to the base repository workflow.
|
|
39
|
+
|
|
40
|
+
The result: downstream tools receive a text file starting with
|
|
41
|
+
"version https://git-lfs.github.com/spec/v1" instead of actual content,
|
|
42
|
+
causing opaque failures in build tools, image processors, or test suites.
|
|
43
|
+
fix: |
|
|
44
|
+
Add an explicit LFS fetch step after checkout. On GitHub-hosted runners,
|
|
45
|
+
lfs: true is generally sufficient if LFS is configured on the repository.
|
|
46
|
+
For self-hosted runners, ensure git-lfs is installed before the checkout
|
|
47
|
+
step runs:
|
|
48
|
+
- Ubuntu/Debian: sudo apt-get install git-lfs
|
|
49
|
+
- macOS: brew install git-lfs
|
|
50
|
+
- Windows: winget install GitHub.GitLFS
|
|
51
|
+
|
|
52
|
+
After installation, run the LFS initialization command (git lfs install)
|
|
53
|
+
once per runner to configure the global LFS hooks.
|
|
54
|
+
|
|
55
|
+
To detect unfetched pointer files, add a validation step that checks for
|
|
56
|
+
the LFS pointer header string in files that should contain real content.
|
|
57
|
+
fix_code:
|
|
58
|
+
- language: yaml
|
|
59
|
+
label: "Self-hosted runner — install git-lfs before checkout"
|
|
60
|
+
code: |
|
|
61
|
+
steps:
|
|
62
|
+
- name: Ensure git-lfs is installed
|
|
63
|
+
run: |
|
|
64
|
+
sudo apt-get update -qq
|
|
65
|
+
sudo apt-get install -y git-lfs
|
|
66
|
+
shell: bash
|
|
67
|
+
|
|
68
|
+
- uses: actions/checkout@v4
|
|
69
|
+
with:
|
|
70
|
+
lfs: true
|
|
71
|
+
|
|
72
|
+
- name: Verify LFS content downloaded
|
|
73
|
+
run: |
|
|
74
|
+
if grep -rl "version https://git-lfs.github.com/spec/v1" . \
|
|
75
|
+
--include="*.bin" --include="*.png" --include="*.zip" 2>/dev/null | head -1 | grep -q .; then
|
|
76
|
+
echo "ERROR: LFS pointer files found — actual content was not downloaded"
|
|
77
|
+
exit 1
|
|
78
|
+
fi
|
|
79
|
+
echo "LFS check passed — no pointer files found"
|
|
80
|
+
shell: bash
|
|
81
|
+
|
|
82
|
+
- language: yaml
|
|
83
|
+
label: "GitHub-hosted runner — explicit lfs: true with verification"
|
|
84
|
+
code: |
|
|
85
|
+
steps:
|
|
86
|
+
- uses: actions/checkout@v4
|
|
87
|
+
with:
|
|
88
|
+
lfs: true
|
|
89
|
+
# lfs: true is usually sufficient on GitHub-hosted runners
|
|
90
|
+
# if LFS quota is not exhausted
|
|
91
|
+
prevention:
|
|
92
|
+
- "Verify git-lfs is installed on all self-hosted runners before running checkout workflows."
|
|
93
|
+
- "Monitor GitHub LFS bandwidth usage in repository Settings > Billing to avoid silent quota exhaustion."
|
|
94
|
+
- "Add a post-checkout verification step that confirms LFS-tracked files contain real content, not pointer metadata."
|
|
95
|
+
- "For fork PRs from external contributors, be aware that LFS objects may not be accessible — consider disabling LFS-dependent tests for fork builds."
|
|
96
|
+
- "Use GitHub-hosted runners for LFS-heavy workflows to avoid manual git-lfs installation and configuration."
|
|
97
|
+
docs:
|
|
98
|
+
- url: "https://stackoverflow.com/questions/61463578/github-actions-actions-checkoutv2-lfs-true-flag-not-converting-pointers-to-actual-files"
|
|
99
|
+
label: "Stack Overflow: actions/checkout lfs:true not converting pointers to actual files (Score: 48, 21K views)"
|
|
100
|
+
- url: "https://github.com/actions/checkout#usage"
|
|
101
|
+
label: "actions/checkout: lfs input documentation"
|
|
102
|
+
- url: "https://docs.github.com/en/repositories/working-with-files/managing-large-files/about-git-large-file-storage"
|
|
103
|
+
label: "GitHub Docs: About Git Large File Storage"
|
|
104
|
+
- url: "https://docs.github.com/en/billing/managing-billing-for-your-products/managing-billing-for-git-large-file-storage/about-billing-for-git-large-file-storage"
|
|
105
|
+
label: "GitHub Docs: About billing for Git LFS"
|