Skip to content

frontend CI: node-next-test can never pass, and turns master red whenever it runs #872

Description

@suttondemlong

The frontend workflow is red on master. The job that fails is node-next-test, not the real test job — Test app passes in the same run. As far as I can tell the job has never been able to pass, so this is a CI configuration problem rather than a broken frontend.

What fails

Run 29792737096, on the merge of #847, all three matrix entries:

npm error code EBADENGINE
npm error engine Unsupported engine
npm error Not compatible with your version of node/npm: flaredown@0.0.0
npm error Required: {"bower":"1.x","node":"14.x","npm":"6.x"}
npm error Actual:   {"npm":"10.8.2","node":"v20.20.2"}

It never reaches npm run test — it dies at npm install.

Why

Two settings combine:

  • frontend/.npmrc sets engine-strict=true, which turns an engines mismatch from a warning into a hard error. Added 2021-10-12 in Downgrade Node to work around runtime issue #472.
  • frontend/package.json declares "engines": {"bower": "1.x", "node": "14.x", "npm": "6.x"}.

node-next-test runs a matrix of Node 16, 18 and 20. None of them satisfy 14.x, so npm install refuses on every entry.

This is not a regression from #847. The job was added on 2023-08-25 in 52e7d984, "Add CI for next Node versions for fun", and at that commit engines.node was already "12.22.6 || ^14" with engine-strict=true — which Node 16, 18 and 20 do not satisfy either. So no combination of matrix entry and engines value on master has ever worked.

Why it only looks broken sometimes

The job sits behind a paths filter (frontend/**, .github/workflows/**). Most merges to master do not touch those paths, so the job is skipped and the workflow reports success in about 10 seconds. #847 was the first change in a while that did touch them, so the job actually ran, and failed. The same thing happened at #815 in November 2025.

So the badge flips green and red based on whether the job ran, not on whether anything works. That is worth fixing on its own, because it makes the signal meaningless.

Options

  1. Make it non-blockingcontinue-on-error: true on the job. This matches what it was for; the commit that added it says "for fun", i.e. a forward-compatibility probe, not a gate.
  2. Delete it, and reintroduce it as part of an actual Node upgrade.
  3. Do the Node upgrade. There is already an unmerged node-upgrade branch (9a8f8754, "bot changes for node 14 to 20") that sets engines to {"node": ">=18.x", "npm": ">=8.x"} along with a large package-lock.json regeneration. That is the real fix, and much the biggest of the three.

Options 1 and 2 stop master being red today; option 3 is the actual goal.

Related: the Node versions named in the repo do not agree

Where Node
frontend/.tool-versions 14.21.3
frontend/package.json engines 14.x
frontend/Dockerfile 14.21.3-bullseye
frontend.yml Test app job 14
root .tool-versions, README Environment list, CLAUDE.md 12.22.6

The four that the frontend actually uses agree on 14, so local setup is fine —
asdf reads the nearest .tool-versions, which in frontend/ pins 14.21.3. It is
the repo-level documentation that is stale: the root .tool-versions and the
README Environment list still say 12.22.6, which is not the version the frontend
has used since #472. Minor, but worth correcting whenever this area is touched.

Found while looking at the CI badges in #871, which is a separate docs-only problem. Neither is related to #870.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions