CI jobs fail with "node: not found" (exit 127): Alpine job image can't run JS actions #28
Labels
No labels
breaking
bug
documentation
enhancement
epic
good first issue
help wanted
refactoring
resolution/duplicate
resolution/invalid
resolution/wontfix
security
severity/critical
severity/high
severity/low
severity/medium
status/abandoned
status/blocked
status/needs-decision
status/needs-info
status/needs-verification
testing
upstream
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
sixfold-space/madtea#28
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
Every job in
.forgejo/workflows/ci.yml(and thesurface-diffjob indrift.yml) fails immediately on Forgejo Actions, in thecheckoutstep (thefirst step of every job), with:
OCI runtime exec failed: exec failed: unable to start container process:
exec: "node": executable file not found in $PATH
⚙️ [runner]: exitcode '127': command not found
Because it fails at
checkout, no job ever reaches its actual work.Root cause
The jobs run in
container: golang:1.26-alpine. Alpine is musl-libc and shipsno Node. Forgejo Actions runs JavaScript actions (
checkout,cache,hashFiles) by executingnodeinside the job container, and the Node used torun those actions is glibc-linked — it cannot exec under musl. So
checkoutdies with exit 127 before running. (Same class of problem as nektos/act#107.)
The gated
forgejo-smokejob indrift.ymlalready uses the glibcgolang:1.26image, so it is unaffected.Fix
Run the jobs on a glibc base image — e.g.
golang:1.26-trixie(Debian) — forall
ci.ymljobs anddrift.yml'ssurface-diff. As a consequence, thetool-install steps that use Alpine's
apkmust switch toapt-get:golang:1.26-trixiealready ships bash, git and python3, so thegosec"install bash" step and the
third-party-licensesapk addstep are nolonger needed.
hook-testsinstallsjqviaapt-get.mcp-conformanceinstallsnodejs+npmviaapt-get.gcc, whichgo test -racerequires.Already resolved on main before this branch started: PR #27 (commit
36efc3a7, "fix(ci): run jobs on Debian glibc image so JS actions get a working node") made exactly this change. Verified against main atdf485ceeby an independent build+review pass: all 14 ci.yml jobs and drift.yml's surface-diff run on docker.io/golang:1.26-trixie (glibc, pinned by digest); no apk steps remain (jq via apt-get in hook-tests, nodejs+npm via apt-get in mcp-conformance; trixie ships bash/python3/gcc so the gosec and third-party-licenses install steps are gone); forgejo-smoke untouched; both YAML files parse; Go stays 1.26; full gate green. The dev branch for this issue had zero delta vs main, so there is nothing to merge.