@htekdev/actions-debugger 1.0.109 → 1.0.110

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.
@@ -0,0 +1,117 @@
1
+ id: runner-environment-178
2
+ title: 'ARC Runner v2.332.0 Regression — Container Job GITHUB_ENV and Workspace Permission Denied'
3
+ category: runner-environment
4
+ severity: error
5
+ tags:
6
+ - arc
7
+ - actions-runner-controller
8
+ - container-job
9
+ - permissions
10
+ - GITHUB_ENV
11
+ - non-root
12
+ - kubernetes
13
+ - regression
14
+ - v2.332
15
+ patterns:
16
+ - regex: 'cannot create /__w/_temp/_runner_file_commands/set_env_[0-9a-f]+: Permission denied'
17
+ flags: 'i'
18
+ - regex: 'cannot create /__w/_temp/_runner_file_commands/add_path_[0-9a-f]+: Permission denied'
19
+ flags: 'i'
20
+ - regex: 'fatal: detected dubious ownership in repository at .+/__w/'
21
+ flags: 'i'
22
+ - regex: '_runner_file_commands.*Permission denied'
23
+ flags: 'i'
24
+ error_messages:
25
+ - "/__w/_temp/36e38446.sh: 5: cannot create /__w/_temp/_runner_file_commands/set_env_7bb88aaa: Permission denied"
26
+ - "fatal: detected dubious ownership in repository at '/__w/repo/repo'"
27
+ - "/__w/_temp/_runner_file_commands/add_path_: Permission denied"
28
+ root_cause: |
29
+ Upgrading Actions Runner Controller (ARC) from runner v2.330.0 to v2.332.0
30
+ introduces a compound regression that breaks container jobs using non-root users.
31
+
32
+ The regression spans two runner releases:
33
+
34
+ 1. v2.331.0 changed the runner container base image from Ubuntu 22.04 to
35
+ Ubuntu 24.04. The newer base ships git 2.43+ which enforces stricter
36
+ safe.directory checks. The mounted workspace volume is owned by the runner
37
+ UID, so a container running as a different non-root UID receives
38
+ "fatal: detected dubious ownership" on any git operation.
39
+
40
+ 2. v2.332.0 bumped container hooks to v0.8.1, which updated workspace
41
+ ownership handling for the runner pod itself — but not for downstream job
42
+ containers. The _runner_file_commands directory under /__w/_temp/ is
43
+ still created with runner UID ownership. When a container step writes to
44
+ $GITHUB_ENV, $GITHUB_OUTPUT, $GITHUB_PATH, or $GITHUB_STEP_SUMMARY via a
45
+ shell redirect, the shell (running as the container's non-root user) cannot
46
+ create the file and exits non-zero.
47
+
48
+ This regression affects:
49
+ - ARC-managed self-hosted runners on Kubernetes (EKS, GKE, AKS, on-prem)
50
+ - Any workflow using `container: image: my-image` with `options: --user <uid>`
51
+ or a non-root USER in the Dockerfile
52
+ - Workflows that previously worked on runner v2.330.0 and below
53
+
54
+ GitHub-hosted runners (ubuntu-latest, etc.) are NOT affected.
55
+ fix: |
56
+ If you cannot immediately pin the runner version, add a workaround step at
57
+ the top of the affected job to fix ownership of the runner file command
58
+ directories. Alternatively, pin ARC runner images to v2.330.0 until an
59
+ upstream fix for container hooks is released.
60
+
61
+ The most robust long-term fix is to explicitly add the workspace to git's
62
+ safe.directory list and pre-create the file command directories with the
63
+ correct ownership.
64
+ fix_code:
65
+ - language: yaml
66
+ label: 'Option A — Pre-create _runner_file_commands with container user ownership'
67
+ code: |
68
+ jobs:
69
+ build:
70
+ runs-on: self-hosted
71
+ container:
72
+ image: my-app:latest
73
+ options: --user 1000
74
+ steps:
75
+ - name: Fix runner file command directory ownership (v2.332.0 workaround)
76
+ # Run as root before any steps that use GITHUB_ENV/GITHUB_OUTPUT
77
+ run: |
78
+ chown -R 1000:1000 /__w/_temp/_runner_file_commands/ || true
79
+ git config --global --add safe.directory /__w/${{ github.repository }}
80
+ shell: bash
81
+ # Note: requires container image to have chown available as root
82
+ - language: yaml
83
+ label: 'Option B — Pin ARC runner image to v2.330.0 to avoid the regression'
84
+ code: |
85
+ # In your ARC HelmRelease or RunnerDeployment spec:
86
+ # spec:
87
+ # template:
88
+ # spec:
89
+ # containers:
90
+ # - name: runner
91
+ # image: ghcr.io/actions/actions-runner:2.330.0
92
+ - language: yaml
93
+ label: 'Option C — Run container job as root to avoid UID mismatch'
94
+ code: |
95
+ jobs:
96
+ build:
97
+ runs-on: self-hosted
98
+ container:
99
+ image: my-app:latest
100
+ options: --user root # avoid UID mismatch until ARC fix ships
101
+ steps:
102
+ - uses: actions/checkout@v4
103
+ - run: echo "FOO=bar" >> $GITHUB_ENV
104
+ prevention:
105
+ - 'Test ARC runner version upgrades in a staging environment before rolling out to production — especially major bumps (v2.330 → v2.332).'
106
+ - 'Pin container jobs to run as root if your workflow uses GITHUB_ENV, GITHUB_OUTPUT, or GITHUB_PATH writes and you depend on non-root containers.'
107
+ - 'Subscribe to actions/runner releases and scan for changes to container-hooks between minor versions.'
108
+ - 'Add a smoke-test workflow that writes to GITHUB_ENV in a non-root container job — run it against each ARC upgrade to catch regressions early.'
109
+ docs:
110
+ - url: 'https://github.com/actions/runner/issues/4302'
111
+ label: 'actions/runner #4302 — v2.332.0: Container jobs fail with permission denied on GITHUB_ENV and workspace'
112
+ - url: 'https://github.com/actions/runner/issues/4131'
113
+ label: 'actions/runner #4131 — Permissions issue on runners v2.330.0 (/home/runner ownership regression)'
114
+ - url: 'https://github.com/actions/runner/issues/4251'
115
+ label: 'actions/runner #4251 — TempDirectoryManager fails to clean temp directory (permission denied on v2.331.0)'
116
+ - url: 'https://github.com/actions/runner-container-hooks/issues/282'
117
+ label: 'runner-container-hooks #282 — Permissions denied on workingDir'
@@ -0,0 +1,109 @@
1
+ id: runner-environment-177
2
+ title: 'Node.js 24.16.0 Toolcache Update Breaks Puppeteer, Playwright, and Cypress Browser Install'
3
+ category: runner-environment
4
+ severity: error
5
+ tags:
6
+ - nodejs
7
+ - node24
8
+ - puppeteer
9
+ - playwright
10
+ - cypress
11
+ - toolcache
12
+ - browser-install
13
+ - extract-zip
14
+ - regression
15
+ patterns:
16
+ - regex: 'Could not find Chrome \(ver\. \d+\.\d+\.\d+'
17
+ flags: 'i'
18
+ - regex: 'npx puppeteer browsers install .+ exited with code [^0]'
19
+ flags: 'i'
20
+ - regex: 'browserType\.launch: Executable doesn.t exist at .+/chromium'
21
+ flags: 'i'
22
+ - regex: 'Cannot find browser at path.*\.cache/puppeteer'
23
+ flags: 'i'
24
+ - regex: 'Failed to install browsers.*extract.*zip'
25
+ flags: 'i'
26
+ error_messages:
27
+ - "Error: Could not find Chrome (ver. 146.0.7680.153). This can occur if either 1. you did not perform an installation before running the script (e.g. `npx puppeteer browsers install chrome-headless-shell`) or 2. your cache path is incorrectly configured"
28
+ - "browserType.launch: Executable doesn't exist at /home/runner/.cache/ms-playwright/chromium-1169/chrome-linux/chrome"
29
+ - "Error: Failed to install browsers at /home/runner/.cache/ms-playwright"
30
+ root_cause: |
31
+ The ubuntu-24.04 image update from 20260518.149.1 → 20260525.161.1 bumped the
32
+ cached Node.js toolcache version from 24.15.0 to 24.16.0. Node.js 24.16.0
33
+ contains an upstream regression in the readable-stream.destroy() lifecycle
34
+ that breaks yauzl (a ZIP reading library) and extract-zip which depends on it.
35
+
36
+ The affected tools all use @puppeteer/browsers or equivalent ZIP-based browser
37
+ downloaders internally:
38
+ - Puppeteer: `npx puppeteer browsers install chrome-headless-shell`
39
+ - Playwright: `npx playwright install chromium` / `npx playwright install --with-deps`
40
+ - Cypress: `npx cypress install`
41
+
42
+ The ZIP archive download completes successfully and the partial extraction
43
+ begins, but the stream destroy bug causes yauzl to exit before all entries
44
+ are written. The browser binary never lands on disk. The browser installer
45
+ exits 0 (or a non-descriptive exit code) and the next step fails with
46
+ "Could not find Chrome at path..." or a missing executable error.
47
+
48
+ Root upstream issues:
49
+ - https://github.com/nodejs/node/issues/63487 (yauzl/extract-zip hang / partial extraction)
50
+ - https://github.com/nodejs/node/issues/63638 (libuv regression on Windows)
51
+
52
+ Because actions/setup-node resolves to the cached Node.js 24.16.0 when
53
+ node-version: '24' or node-version: '24.x' is specified (or when using the
54
+ default runner-baked Node 24 on ubuntu-24.04), every workflow that installs
55
+ a browser via these tools is affected until Node.js 24.17.0 ships a fix.
56
+ fix: |
57
+ Pin Node.js to 24.15.0 (the last known-good version) via actions/setup-node
58
+ until Node.js 24.17.0 is published and rolled into the runner toolcache.
59
+
60
+ If your workflow does not strictly require Node.js 24, fall back to Node.js 22
61
+ (the runner image default), which is unaffected by this regression.
62
+
63
+ Do NOT use node-version: '24' or node-version: 'latest' until the upstream
64
+ fix lands in Node.js 24.17.0.
65
+ fix_code:
66
+ - language: yaml
67
+ label: 'Option A — Pin Node.js to 24.15.0 (last known-good release)'
68
+ code: |
69
+ steps:
70
+ - uses: actions/setup-node@v6
71
+ with:
72
+ node-version: '24.15.0' # pin until Node 24.17.0 fixes readable-stream regression
73
+ cache: 'npm'
74
+
75
+ - name: Install Puppeteer Chrome
76
+ run: npx puppeteer browsers install chrome-headless-shell
77
+ - language: yaml
78
+ label: 'Option B — Fall back to Node.js 22 (unaffected)'
79
+ code: |
80
+ steps:
81
+ - uses: actions/setup-node@v6
82
+ with:
83
+ node-version: '22' # LTS, not affected by readable-stream regression
84
+ cache: 'npm'
85
+
86
+ - name: Install Playwright browsers
87
+ run: npx playwright install --with-deps chromium
88
+ - language: yaml
89
+ label: 'Option C — Pin Playwright install to avoid extract-zip entirely (Playwright only)'
90
+ code: |
91
+ steps:
92
+ - uses: actions/setup-node@v6
93
+ with:
94
+ node-version: '24.15.0'
95
+ - uses: microsoft/playwright-github-action@v1 # uses pre-installed image browsers
96
+ prevention:
97
+ - 'Pin node-version to a specific patch (e.g. 24.15.0) rather than a major/minor range in workflows that install browser binaries via npx commands.'
98
+ - 'After bumping Node.js versions, verify browser install steps succeed by checking the binary path explicitly with `ls -la ~/.cache/puppeteer` or equivalent before running tests.'
99
+ - 'Subscribe to actions/runner-images releases to catch toolcache updates that may include Node.js patch regressions.'
100
+ - 'For Playwright, prefer `npx playwright install --with-deps` combined with an explicit Node.js pin rather than relying on runner-image cached Node versions.'
101
+ docs:
102
+ - url: 'https://github.com/actions/runner-images/issues/14173'
103
+ label: 'runner-images #14173 — Puppeteer broken in Ubuntu 24.04 version 20260525.161.1'
104
+ - url: 'https://github.com/nodejs/node/issues/63487'
105
+ label: 'nodejs/node #63487 — yauzl/extract-zip hang and partial extraction (readable-stream regression)'
106
+ - url: 'https://github.com/nodejs/node/issues/63638'
107
+ label: 'nodejs/node #63638 — libuv regression in Node.js 24.16.0'
108
+ - url: 'https://github.com/actions/runner-images/releases/tag/ubuntu24%2F20260525.161'
109
+ label: 'runner-images ubuntu24/20260525.161 release — Node.js toolcache bumped 24.15.0 → 24.16.0'
@@ -0,0 +1,112 @@
1
+ id: silent-failures-097
2
+ title: 'setup-node Silently Uses Runner-Baked Node Version When Download Fails — Wrong Version Active'
3
+ category: silent-failures
4
+ severity: silent-failure
5
+ tags:
6
+ - setup-node
7
+ - nodejs
8
+ - download-failure
9
+ - silent-failure
10
+ - wrong-version
11
+ - toolcache
12
+ - hosted-runner
13
+ - fallthrough
14
+ patterns:
15
+ - regex: 'Attempting to download \d+\.\d+\.\d+\.\.\.'
16
+ flags: 'i'
17
+ - regex: 'Cannot find module.*engines.*node.*>=\s*24'
18
+ flags: 'i'
19
+ - regex: 'The engine .node. is incompatible with this module\. Expected version .+\. Got .2[0-2]\.'
20
+ flags: 'i'
21
+ - regex: 'ELIFECYCLE.*node --version.*v2[0-2]\.'
22
+ flags: 'i'
23
+ error_messages:
24
+ - "Attempting to download 24.15.0..."
25
+ - "error: The engine 'node' is incompatible with this module. Expected version '>=24.0.0'. Got '22.14.0'"
26
+ - "npm ERR! code ELIFECYCLE"
27
+ - "Error: Cannot find module 'node:crypto' (Node.js version too old)"
28
+ root_cause: |
29
+ When actions/setup-node's download or extract path fails transiently —
30
+ network blip, manifest miss, partial extract from a concurrent toolcache
31
+ write, or a transient S3/CDN cache failure — the action does not surface the
32
+ error. Instead, it falls back to a secondary download path. If that secondary
33
+ path also fails or returns an unusable toolPath, setup-node adds an empty or
34
+ incorrect directory to PATH and exits 0 (success).
35
+
36
+ Because the setup-node step succeeds, the runner-baked Node.js version
37
+ (e.g. v22.x on ubuntu-latest after the Node 20 removal) remains on PATH.
38
+ Downstream steps execute against the wrong Node.js major version with no
39
+ indication that setup-node did not install the requested version.
40
+
41
+ The mechanism (in official_builds.ts, as of 2026-05-21):
42
+ - Download/extract errors are logged via core.info(), not core.warning()
43
+ or core.error(), so they are buried in normal output
44
+ - After the fallback download attempt, there is no post-condition check
45
+ that verifies node --version matches the requested version
46
+ - core.addPath() is called even if toolPath/bin is empty or stale
47
+
48
+ Reported failing run: https://github.com/n8n-io/n8n/actions/runs/26100630929
49
+ The run showed "Attempting to download 24.15.0..." → 33 seconds of silence →
50
+ next step ran against runner-baked v20.20.0 with no error from setup-node.
51
+
52
+ This is distinct from silent-failures-028 which covers self-hosted runners
53
+ where node is completely absent (node: not found). This entry covers hosted
54
+ runners where the wrong version is silently active and node IS found.
55
+
56
+ Root upstream issue: actions/toolkit#804 — concurrent toolcache writes create
57
+ partial extracts that pass path existence checks.
58
+ fix: |
59
+ Add an explicit node --version verification step immediately after setup-node
60
+ and fail the job if the version does not match. This is the external workaround
61
+ used by affected projects (e.g., n8n/n8n PR #30849).
62
+
63
+ Until actions/setup-node ships a built-in post-install assertion, this
64
+ workflow-level guard is the only reliable way to catch the silent fallthrough.
65
+ fix_code:
66
+ - language: yaml
67
+ label: 'Add explicit version verification after setup-node'
68
+ code: |
69
+ steps:
70
+ - uses: actions/setup-node@v6
71
+ with:
72
+ node-version: '24'
73
+ cache: 'npm'
74
+
75
+ - name: Verify Node.js version
76
+ shell: bash
77
+ run: |
78
+ ACTUAL=$(node --version)
79
+ EXPECTED_MAJOR="24"
80
+ if [[ "$ACTUAL" != v${EXPECTED_MAJOR}.* ]]; then
81
+ echo "::error::setup-node installed Node ${EXPECTED_MAJOR} but \`node --version\` reports $ACTUAL"
82
+ echo "::error::This usually indicates a transient download failure or partial toolcache extract."
83
+ exit 1
84
+ fi
85
+ echo "Node.js version confirmed: $ACTUAL"
86
+
87
+ - name: Install dependencies
88
+ run: npm ci
89
+ - language: yaml
90
+ label: 'Pin to exact patch version to reduce toolcache misses'
91
+ code: |
92
+ steps:
93
+ - uses: actions/setup-node@v6
94
+ with:
95
+ node-version: '24.15.0' # exact pin reduces manifest/toolcache lookup failures
96
+ cache: 'npm'
97
+
98
+ - name: Verify Node.js version (belt-and-suspenders)
99
+ run: |
100
+ node --version | grep -E '^v24\.15\.' || (echo "Wrong Node version" && exit 1)
101
+ prevention:
102
+ - 'Always verify node --version matches the requested major after setup-node, especially in workflows that depend on Node.js 24+ features or native modules.'
103
+ - 'Pin to an exact patch version (e.g. 24.15.0) rather than a range (24.x) to avoid unexpected toolcache miss fallbacks.'
104
+ - 'If you see "Attempting to download X.Y.Z..." followed by an unusually long pause in setup-node output, the download may have stalled and the fallback path may be active.'
105
+ - 'Watch setup-node releases for a built-in post-install assertion fix (tracked in actions/setup-node#1556 and actions/toolkit#804).'
106
+ docs:
107
+ - url: 'https://github.com/actions/setup-node/issues/1556'
108
+ label: 'setup-node #1556 — setup-node silently falls through to runner-baked Node on download/extract failure'
109
+ - url: 'https://github.com/actions/toolkit/issues/804'
110
+ label: 'actions/toolkit #804 — Concurrent toolcache writes cause partial extracts on multi-tenant runners'
111
+ - url: 'https://github.com/n8n-io/n8n/pull/30849'
112
+ label: 'n8n/n8n PR #30849 — External Verify Node.js Version workaround'
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@htekdev/actions-debugger",
3
- "version": "1.0.109",
3
+ "version": "1.0.110",
4
4
  "description": "65+ real GitHub Actions errors, queryable by agents. CLI + MCP server + Copilot skills + error database.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",