@htekdev/actions-debugger 1.0.112 → 1.0.114

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.
Files changed (28) hide show
  1. package/errors/caching-artifacts/cache-corrupt-on-cancel-during-restore-save-always.yml +136 -0
  2. package/errors/caching-artifacts/restore-keys-asterisk-literal-not-glob.yml +107 -0
  3. package/errors/concurrency-timing/pull-request-review-shared-concurrency-cancels-ci.yml +131 -0
  4. package/errors/known-unsolved/github-script-esm-not-supported.yml +111 -0
  5. package/errors/known-unsolved/job-outputs-string-only-no-array-object.yml +142 -0
  6. package/errors/permissions-auth/oidc-immutable-sub-claim-new-repo-trust-policy-mismatch.yml +122 -0
  7. package/errors/permissions-auth/permissions-auth-064.yml +122 -0
  8. package/errors/permissions-auth/permissions-auth-065.yml +97 -0
  9. package/errors/permissions-auth/permissions-auth-066.yml +129 -0
  10. package/errors/runner-environment/arc-kubernetes-checkout-circular-json-container-hook.yml +101 -0
  11. package/errors/runner-environment/cache-restore-windows-runner-silent-crash.yml +130 -0
  12. package/errors/runner-environment/git-248-fetch-tags-shallow-clone-regression.yml +100 -0
  13. package/errors/runner-environment/javascript-actions-alpine-arm64-not-supported.yml +121 -0
  14. package/errors/runner-environment/runner-environment-185.yml +88 -0
  15. package/errors/runner-environment/runner-environment-186.yml +95 -0
  16. package/errors/runner-environment/runner-environment-187.yml +90 -0
  17. package/errors/runner-environment/runner-environment-188.yml +96 -0
  18. package/errors/runner-environment/runner-environment-191.yml +147 -0
  19. package/errors/runner-environment/runner-environment-192.yml +144 -0
  20. package/errors/runner-environment/runner-environment-193.yml +136 -0
  21. package/errors/runner-environment/runner-environment-194.yml +86 -0
  22. package/errors/silent-failures/checkout-v6-clean-false-deletes-workspace-on-repo-change.yml +119 -0
  23. package/errors/silent-failures/queue-max-silently-ignored-with-cancel-in-progress.yml +109 -0
  24. package/errors/silent-failures/silent-failures-102.yml +141 -0
  25. package/errors/silent-failures/silent-failures-104.yml +119 -0
  26. package/errors/yaml-syntax/yaml-syntax-068.yml +137 -0
  27. package/errors/yaml-syntax/yaml-syntax-069.yml +118 -0
  28. package/package.json +1 -1
@@ -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'
@@ -0,0 +1,86 @@
1
+ id: runner-environment-194
2
+ title: 'Job Blocked at Queue: "recent account payments have failed or your spending limit needs to be increased"'
3
+ category: runner-environment
4
+ severity: error
5
+ tags:
6
+ - billing
7
+ - spending-limit
8
+ - payments
9
+ - job-blocked
10
+ - queue
11
+ - account
12
+ patterns:
13
+ - regex: 'recent account payments have failed'
14
+ flags: 'i'
15
+ - regex: 'spending limit needs to be increased'
16
+ flags: 'i'
17
+ - regex: 'The job was not started because recent account'
18
+ flags: 'i'
19
+ error_messages:
20
+ - "The job was not started because recent account payments have failed or your spending limit needs to be increased."
21
+ root_cause: |
22
+ GitHub Actions computes minutes and storage usage against the account or organization's
23
+ spending limit. When either of the following conditions is true, queued jobs are never
24
+ assigned a runner and remain stuck indefinitely:
25
+
26
+ 1. **Billing failure** — the payment method on file was declined or has expired. GitHub
27
+ cannot charge for overages and blocks new job starts as a safeguard.
28
+
29
+ 2. **Spending limit reached** — the account spending limit for Actions minutes (or
30
+ artifact/package storage) has been hit. The default spending limit for paid plans is
31
+ $0 of overage; once included minutes are exhausted, jobs are blocked unless the limit
32
+ is raised.
33
+
34
+ The error message appears in the workflow run summary and the job queue-wait log — NOT in
35
+ step output, because no step ever runs. Jobs remain at "Queued" and eventually time out
36
+ (typically 6 hours) with this message.
37
+
38
+ Common triggers:
39
+ - End of billing cycle — included minutes exhausted, spending limit at $0
40
+ - Payment method expired (credit card expiry, bank decline, insufficient funds)
41
+ - Free plan runner-minutes exhausted mid-month with no spending limit override
42
+ - Organization suspended or billing contact unreachable
43
+ fix: |
44
+ **For payment failure:**
45
+ 1. Navigate to Settings → Billing and plans → Payment information
46
+ 2. Update or replace the payment method
47
+ 3. Re-run failed workflow jobs after billing resolves
48
+
49
+ **For spending limit exhaustion:**
50
+ 1. Navigate to Settings → Billing and plans → Spending limits
51
+ 2. Set a non-zero spending limit for Actions (or increase the existing limit)
52
+ 3. Alternatively, migrate expensive workloads to self-hosted runners to eliminate
53
+ billed minute consumption
54
+
55
+ **Check current usage:**
56
+ - Settings → Billing and plans → View usage this month → Actions
57
+ fix_code:
58
+ - language: yaml
59
+ label: "Route expensive jobs to self-hosted runner to avoid billed minutes"
60
+ code: |
61
+ jobs:
62
+ build:
63
+ # Self-hosted runners consume $0 of GitHub-hosted Actions minutes
64
+ runs-on: self-hosted
65
+ steps:
66
+ - uses: actions/checkout@v4
67
+ - run: npm run build
68
+ - language: yaml
69
+ label: "Reduce billed minutes with cancel-in-progress concurrency"
70
+ code: |
71
+ # Cancel stale runs on new push — saves minutes on abandoned branches
72
+ concurrency:
73
+ group: ${{ github.workflow }}-${{ github.ref }}
74
+ cancel-in-progress: true
75
+ prevention:
76
+ - "Set a non-zero spending limit or configure spending alerts in Settings → Billing to receive email warnings before jobs are blocked"
77
+ - "Monitor Actions usage in Settings → Billing and plans → Usage this month on a regular cadence"
78
+ - "Use `cancel-in-progress: true` concurrency groups to cancel stale workflow runs automatically and reduce minute consumption"
79
+ - "For high-parallelism CI, use self-hosted runners or larger runner credits (Teams/Enterprise) to avoid mid-month exhaustion"
80
+ docs:
81
+ - url: "https://docs.github.com/en/billing/managing-billing-for-your-products/managing-billing-for-github-actions/about-billing-for-github-actions"
82
+ label: "About billing for GitHub Actions"
83
+ - url: "https://docs.github.com/en/billing/managing-billing-for-your-products/managing-billing-for-github-actions/managing-your-spending-limit-for-github-actions"
84
+ label: "Managing your spending limit for GitHub Actions"
85
+ - url: "https://github.com/orgs/community/discussions/151956"
86
+ label: "GitHub Community Discussion #151956 — jobs not starting due to spending limit"