@htekdev/actions-debugger 1.0.113 → 1.0.115
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/cache-corrupt-on-cancel-during-restore-save-always.yml +136 -0
- package/errors/caching-artifacts/restore-keys-asterisk-literal-not-glob.yml +107 -0
- package/errors/concurrency-timing/concurrency-timing-053.yml +83 -0
- package/errors/concurrency-timing/pull-request-review-shared-concurrency-cancels-ci.yml +131 -0
- package/errors/known-unsolved/github-script-esm-not-supported.yml +111 -0
- package/errors/known-unsolved/job-outputs-string-only-no-array-object.yml +142 -0
- package/errors/known-unsolved/known-unsolved-062.yml +87 -0
- package/errors/known-unsolved/runner-rest-api-busy-false-broker-state-desync.yml +102 -0
- package/errors/permissions-auth/oidc-immutable-sub-claim-new-repo-trust-policy-mismatch.yml +122 -0
- package/errors/permissions-auth/permissions-auth-064.yml +122 -0
- package/errors/permissions-auth/permissions-auth-065.yml +97 -0
- package/errors/permissions-auth/permissions-auth-066.yml +129 -0
- package/errors/permissions-auth/upload-code-coverage-missing-code-quality-write-permission.yml +94 -0
- package/errors/runner-environment/arc-kubernetes-checkout-circular-json-container-hook.yml +101 -0
- package/errors/runner-environment/cache-restore-windows-runner-silent-crash.yml +130 -0
- package/errors/runner-environment/git-248-fetch-tags-shallow-clone-regression.yml +100 -0
- package/errors/runner-environment/javascript-actions-alpine-arm64-not-supported.yml +121 -0
- package/errors/runner-environment/runner-environment-188.yml +96 -0
- package/errors/runner-environment/runner-environment-191.yml +147 -0
- package/errors/runner-environment/runner-environment-192.yml +144 -0
- package/errors/runner-environment/runner-environment-193.yml +136 -0
- package/errors/runner-environment/runner-environment-194.yml +86 -0
- package/errors/runner-environment/runner-environment-199.yml +93 -0
- package/errors/runner-environment/setup-python-macos-self-hosted-symlink-permission-denied.yml +94 -0
- package/errors/runner-environment/setup-python-windows-self-hosted-no-admin-install-fails.yml +101 -0
- package/errors/silent-failures/checkout-v6-clean-false-deletes-workspace-on-repo-change.yml +119 -0
- package/errors/silent-failures/queue-max-silently-ignored-with-cancel-in-progress.yml +109 -0
- package/errors/silent-failures/silent-failures-102.yml +141 -0
- package/errors/silent-failures/silent-failures-104.yml +119 -0
- package/errors/triggers/triggers-069.yml +100 -0
- package/errors/yaml-syntax/continue-on-error-inputs-composite-action-unexpected-value.yml +110 -0
- package/errors/yaml-syntax/yaml-syntax-068.yml +137 -0
- package/errors/yaml-syntax/yaml-syntax-069.yml +118 -0
- package/package.json +1 -1
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
id: runner-environment-195
|
|
2
|
+
title: 'JavaScript Actions in Alpine containers not supported on ARM64 runners'
|
|
3
|
+
category: runner-environment
|
|
4
|
+
severity: error
|
|
5
|
+
tags:
|
|
6
|
+
- alpine
|
|
7
|
+
- arm64
|
|
8
|
+
- javascript-action
|
|
9
|
+
- container
|
|
10
|
+
- ubuntu-24.04-arm
|
|
11
|
+
- musl
|
|
12
|
+
patterns:
|
|
13
|
+
- regex: 'JavaScript Actions in Alpine containers are only supported on x64 Linux runners'
|
|
14
|
+
flags: 'i'
|
|
15
|
+
- regex: 'Detected Linux Arm64'
|
|
16
|
+
flags: 'i'
|
|
17
|
+
- regex: 'JavaScript Actions in Alpine containers.*Detected Linux'
|
|
18
|
+
flags: 'i'
|
|
19
|
+
error_messages:
|
|
20
|
+
- 'Error: JavaScript Actions in Alpine containers are only supported on x64 Linux runners. Detected Linux Arm64'
|
|
21
|
+
root_cause: |
|
|
22
|
+
The Actions runner's container hook for JavaScript-based actions (actions that use
|
|
23
|
+
`using: node20` or `using: node24` in their action.yml) includes a hard platform check
|
|
24
|
+
when the container image is detected as Alpine Linux.
|
|
25
|
+
|
|
26
|
+
Alpine Linux uses musl libc instead of glibc. The Node.js binaries bundled inside
|
|
27
|
+
GitHub-hosted Actions runners are compiled against glibc and cannot run inside Alpine
|
|
28
|
+
containers without compatibility shims. The runner guards against this by rejecting
|
|
29
|
+
JavaScript action execution in Alpine containers that are not on x64 Linux, where a
|
|
30
|
+
limited musl-compatibility workaround exists.
|
|
31
|
+
|
|
32
|
+
On ARM64 runners (ubuntu-24.04-arm, ubuntu-22.04-arm), the runner explicitly rejects
|
|
33
|
+
JavaScript actions run inside Alpine containers with this error. The check evaluates the
|
|
34
|
+
container image's /etc/os-release ID field: when ID=alpine is found AND the runner
|
|
35
|
+
architecture is not x64, the error is thrown.
|
|
36
|
+
|
|
37
|
+
Common trigger patterns:
|
|
38
|
+
- Workflow uses `container: alpine` or a custom image FROM alpine
|
|
39
|
+
- One or more steps use JavaScript-based actions (e.g. actions/upload-artifact,
|
|
40
|
+
actions/checkout, actions/setup-node)
|
|
41
|
+
- Workflow or matrix includes ubuntu-24.04-arm or ubuntu-22.04-arm runners
|
|
42
|
+
|
|
43
|
+
Upgrading to a larger ubuntu-based base image resolves the issue because glibc is
|
|
44
|
+
present. There is no planned fix to add ARM64 Alpine support to the runner.
|
|
45
|
+
fix: |
|
|
46
|
+
Option 1 (recommended): Replace the Alpine container with a Debian/Ubuntu-based image.
|
|
47
|
+
Alpine is often chosen for image size, but if JavaScript actions must be used inside the
|
|
48
|
+
container, a glibc-based image is required on ARM64 runners.
|
|
49
|
+
|
|
50
|
+
Option 2: Run JavaScript actions as host-level steps (outside the container) and
|
|
51
|
+
restrict container use to run: shell steps that do not invoke JS actions.
|
|
52
|
+
|
|
53
|
+
Option 3: Restrict ARM64 runners to non-Alpine container images in your matrix.
|
|
54
|
+
|
|
55
|
+
Option 4: If the Alpine container is only for the build environment, restructure the
|
|
56
|
+
workflow so JavaScript actions (checkout, upload-artifact, etc.) run before the
|
|
57
|
+
container is started rather than inside it.
|
|
58
|
+
fix_code:
|
|
59
|
+
- language: yaml
|
|
60
|
+
label: 'Replace Alpine with Debian-slim (smallest glibc image)'
|
|
61
|
+
code: |
|
|
62
|
+
jobs:
|
|
63
|
+
build:
|
|
64
|
+
runs-on: ubuntu-24.04-arm
|
|
65
|
+
container:
|
|
66
|
+
# Replace: image: alpine:latest
|
|
67
|
+
image: debian:bookworm-slim # glibc-based, JS actions work on ARM64
|
|
68
|
+
steps:
|
|
69
|
+
- uses: actions/checkout@v6
|
|
70
|
+
- run: apt-get update && apt-get install -y curl
|
|
71
|
+
- uses: actions/upload-artifact@v4
|
|
72
|
+
with:
|
|
73
|
+
name: output
|
|
74
|
+
path: dist/
|
|
75
|
+
|
|
76
|
+
- language: yaml
|
|
77
|
+
label: 'Run JS actions on host, only use Alpine container for build steps'
|
|
78
|
+
code: |
|
|
79
|
+
jobs:
|
|
80
|
+
build:
|
|
81
|
+
runs-on: ubuntu-24.04-arm
|
|
82
|
+
steps:
|
|
83
|
+
# Checkout on host (no container) — JS action works fine
|
|
84
|
+
- uses: actions/checkout@v6
|
|
85
|
+
# Run build inside Alpine via docker run (shell step, not JS action)
|
|
86
|
+
- name: Build in Alpine
|
|
87
|
+
run: |
|
|
88
|
+
docker run --rm -v "$GITHUB_WORKSPACE:/work" -w /work \
|
|
89
|
+
alpine:latest sh -c "apk add --no-cache build-base && make"
|
|
90
|
+
# Upload on host — JS action works fine
|
|
91
|
+
- uses: actions/upload-artifact@v4
|
|
92
|
+
with:
|
|
93
|
+
name: output
|
|
94
|
+
path: dist/
|
|
95
|
+
|
|
96
|
+
- language: yaml
|
|
97
|
+
label: 'Matrix: restrict Alpine container to x64 runners only'
|
|
98
|
+
code: |
|
|
99
|
+
jobs:
|
|
100
|
+
build:
|
|
101
|
+
runs-on: ${{ matrix.runner }}
|
|
102
|
+
container:
|
|
103
|
+
image: ${{ matrix.runner == 'ubuntu-24.04-arm' && 'debian:bookworm-slim' || 'alpine:latest' }}
|
|
104
|
+
strategy:
|
|
105
|
+
matrix:
|
|
106
|
+
runner: [ubuntu-24.04, ubuntu-24.04-arm]
|
|
107
|
+
steps:
|
|
108
|
+
- uses: actions/checkout@v6
|
|
109
|
+
|
|
110
|
+
prevention:
|
|
111
|
+
- 'Never use Alpine-based container images on ARM64 GitHub-hosted runners if any workflow step calls a JavaScript action'
|
|
112
|
+
- 'Use debian:bookworm-slim or ubuntu:24.04 as a lightweight glibc alternative to Alpine when JS actions must run in-container on ARM64'
|
|
113
|
+
- 'When migrating workflows to ARM64 runners, audit all container: image values for Alpine derivation (FROM alpine, alpine:latest, alpine:3.x)'
|
|
114
|
+
- 'Run JavaScript actions (checkout, upload-artifact, setup-*) as host-level steps before or after the Alpine container block when possible'
|
|
115
|
+
docs:
|
|
116
|
+
- url: 'https://github.com/actions/upload-artifact/issues/739'
|
|
117
|
+
label: 'actions/upload-artifact#739 — JS Actions in Alpine containers not supported on ARM64 (Feb 2026)'
|
|
118
|
+
- url: 'https://docs.github.com/en/actions/using-github-hosted-runners/using-github-hosted-runners/about-github-hosted-runners#supported-runners-and-hardware-resources'
|
|
119
|
+
label: 'GitHub-hosted runners — ARM64 runner support'
|
|
120
|
+
- url: 'https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/running-jobs-in-a-container'
|
|
121
|
+
label: 'Running jobs in a container'
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
id: runner-environment-188
|
|
2
|
+
title: "macOS Self-Hosted Runner Concurrent Checkout Hangs — git-credential-osxkeychain Deadlock"
|
|
3
|
+
category: runner-environment
|
|
4
|
+
severity: error
|
|
5
|
+
tags:
|
|
6
|
+
- macos
|
|
7
|
+
- self-hosted
|
|
8
|
+
- checkout
|
|
9
|
+
- concurrent
|
|
10
|
+
- osxkeychain
|
|
11
|
+
- credential
|
|
12
|
+
- hang
|
|
13
|
+
patterns:
|
|
14
|
+
- regex: 'git-credential-osxkeychain store'
|
|
15
|
+
flags: i
|
|
16
|
+
- regex: 'run_command.*git-credential-osxkeychain'
|
|
17
|
+
flags: i
|
|
18
|
+
error_messages:
|
|
19
|
+
- "trace: run_command: 'git credential-osxkeychain store'"
|
|
20
|
+
- "trace: exec: git-credential-osxkeychain store"
|
|
21
|
+
- "trace: start_command: /opt/homebrew/opt/git/libexec/git-core/git-credential-osxkeychain store"
|
|
22
|
+
root_cause: |
|
|
23
|
+
When two or more concurrent jobs on the same macOS self-hosted runner both execute
|
|
24
|
+
`actions/checkout`, each job's git process attempts to acquire the macOS Keychain to store
|
|
25
|
+
the authentication token via `git-credential-osxkeychain`. Because the macOS Keychain
|
|
26
|
+
serializes write access, a second concurrent credential store call waits indefinitely for
|
|
27
|
+
the first to release the keychain lock — creating a deadlock that never resolves on its own.
|
|
28
|
+
|
|
29
|
+
The job hangs silently. The last visible log line is always the `git-credential-osxkeychain
|
|
30
|
+
store` trace, followed by no output until the 6-hour GitHub Actions job timeout cancels
|
|
31
|
+
the run. There is no error message — the step simply never completes.
|
|
32
|
+
|
|
33
|
+
Runner v2.331.0 (which moved the base macOS image to 26 / Tahoe) and checkout@v6 together
|
|
34
|
+
worsened the race condition frequency. The issue also affects earlier runner/checkout
|
|
35
|
+
version combinations when multiple jobs share the same macOS self-hosted runner workspace.
|
|
36
|
+
fix: |
|
|
37
|
+
Two workarounds exist. The most reliable is a pre-checkout workspace cleanup step that
|
|
38
|
+
removes leftover lock files from prior concurrent runs. The second is disabling credential
|
|
39
|
+
persistence so git never calls the macOS Keychain at all.
|
|
40
|
+
|
|
41
|
+
Option A (most reliable — workspace cleanup before every checkout):
|
|
42
|
+
Add a step before `actions/checkout` that removes all workspace contents. This eliminates
|
|
43
|
+
stale `.git/index.lock`, `.git/gc.pid` and credential lock files that cause the hang.
|
|
44
|
+
|
|
45
|
+
Option B (simpler — disable credential persistence):
|
|
46
|
+
Set `persist-credentials: false` on the checkout step. This prevents git from calling
|
|
47
|
+
`git-credential-osxkeychain store` entirely since no token is persisted. Note: this
|
|
48
|
+
means subsequent git operations in the same job cannot use the persisted token, so you
|
|
49
|
+
must pass the token explicitly in each git call that needs it.
|
|
50
|
+
|
|
51
|
+
If the workspace directory itself is the issue (leftover `.git/index.lock`), add an explicit
|
|
52
|
+
pre-step that deletes `.git/index.lock` and `.git/gc.pid` if they exist.
|
|
53
|
+
fix_code:
|
|
54
|
+
- language: yaml
|
|
55
|
+
label: "Option A — pre-checkout workspace cleanup (most reliable)"
|
|
56
|
+
code: |
|
|
57
|
+
jobs:
|
|
58
|
+
build:
|
|
59
|
+
runs-on: [self-hosted, macos]
|
|
60
|
+
steps:
|
|
61
|
+
- name: Clean workspace before checkout
|
|
62
|
+
run: |
|
|
63
|
+
find "$GITHUB_WORKSPACE" -mindepth 1 -maxdepth 1 -exec rm -rf {} + \
|
|
64
|
+
|| echo "::warning::Workspace cleanup failed due to concurrent writes. Not fatal."
|
|
65
|
+
- uses: actions/checkout@v6
|
|
66
|
+
- language: yaml
|
|
67
|
+
label: "Option B — disable credential persistence to skip keychain"
|
|
68
|
+
code: |
|
|
69
|
+
jobs:
|
|
70
|
+
build:
|
|
71
|
+
runs-on: [self-hosted, macos]
|
|
72
|
+
steps:
|
|
73
|
+
- uses: actions/checkout@v6
|
|
74
|
+
with:
|
|
75
|
+
persist-credentials: false
|
|
76
|
+
- language: yaml
|
|
77
|
+
label: "Delete stale git lock files before checkout"
|
|
78
|
+
code: |
|
|
79
|
+
- name: Remove stale git lock files
|
|
80
|
+
run: |
|
|
81
|
+
rm -f "$GITHUB_WORKSPACE/.git/index.lock"
|
|
82
|
+
rm -f "$GITHUB_WORKSPACE/.git/gc.pid"
|
|
83
|
+
- uses: actions/checkout@v6
|
|
84
|
+
prevention:
|
|
85
|
+
- "Use ephemeral self-hosted macOS runners (each job gets a fresh runner) to eliminate workspace state sharing between concurrent jobs"
|
|
86
|
+
- "Limit concurrency on the macOS runner's job queue to 1 using a concurrency group if ephemeral runners are not available"
|
|
87
|
+
- "Add a pre-checkout workspace cleanup step as a defensive measure on all macOS self-hosted runner jobs"
|
|
88
|
+
- "Set `persist-credentials: false` if downstream git operations do not require the persisted token"
|
|
89
|
+
- "Upgrade to the latest actions/checkout — version tags and runner versions interact; newer releases may reduce the deadlock window"
|
|
90
|
+
docs:
|
|
91
|
+
- url: "https://stackoverflow.com/questions/79881327/github-actions-self-hosted-runner-on-macos-tries-to-checkout-repository-forever"
|
|
92
|
+
label: "Stack Overflow — macOS self-hosted runner checkout hangs forever (Feb 2026)"
|
|
93
|
+
- url: "https://github.com/actions/checkout/issues/550"
|
|
94
|
+
label: "actions/checkout#550 — Checkout gets stuck forever randomly on self-hosted runners"
|
|
95
|
+
- url: "https://docs.github.com/en/actions/hosting-your-own-runners/managing-self-hosted-runners/about-self-hosted-runners"
|
|
96
|
+
label: "GitHub Docs: About self-hosted runners"
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
id: runner-environment-191
|
|
2
|
+
title: 'GHCup 0.1.x → 0.2.x Upgrade on Ubuntu Runners Breaks Direct ghcup CLI Usage'
|
|
3
|
+
category: runner-environment
|
|
4
|
+
severity: error
|
|
5
|
+
tags:
|
|
6
|
+
- haskell
|
|
7
|
+
- ghcup
|
|
8
|
+
- ubuntu-22.04
|
|
9
|
+
- ubuntu-24.04
|
|
10
|
+
- runner-image
|
|
11
|
+
- breaking-change
|
|
12
|
+
patterns:
|
|
13
|
+
- regex: 'ghcup: command not found'
|
|
14
|
+
flags: 'i'
|
|
15
|
+
- regex: 'ghcup list.*-r[0-9]+|version.*-r[0-9].*not found'
|
|
16
|
+
flags: 'i'
|
|
17
|
+
- regex: '\$HOME/\.ghcup/bin/ghc.*no such file|\.ghcup/bin/ghc.*not a regular file'
|
|
18
|
+
flags: 'i'
|
|
19
|
+
- regex: 'ghcup.*cabal install.*unknown command|cabal install.*unrecognized.*ghcup'
|
|
20
|
+
flags: 'i'
|
|
21
|
+
error_messages:
|
|
22
|
+
- 'test -f ~/.ghcup/bin/ghc returned false (ghc not installed)'
|
|
23
|
+
- 'GHC version 9.6.6-r1 was not found in the expected location'
|
|
24
|
+
- 'Error: The value 9.6.6-r1 is not a valid GHC version'
|
|
25
|
+
- 'ghcup: error: no subcommand: cabal install'
|
|
26
|
+
root_cause: |
|
|
27
|
+
The ubuntu-22.04 and ubuntu-24.04 runner image update released 2026-05-26
|
|
28
|
+
(ubuntu24/20260525.161.1, ubuntu22/20260525.156.1) upgraded the pre-installed GHCup
|
|
29
|
+
from 0.1.50.2 to 0.2.5.0. GHCup 0.2.x introduced several breaking CLI and
|
|
30
|
+
filesystem changes that affect workflows calling ghcup directly.
|
|
31
|
+
|
|
32
|
+
**Breaking changes in GHCup 0.2.x:**
|
|
33
|
+
|
|
34
|
+
1. **`ghcup list` version strings now include a `-rX` revision suffix** when a
|
|
35
|
+
revision update is available (e.g., `9.6.6-r1` instead of `9.6.6`). Scripts
|
|
36
|
+
that parse `ghcup list` output for version equality checks (e.g., `grep 9.6.6`)
|
|
37
|
+
or that pipe the version into other tools fail because of the unexpected suffix.
|
|
38
|
+
|
|
39
|
+
2. **`~/.ghcup/bin/` is now entirely composed of symlinks** (except the `ghcup`
|
|
40
|
+
binary itself). Previously, some binaries (like `ghc`, `cabal`, `hls`) were
|
|
41
|
+
hardlinks or regular executable files. Workflow steps using the POSIX file-
|
|
42
|
+
existence test `-f ~/.ghcup/bin/ghc` now return false because `-f` returns
|
|
43
|
+
false for symlinks. The check must be `-e` (exists) or `-L` (is symlink).
|
|
44
|
+
|
|
45
|
+
3. **Old undocumented subcommand alias removed**: `ghcup cabal install <ver>` as
|
|
46
|
+
an alternative form is gone. The canonical form `ghcup install cabal <ver>` and
|
|
47
|
+
`ghcup install ghc <ver>` still work. Workflows that copied old forum examples
|
|
48
|
+
using the deprecated form receive an "unknown subcommand" error.
|
|
49
|
+
|
|
50
|
+
4. **`ghcup compile hls --isolate=<dir>` changed output path**: binaries are now
|
|
51
|
+
installed into `<dir>/bin/` instead of `<dir>/`. Scripts expecting the binary
|
|
52
|
+
directly at the isolate path fail with "file not found".
|
|
53
|
+
|
|
54
|
+
Note: The `--install-targets` flag bug present in GHCup 0.2.0–0.2.2 was already
|
|
55
|
+
fixed before the runner images updated (runner ships 0.2.5.0). That specific bug
|
|
56
|
+
does not affect GitHub-hosted runners.
|
|
57
|
+
fix: |
|
|
58
|
+
**For `-f` file existence checks** — replace with `-e` (any file type) or
|
|
59
|
+
`-L` (is symlink):
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
# Before (breaks on GHCup 0.2.x):
|
|
63
|
+
if [ -f "$HOME/.ghcup/bin/ghc" ]; then ...
|
|
64
|
+
|
|
65
|
+
# After:
|
|
66
|
+
if [ -e "$HOME/.ghcup/bin/ghc" ]; then ...
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
**For version parsing from `ghcup list`** — strip the revision suffix:
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
GHC_VER=$(ghcup list -t ghc --show-criteria 'recommended' -r | awk '{print $2}' \
|
|
73
|
+
| sed 's/-r[0-9]*$//')
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
Or use `--show-revisions=none` to suppress the suffix entirely:
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
ghcup list -t ghc --show-revisions=none
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
**For old subcommand syntax** — use the canonical form:
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
# Before:
|
|
86
|
+
ghcup cabal install 3.12.1.0
|
|
87
|
+
|
|
88
|
+
# After:
|
|
89
|
+
ghcup install cabal 3.12.1.0
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
**Best practice** — use `haskell-actions/setup` instead of calling ghcup
|
|
93
|
+
directly. The action is maintained to handle ghcup version changes:
|
|
94
|
+
|
|
95
|
+
```yaml
|
|
96
|
+
- uses: haskell-actions/setup@v2
|
|
97
|
+
with:
|
|
98
|
+
ghc-version: '9.6.6'
|
|
99
|
+
cabal-version: 'latest'
|
|
100
|
+
```
|
|
101
|
+
fix_code:
|
|
102
|
+
- language: yaml
|
|
103
|
+
label: 'Use haskell-actions/setup instead of raw ghcup commands'
|
|
104
|
+
code: |
|
|
105
|
+
- name: Set up GHC
|
|
106
|
+
uses: haskell-actions/setup@v2
|
|
107
|
+
with:
|
|
108
|
+
ghc-version: '9.6.6'
|
|
109
|
+
cabal-version: 'latest'
|
|
110
|
+
enable-stack: false
|
|
111
|
+
|
|
112
|
+
- language: yaml
|
|
113
|
+
label: 'Conditional GHCup binary check — fix -f to -e'
|
|
114
|
+
code: |
|
|
115
|
+
- name: Check if GHC is available
|
|
116
|
+
run: |
|
|
117
|
+
# GHCup 0.2.x: all ~/.ghcup/bin/ entries are symlinks; use -e not -f
|
|
118
|
+
if [ -e "$HOME/.ghcup/bin/ghc" ]; then
|
|
119
|
+
echo "GHC found: $(ghc --version)"
|
|
120
|
+
else
|
|
121
|
+
ghcup install ghc recommended
|
|
122
|
+
fi
|
|
123
|
+
|
|
124
|
+
- language: yaml
|
|
125
|
+
label: 'Parse GHCup list output — strip revision suffix'
|
|
126
|
+
code: |
|
|
127
|
+
- name: Get recommended GHC version
|
|
128
|
+
run: |
|
|
129
|
+
# GHCup 0.2.x: version may include -rX revision suffix
|
|
130
|
+
GHC_VER=$(ghcup list -t ghc --show-revisions=none -r \
|
|
131
|
+
| grep 'recommended' | awk '{print $2}')
|
|
132
|
+
echo "GHC version: $GHC_VER"
|
|
133
|
+
ghcup install ghc "$GHC_VER"
|
|
134
|
+
prevention:
|
|
135
|
+
- 'Use haskell-actions/setup instead of calling ghcup directly — it handles ghcup API changes across versions.'
|
|
136
|
+
- 'Use `-e` or `-L` for file existence checks on `~/.ghcup/bin/` entries, never `-f`.'
|
|
137
|
+
- 'Pin to specific GHC/Cabal versions in haskell-actions/setup rather than resolving "recommended" at runtime.'
|
|
138
|
+
- 'When parsing `ghcup list` output, use `--show-revisions=none` to suppress the `-rX` suffix added in 0.2.x.'
|
|
139
|
+
docs:
|
|
140
|
+
- url: 'https://github.com/haskell/ghcup-hs/releases/tag/v0.2.1.0'
|
|
141
|
+
label: 'GHCup 0.2.1.0 release notes (breaking changes section)'
|
|
142
|
+
- url: 'https://github.com/actions/runner-images/releases/tag/ubuntu24%2F20260525.161'
|
|
143
|
+
label: 'Ubuntu 24.04 runner image release 20260525.161.1 — GHCup 0.1.50.2 → 0.2.5.0'
|
|
144
|
+
- url: 'https://github.com/actions/runner-images/issues/14142'
|
|
145
|
+
label: 'runner-images #14142 — GHCup 0.2 version banner format change'
|
|
146
|
+
- url: 'https://github.com/haskell/haskell-actions/tree/main/setup'
|
|
147
|
+
label: 'haskell-actions/setup — official Haskell CI setup action'
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
id: runner-environment-192
|
|
2
|
+
title: 'ubuntu-24.04 Kernel 6.17.0-1015-azure Oops in ublk_drv — User Block Device Workflows Hang'
|
|
3
|
+
category: runner-environment
|
|
4
|
+
severity: error
|
|
5
|
+
tags:
|
|
6
|
+
- ubuntu-24.04
|
|
7
|
+
- kernel
|
|
8
|
+
- ublk
|
|
9
|
+
- io-uring
|
|
10
|
+
- runner-image
|
|
11
|
+
- regression
|
|
12
|
+
patterns:
|
|
13
|
+
- regex: 'ublk_init_queues.*Oops|RIP.*ublk_init_queues'
|
|
14
|
+
flags: 'i'
|
|
15
|
+
- regex: 'ublk_ctrl_add_dev|UBLK_U_CMD_ADD_DEV.*hang|ublk_drv.*kernel.*oops'
|
|
16
|
+
flags: 'i'
|
|
17
|
+
- regex: 'note: iou-wrk-.*exited with irqs disabled'
|
|
18
|
+
flags: 'i'
|
|
19
|
+
- regex: 'modprobe ublk_drv.*ublk.*add.*dev.*timeout|ublk.*command.*never completes'
|
|
20
|
+
flags: 'i'
|
|
21
|
+
error_messages:
|
|
22
|
+
- 'RIP: 0010:ublk_init_queues+0x4e/0x1e0 [ublk_drv]'
|
|
23
|
+
- 'note: iou-wrk-* exited with irqs disabled'
|
|
24
|
+
- 'ublk_ctrl_add_dev+0x31a/0x5e0 [ublk_drv]'
|
|
25
|
+
- 'Oops: general protection fault, probably for non-canonical address'
|
|
26
|
+
root_cause: |
|
|
27
|
+
The ubuntu-24.04 runner image released 2026-05-26 (version 20260525.161.1) ships
|
|
28
|
+
Linux kernel 6.17.0-1015-azure (upgraded from 6.17.0-1013-azure). This kernel
|
|
29
|
+
contains an upstream bug in the `ublk_drv` module: calling `UBLK_U_CMD_ADD_DEV`
|
|
30
|
+
once via io_uring triggers a kernel Oops in `ublk_init_queues+0x4e/0x1e0`.
|
|
31
|
+
|
|
32
|
+
**Affected call chain:**
|
|
33
|
+
```
|
|
34
|
+
ublk_init_queues
|
|
35
|
+
ublk_ctrl_add_dev
|
|
36
|
+
ublk_ctrl_uring_cmd
|
|
37
|
+
io_uring_cmd
|
|
38
|
+
io_wq_submit_work
|
|
39
|
+
io_wq_worker
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
After the Oops, the ADD_DEV io_uring command never receives a completion event
|
|
43
|
+
(CQE), so the userspace program waits indefinitely. The GitHub Actions job hangs
|
|
44
|
+
until it hits the workflow timeout.
|
|
45
|
+
|
|
46
|
+
**Affected environments:**
|
|
47
|
+
- ubuntu-24.04 amd64 hosted runners with kernel 6.17.0-1015-azure
|
|
48
|
+
- Any workflow that calls `modprobe ublk_drv` and then performs `UBLK_U_CMD_ADD_DEV`
|
|
49
|
+
|
|
50
|
+
**Unaffected environments:**
|
|
51
|
+
- ubuntu-22.04 runners (kernel 6.8.0-1052-azure — not affected)
|
|
52
|
+
- ubuntu-24.04 self-hosted runners still on kernel 6.17.0-1013-azure or earlier
|
|
53
|
+
|
|
54
|
+
This is an upstream `linux-azure` kernel bug (not a runner-images regression).
|
|
55
|
+
GitHub does not pin the kernel — it is delivered from Canonical's HWE channel.
|
|
56
|
+
A kernel SRU fix from Canonical will be picked up automatically in future
|
|
57
|
+
ubuntu-24.04 runner image releases.
|
|
58
|
+
fix: |
|
|
59
|
+
**Workaround: pin ublk-based jobs to ubuntu-22.04 until the kernel SRU is deployed.**
|
|
60
|
+
|
|
61
|
+
```yaml
|
|
62
|
+
ublk-test:
|
|
63
|
+
runs-on: ubuntu-22.04 # kernel 6.8.0 — ublk_drv works correctly
|
|
64
|
+
steps:
|
|
65
|
+
- uses: actions/checkout@v6
|
|
66
|
+
- run: |
|
|
67
|
+
sudo modprobe ublk_drv || {
|
|
68
|
+
sudo apt-get install -y --no-install-recommends \
|
|
69
|
+
"linux-modules-extra-$(uname -r)"
|
|
70
|
+
sudo modprobe ublk_drv
|
|
71
|
+
}
|
|
72
|
+
# your ublk test here
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
**Alternative: install `linux-modules-extra` and test kernel version at runtime:**
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
KERNEL=$(uname -r)
|
|
79
|
+
if [[ "$KERNEL" == "6.17.0-1015-azure" ]]; then
|
|
80
|
+
echo "::warning::Kernel 6.17.0-1015-azure has a ublk_drv bug. Skipping ublk tests."
|
|
81
|
+
exit 0
|
|
82
|
+
fi
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Track the upstream kernel SRU at Canonical:
|
|
86
|
+
https://bugs.launchpad.net/ubuntu/+source/linux-azure/
|
|
87
|
+
fix_code:
|
|
88
|
+
- language: yaml
|
|
89
|
+
label: 'Pin ublk-dependent jobs to ubuntu-22.04 as workaround'
|
|
90
|
+
code: |
|
|
91
|
+
jobs:
|
|
92
|
+
ublk-integration:
|
|
93
|
+
# Workaround: ubuntu-24.04 kernel 6.17.0-1015-azure has a ublk_drv bug.
|
|
94
|
+
# Pin to ubuntu-22.04 until a fixed kernel SRU lands in ubuntu-24.04.
|
|
95
|
+
runs-on: ubuntu-22.04
|
|
96
|
+
steps:
|
|
97
|
+
- uses: actions/checkout@v6
|
|
98
|
+
- name: Load ublk_drv
|
|
99
|
+
run: |
|
|
100
|
+
sudo modprobe ublk_drv || {
|
|
101
|
+
sudo apt-get update -qq
|
|
102
|
+
sudo apt-get install -y --no-install-recommends \
|
|
103
|
+
"linux-modules-extra-$(uname -r)"
|
|
104
|
+
sudo modprobe ublk_drv
|
|
105
|
+
}
|
|
106
|
+
- name: Run ublk tests
|
|
107
|
+
run: make test-ublk
|
|
108
|
+
|
|
109
|
+
- language: yaml
|
|
110
|
+
label: 'Matrix with runtime kernel guard to skip known-broken kernel'
|
|
111
|
+
code: |
|
|
112
|
+
jobs:
|
|
113
|
+
ublk-test:
|
|
114
|
+
strategy:
|
|
115
|
+
matrix:
|
|
116
|
+
runner: [ubuntu-22.04, ubuntu-24.04]
|
|
117
|
+
runs-on: ${{ matrix.runner }}
|
|
118
|
+
steps:
|
|
119
|
+
- uses: actions/checkout@v6
|
|
120
|
+
- name: Check kernel for ublk_drv bug
|
|
121
|
+
run: |
|
|
122
|
+
KERNEL=$(uname -r)
|
|
123
|
+
echo "Kernel: $KERNEL"
|
|
124
|
+
if [[ "$KERNEL" == "6.17.0-1015-azure" ]]; then
|
|
125
|
+
echo "::warning::Skipping ublk tests on $KERNEL (known ublk_drv Oops)"
|
|
126
|
+
echo "SKIP_UBLK=true" >> "$GITHUB_ENV"
|
|
127
|
+
fi
|
|
128
|
+
- name: Run ublk tests
|
|
129
|
+
if: env.SKIP_UBLK != 'true'
|
|
130
|
+
run: make test-ublk
|
|
131
|
+
prevention:
|
|
132
|
+
- 'Monitor ubuntu-24.04 kernel version in release notes before running ublk/io_uring block device tests.'
|
|
133
|
+
- 'Add a kernel version gate in ublk-dependent CI steps to skip on known-bad kernels.'
|
|
134
|
+
- 'Subscribe to or monitor `actions/runner-images` issues for kernel regression reports on Ubuntu runners.'
|
|
135
|
+
- 'Consider pinning ublk integration tests to ubuntu-22.04 as a long-term stable baseline for kernel-intensive work.'
|
|
136
|
+
docs:
|
|
137
|
+
- url: 'https://github.com/actions/runner-images/issues/14175'
|
|
138
|
+
label: 'runner-images #14175 — ubuntu-24.04 kernel 6.17.0-1015-azure Oops in ublk_drv (open)'
|
|
139
|
+
- url: 'https://github.com/e2b-dev/ublk-adddev-repro'
|
|
140
|
+
label: 'Minimal ublk UBLK_U_CMD_ADD_DEV repro repo'
|
|
141
|
+
- url: 'https://github.com/actions/runner-images/releases/tag/ubuntu24%2F20260525.161'
|
|
142
|
+
label: 'Ubuntu 24.04 runner image 20260525.161.1 — kernel 6.17.0-1015-azure'
|
|
143
|
+
- url: 'https://bugs.launchpad.net/ubuntu/+source/linux-azure/'
|
|
144
|
+
label: 'Canonical linux-azure bug tracker (for SRU status)'
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
id: runner-environment-193
|
|
2
|
+
title: 'ubuntu-24.04-arm64 GitHub-Managed Image Ships Ruby 3.2.3 vs x64 Ruby 4.0 — Matrix Builds Fail'
|
|
3
|
+
category: runner-environment
|
|
4
|
+
severity: error
|
|
5
|
+
tags:
|
|
6
|
+
- ubuntu-24.04
|
|
7
|
+
- arm64
|
|
8
|
+
- ruby
|
|
9
|
+
- matrix
|
|
10
|
+
- runner-image
|
|
11
|
+
- version-mismatch
|
|
12
|
+
patterns:
|
|
13
|
+
- regex: 'Your Ruby version is 3\.2\.[0-9], but your Gemfile specified.*[~>].*4\.'
|
|
14
|
+
flags: 'i'
|
|
15
|
+
- regex: 'bundler.*RUBY_VERSION.*3\.2.*expected.*4\.|incompatible.*ruby.*3\.2.*4\.'
|
|
16
|
+
flags: 'i'
|
|
17
|
+
- regex: 'LoadError.*incompatible library version.*ruby.*3\.2|\.bundle.*built for Ruby 3\.2.*running.*4\.'
|
|
18
|
+
flags: 'i'
|
|
19
|
+
- regex: 'ubuntu-24\.04-arm.*ruby.*3\.2|arm64.*ruby.*version.*mismatch'
|
|
20
|
+
flags: 'i'
|
|
21
|
+
error_messages:
|
|
22
|
+
- 'Your Ruby version is 3.2.3, but your Gemfile specified ~> 4.0'
|
|
23
|
+
- 'LoadError: incompatible library version - /path/to/native.bundle'
|
|
24
|
+
- "An error occurred while installing nokogiri (1.x.x), and Bundler cannot continue."
|
|
25
|
+
- 'Gem::RuntimeRequirementNotMetError: ruby 4.0 is required'
|
|
26
|
+
root_cause: |
|
|
27
|
+
The first GitHub-managed Ubuntu 24.04 ARM64 runner image (ubuntu24-arm64/
|
|
28
|
+
20260531.15.1, released 2026-06-03) ships Ruby 3.2.3 as the default system Ruby.
|
|
29
|
+
In contrast, the Ubuntu 24.04 x86-64 runner image (ubuntu24/20260525.161.1) ships
|
|
30
|
+
Ruby 4.0.5. This version gap was introduced when GitHub took over ARM64 image
|
|
31
|
+
maintenance from Arm Limited in May–June 2026; the ARM64 image was rebuilt with a
|
|
32
|
+
different baseline software set.
|
|
33
|
+
|
|
34
|
+
**Affected workflows — any that run a Ruby matrix over both platforms:**
|
|
35
|
+
```yaml
|
|
36
|
+
strategy:
|
|
37
|
+
matrix:
|
|
38
|
+
os: [ubuntu-24.04, ubuntu-24.04-arm]
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Failure modes:
|
|
42
|
+
1. **Gemfile Ruby version constraint** — if the Gemfile (or `.ruby-version`) pins
|
|
43
|
+
`ruby ~> 4.0` (or uses Ruby 4.0 syntax features), the ARM64 run fails immediately
|
|
44
|
+
with "Your Ruby version is 3.2.3, but your Gemfile specified ~> 4.0".
|
|
45
|
+
|
|
46
|
+
2. **Native extension ABI mismatch** — if the workflow restores a gem cache built
|
|
47
|
+
on the x64 runner (Ruby 4.0 ABI), native extension `.bundle` files are
|
|
48
|
+
incompatible with Ruby 3.2 on ARM64, producing a `LoadError` at test time.
|
|
49
|
+
|
|
50
|
+
3. **Ruby 4.0 language/stdlib differences** — Ruby 4.0 removed several deprecated
|
|
51
|
+
methods that exist in Ruby 3.2 (e.g., Kernel#binding). Code that uses 4.0-only
|
|
52
|
+
APIs silently succeeds on x64 but may have unexpected behaviour differences on
|
|
53
|
+
ARM64.
|
|
54
|
+
|
|
55
|
+
4. **setup-ruby without an explicit ruby-version** — if no version is pinned, the
|
|
56
|
+
action resolves "system ruby" differently per platform, producing Ruby 3.2 on
|
|
57
|
+
ARM64 and Ruby 4.0 on x64.
|
|
58
|
+
|
|
59
|
+
Ubuntu ARM64 runners maintained by Arm Limited previously matched x64 Ruby
|
|
60
|
+
versions more closely. The GitHub-managed ARM64 baseline is younger and will
|
|
61
|
+
converge with x64 over subsequent image releases.
|
|
62
|
+
fix: |
|
|
63
|
+
**Explicit Ruby version with ruby/setup-ruby** on all platforms to override the
|
|
64
|
+
system Ruby and get a consistent version:
|
|
65
|
+
|
|
66
|
+
```yaml
|
|
67
|
+
- uses: ruby/setup-ruby@v1
|
|
68
|
+
with:
|
|
69
|
+
ruby-version: '3.3' # or whatever version your project supports on both arches
|
|
70
|
+
bundler-cache: true
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
**Separate cache keys per OS/arch** to avoid cross-ABI gem cache poisoning:
|
|
74
|
+
|
|
75
|
+
```yaml
|
|
76
|
+
- uses: actions/cache@v4
|
|
77
|
+
with:
|
|
78
|
+
path: vendor/bundle
|
|
79
|
+
key: ${{ runner.os }}-${{ runner.arch }}-ruby-${{ hashFiles('Gemfile.lock') }}
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
**Guard Gemfile ruby version** to accept both 3.x and 4.x on the arm64 matrix:
|
|
83
|
+
|
|
84
|
+
```ruby
|
|
85
|
+
# Gemfile
|
|
86
|
+
ruby '>= 3.2' # instead of ~> 4.0, to allow both ubuntu-24.04 and ubuntu-24.04-arm
|
|
87
|
+
```
|
|
88
|
+
fix_code:
|
|
89
|
+
- language: yaml
|
|
90
|
+
label: 'Pin Ruby version with setup-ruby across all matrix platforms'
|
|
91
|
+
code: |
|
|
92
|
+
jobs:
|
|
93
|
+
test:
|
|
94
|
+
strategy:
|
|
95
|
+
matrix:
|
|
96
|
+
os: [ubuntu-24.04, ubuntu-24.04-arm]
|
|
97
|
+
runs-on: ${{ matrix.os }}
|
|
98
|
+
steps:
|
|
99
|
+
- uses: actions/checkout@v6
|
|
100
|
+
|
|
101
|
+
# Explicitly pin Ruby to get the same version on x64 AND ARM64.
|
|
102
|
+
# Without this, x64 gets Ruby 4.0.x and ARM64 gets Ruby 3.2.x.
|
|
103
|
+
- uses: ruby/setup-ruby@v1
|
|
104
|
+
with:
|
|
105
|
+
ruby-version: '3.3' # consistent across both architectures
|
|
106
|
+
bundler-cache: true
|
|
107
|
+
|
|
108
|
+
- run: bundle exec rspec
|
|
109
|
+
|
|
110
|
+
- language: yaml
|
|
111
|
+
label: 'Per-arch gem cache key to prevent ABI mismatch on cache restore'
|
|
112
|
+
code: |
|
|
113
|
+
- name: Cache gems
|
|
114
|
+
uses: actions/cache@v4
|
|
115
|
+
with:
|
|
116
|
+
path: vendor/bundle
|
|
117
|
+
# Include runner.arch so ARM64 and x64 don't share native extension builds
|
|
118
|
+
key: >-
|
|
119
|
+
${{ runner.os }}-${{ runner.arch }}-gems-
|
|
120
|
+
${{ hashFiles('Gemfile.lock') }}
|
|
121
|
+
restore-keys: |
|
|
122
|
+
${{ runner.os }}-${{ runner.arch }}-gems-
|
|
123
|
+
prevention:
|
|
124
|
+
- 'Always use `ruby/setup-ruby` with an explicit `ruby-version` in cross-arch matrix jobs — never rely on the system Ruby.'
|
|
125
|
+
- 'Include `runner.arch` in gem cache keys to prevent native extension ABI mismatches between x64 and ARM64 runs.'
|
|
126
|
+
- 'Set Gemfile Ruby version constraint to `>= 3.2` instead of `~> 4.0` when the matrix includes ubuntu-24.04-arm.'
|
|
127
|
+
- 'Check the ubuntu24-arm64 runner release notes for software version differences vs ubuntu-24.04 x64 before adding ARM64 to your CI matrix.'
|
|
128
|
+
docs:
|
|
129
|
+
- url: 'https://github.com/actions/runner-images/releases/tag/ubuntu24-arm64%2F20260531.15'
|
|
130
|
+
label: 'ubuntu24-arm64/20260531.15 — first GitHub-managed ARM64 image (Ruby 3.2.3)'
|
|
131
|
+
- url: 'https://github.com/actions/runner-images/releases/tag/ubuntu24%2F20260525.161'
|
|
132
|
+
label: 'ubuntu24/20260525.161.1 — Ubuntu 24.04 x64 image (Ruby 4.0.5)'
|
|
133
|
+
- url: 'https://github.com/actions/runner-images/issues/14100'
|
|
134
|
+
label: 'runner-images #14100 — ARM64 runner images now maintained by GitHub'
|
|
135
|
+
- url: 'https://github.com/ruby/setup-ruby'
|
|
136
|
+
label: 'ruby/setup-ruby — install a consistent Ruby version on any runner'
|