Repository navigation
Fix ARM32 internal tooling (hashFiles, etc.) defaulting to missing node24 - #243
Conversation
…ts for linux-armv7l) After syncing with upstream v2.338.0, armhf (linux-arm) runners started failing with errors like: Error: An error occurred trying to start process '.../externals/node24/bin/node' ... No such file or directory Root cause: NodeUtil.GetInternalNodeVersion() is used for *internal* runner tooling (hashFiles(), the macOS SIP re-invoker, .js-shell steps, and the NodeJsCheck/CheckUtil self-checks) and unconditionally defaults to node24, with no ARM32 awareness. This is separate from the per-action node version resolution path (HandlerFactory -> CheckNodeVersionForLinuxArm32), which was already patched to fall back to node22 on linux-arm. Node.js upstream no longer publishes linux-armv7l builds for Node 24+, so externals.sh (already patched here) only downloads node20/node22 on linux-arm - node24 is simply not present on disk, hence the failure. Fix: GetInternalNodeVersion() now also falls back to node22 on linux-arm, mirroring the existing CheckNodeVersionForLinuxArm32 pattern, while still honoring an explicit ACTIONS_RUNNER_FORCED_INTERNAL_NODE_VERSION override if set. ppc64le/s390x are unaffected since official node24 builds exist for those platforms. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
There was a problem hiding this comment.
🟡 Changes recommended
The release patch lacks the fallback, and ARM32 execution remains unvalidated.
2 open findings
What changed in this PR
Updates ARM32 internal tooling to fall back from unavailable Node 24 to bundled Node 22.
Changes:
- Adds ARM32 internal Node fallback logic.
- Updates ARM-specific test expectations.
- Adjusts the runner patch metadata.
| File | Summary |
|---|---|
patches/runner-main-sdk8-arm.patch |
Adds the ARM32 Node 22 fallback and related tests. |
🧠 Review effort: Lite
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
As flagged by Copilot review: the shipped runner tarball is built from patches/runner-sdk8-arm.patch (release.yml), not patches/runner-main-sdk8-arm.patch (build.yml, CI-only). The release patch's NodeUtil.cs changes only covered CheckNodeVersionForLinuxArm32 (the per-action path); it was still missing the GetInternalNodeVersion() fallback, so actual released armhf runners would still hit the node24 'No such file or directory' failure. Mirrors the same fix: GetInternalNodeVersion() falls back to node22 on linux-arm, plus the equivalent #if ARM/#else NodeUtilL0 test update. Verified: patch applies cleanly to a vanilla v2.338.0 clone, builds, and 70/70 targeted tests (NodeUtilL0/HandlerFactoryL0/StepHostNodeVersionL0) pass on linux-x64. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
|
Addressed both review findings:
|


Problem
After syncing with upstream v2.338.0, armhf (
linux-arm) runners started failing jobs that rely on internal runner tooling, e.g.:This is not the per-action (
uses:) node resolution path — that one (HandlerFactory→CheckNodeVersionForLinuxArm32) was already patched to fall back tonode22on ARM32 by #232.Root cause
NodeUtil.GetInternalNodeVersion()is a separate code path used for internal runner tooling, not per-action JS execution:hashFiles()(HashFilesFunction/NewHashFilesFunction) — the likely trigger here, via aCargo.lock-style cache keyScriptHandler).js-shell step resolution (HostContext)NodeJsCheck/CheckUtilrunner self-checksThis function unconditionally defaults to
node24(only overridable viaACTIONS_RUNNER_FORCED_INTERNAL_NODE_VERSION), with no ARM32 awareness.Separately, Node.js upstream no longer publishes
linux-armv7lbuilds for Node 24+, soexternals.sh(already patched in this fork) only downloadsnode20/node22onlinux-arm.node24simply doesn't exist on disk on armhf runners, so any of the call sites above fail with "No such file or directory".ppc64le/s390xare unaffected — officialnode24builds exist for those platforms, so no patch is needed there.Fix
NodeUtil.GetInternalNodeVersion()now also falls back tonode22onlinux-arm, mirroring the existingCheckNodeVersionForLinuxArm32pattern used by the per-action path, while still honoring an explicit forced-version override if one is set. Added/updatedNodeUtilL0.TestInternalNodeVersion(#if ARM/#else) to assertnode22as the ARM32 default.Patch-only change (
patches/runner-main-sdk8-arm.patch) — no directsrc/modifications, consistent with this fork's convention of keeping arch-specific fixes out of the upstream-synced tree.Validation so far
git apply --check) to a fresh vanilla upstream clone at the pinned baseline commit, and to this fork's currentmain../dev.sh build).NodeUtilL0,HandlerFactoryL0,StepHostNodeVersionL0) pass onlinux-x64(70/70) — confirms no regression to the non-ARM default (node24) path.ARMpreprocessor symbol / on real armhf hardware. Opening as draft pending that verification on an arm32 runner/VM.Other potential v2.338.0 upstream-sync fallout
Audited other direct
node24references (NodeScriptActionHandler,ActionManifestManager(Legacy)) — all are downstream of the already-patchedHandlerFactorypath or manifest-parsing validation only. No other ARM32/ppc64le/s390x gaps found in this pass.