Skip to content

chore(deps): move the web image's Node base to 24 (Active LTS) - #161

Merged
pofallon merged 1 commit into
mainfrom
chore/node-24-lts-base-image
Aug 7, 2026
Merged

chore(deps): move the web image's Node base to 24 (Active LTS)#161
pofallon merged 1 commit into
mainfrom
chore/node-24-lts-base-image

Conversation

@pofallon

@pofallon pofallon commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

Supersedes #156.

Why not #156

Dependabot proposed node:20-slimnode:25-slim. Both tags are end-of-life. From Node's own schedule.json:

Version LTS start EOL Status today
20 (current pin) 2023-10-24 2026-04-30 EOL
22 (Jod) 2024-10-29 2027-04-30 LTS, in maintenance
24 (Krypton) 2025-10-28 2028-04-30 Active LTS ← this PR
25 (#156) never — odd-numbered 2026-06-01 EOL

Node 25 is a "Current" release that never becomes LTS. Merging #156 would have swapped one unpatched base image for another — the exact failure the docker ecosystem entry added in #154 exists to prevent. Node 24 is supported until 2028-04-30 and doesn't enter maintenance until 2026-10-20.

The move off 20 is overdue regardless; only the target was wrong.

What's here

  1. docker/Dockerfile — frontend-builder stage → node:24-slim
  2. .github/workflows/ci.ymlsetup-node pin 2024. Left behind, CI would typecheck and build the frontend on a different major than the shipped image builds it with.
  3. tests/image/test_docker_image.py — the two hardcoded node:20-slim strings (module docstring, skip reason)
  4. .github/dependabot.yml — the ecosystem comment's stale node:20-slim
  5. .github/dependabot.ymlignore semver-major for node. Dependabot picks the highest published tag and has no concept of release lines, so it will keep proposing odd majors (26 lands 2026-10-28, 27 a year later). Node majors get picked by hand on the LTS cadence; minor/patch bumps — the ones carrying base-image CVE fixes — keep flowing untouched.

Verification

  • Full multi-stage docker build -f docker/Dockerfile succeeds; the built image runs (remo 4.3.3) and carries the SPA at /app/frontend-dist
  • npm ci && npm run build is warning-clean (no EBADENGINE) on both 24-slim and 25-slim, producing identical dist/ structure — this is a support-lifecycle change, not a compatibility fix
  • tests/image/ 21 passed, 14 skipped; frontend typecheck + build clean; both YAML files parse and the ignore entry resolves to exactly node / version-update:semver-major

🤖 Generated with Claude Code

https://claude.ai/code/session_01RcgFXhhdqGGzhk5Ardf9rk

The frontend-builder stage sat on node:20-slim, which went EOL on
2026-04-30 and no longer receives security patches. Dependabot noticed
and proposed node:25-slim (#156) -- but 25 is an odd-numbered "Current"
release that never becomes LTS and reached EOL on 2026-06-01, so that
bump swapped one unpatched base image for another. Node 24 (Krypton) is
Active LTS: supported until 2028-04-30, and it does not even enter
maintenance until 2026-10-20.

Dependabot picks the highest published tag and has no concept of Node's
release lines, so it will keep proposing odd majors (26 arrives
2026-10-28, 27 a year later). Ignore semver-major bumps for `node` in
the docker ecosystem and pick Node majors by hand on the LTS cadence;
minor/patch bumps, which carry the base-image CVE fixes this ecosystem
entry was added for, keep flowing untouched.

CI's setup-node pin moves 20 -> 24 in the same change: left behind, it
would typecheck and build the frontend on a different major than the
shipped image builds it with. The two `node:20-slim` strings in
tests/image/test_docker_image.py (a module docstring and a skip reason)
and the one in dependabot.yml's own comment are updated to match.

Verified locally: full multi-stage `docker build -f docker/Dockerfile`
succeeds, the built image runs (`remo 4.3.3`) and carries the SPA at
/app/frontend-dist; `npm ci && npm run build` is warning-clean on both
24-slim and 25-slim, so this is a support-lifecycle change, not a
compatibility fix.

Closes #156

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RcgFXhhdqGGzhk5Ardf9rk
@pofallon
pofallon merged commit 2f29b11 into main Aug 7, 2026
12 checks passed
@pofallon
pofallon deleted the chore/node-24-lts-base-image branch August 7, 2026 01:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant