Skip to content

fix: retire EOL Node 20 so CI is green again; add Node 26 - #85

Merged
fabriciojs merged 2 commits into
masterfrom
fix/drop-node-20-eol
Oct 22, 2026
Merged

fabriciojs merged 2 commits into
masterfrom
fix/drop-node-20-eol

Conversation

@fabriciojs

@fabriciojs fabriciojs commented Oct 22, 2026 •

Copy link
Copy Markdown
Member

Two commits: retire EOL Node 20 (the CI fix), then add Node 26.

Why

Scheduled CI has failed every week since 2026-07-12. The failure starts at RUN npm i --location=global npm@latest on the 20 image:

npm error notsup Not compatible with your version of node/npm: npm@12.0.2
npm error notsup Required: {"node":"^22.22.2 || ^24.15.0 || >=26.0.0"}
npm error notsup Actual:   {"npm":"10.8.2","node":"v20.20.2"}

Because of fail-fast, that one failure cancels every other job. So no images (22, 24, 24-nginx) have been pushed since 2026-07-05. GitHub then turned the workflow off for inactivity. I've turned it back on.

Change

  • Drop the 20 build: the directory, fwd-template.json, kool.yml, and both CI matrices. Node 20 reached EOL on 2026-04-30 (last release 20.20.2), and the upstream node:20-alpine image no longer changes.

  • README: move 20 into Legacy tags, linking to the last commit that has its Dockerfile. The published kooldev/node:20 tag stays on Docker Hub. This follows how 16, 18 and 21 were retired.

  • Add Node 26 (becomes LTS on 2026-10-28). 26/ is generated from the template through fwd-template.json + kool run template, and is wired into kool.yml, both CI matrices and the README.

  • Template: node:26-alpine no longer ships yarn, so the template now runs command -v yarn || npm install -g yarn. For 22 and 24 nothing changes: yarn is still the base image's /opt/yarn-v1.22.22. On 26 it's installed with npm, also 1.22.22.

Verified locally (arm64)

image node npm
22 v22.23.4 (security release, 2026-10-20) 12.2.1
24 v24.22.1 (security release, 2026-10-20) 12.2.1
26 v26.12.1 (security release, 2026-10-21) 12.2.1

The CI smoke tests (node/npm/yarn -v, with and without ASUSER=1000) pass for all three. 24-nginx also builds.

Decisions / deviations

  • Retire 20 rather than pin npm for it. Pinning (npm@11 for 20 only) would keep rebuilding a Node line that gets no more fixes. Retiring it matches what was done for earlier EOL tags.
  • Keep yarn on 26 instead of dropping it and skipping the yarn -v check for 26. kool presets expect yarn, so all tags keep the same tools.
  • Known existing behavior, not changed here: 24-nginx builds FROM kooldev/node:24 from Docker Hub while 24 builds in parallel, so it is always one cycle behind. After this merges, run the workflow a second time so 24-nginx picks up 24.22.1.

🤖 Generated with Claude Code

npm@latest (12.x) requires node ^22.22.2 || ^24.15.0 || >=26, so the
`npm i -g npm@latest` step fails on node:20-alpine and fail-fast cancels
every other job. Node 20 reached EOL on 2026-04-30 and its upstream image
is frozen; the published kooldev/node:20 tag stays on Docker Hub as legacy.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Copilot AI balanced review requested due to automatic review settings October 22, 2026 01:43

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟢 Approval recommended

The scoped retirement is consistent across generation, local builds, CI, and documentation, with no unresolved issues identified.

No open issues 🎉

What changed in this PR

Retires the EOL Node 20 image from generation and build pipelines to resolve the scheduled CI failure, while documenting that its published Docker Hub tag remains available.

Changes:

  • Removes Node 20 from template generation, local builds, and both CI matrices.
  • Deletes the Node 20 Dockerfile and supporting files.
  • Moves Node 20 to the README’s legacy tags with a historical Dockerfile link.
File Description
README.md Lists Node 20 as legacy and links its historical Dockerfile.
kool.yml Removes the local Node 20 build command.
fwd-template.json Removes Node 20 template generation.
20/​root-npmrc Deletes retired root package-manager settings.
20/​kool-npmrc Deletes retired user package-manager settings.
20/​entrypoint Deletes the retired image’s entrypoint.
20/​Dockerfile Deletes the Node 20 image definition.
.github/​workflows/​ci-cd.yml Removes Node 20 from build and publishing matrices.

Review effort: Balanced

Rendered from the template like the other versions. node:26-alpine no
longer ships yarn, so the template installs it only when missing; 22 and
24 keep the yarn from their base images.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@fabriciojs fabriciojs changed the title fix: drop EOL Node 20 build so scheduled CI is green again fix: retire EOL Node 20 so CI is green again; add Node 26 Oct 22, 2026
@fabriciojs
fabriciojs merged commit 0b416ff into master Oct 22, 2026
9 checks passed
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.

2 participants