Skip to content

ci: build and tag the Current and all supported LTS releases - #336

Merged
chorrell merged 5 commits into
mainfrom
ci/build-lts-and-current
Sep 29, 2026
Merged

chorrell merged 5 commits into
mainfrom
ci/build-lts-and-current

Conversation

@chorrell

@chorrell chorrell commented Sep 29, 2026 •

Copy link
Copy Markdown
Owner

Builds and publishes the latest Node.js Current release and the latest release of every supported LTS line (Active and Maintenance) instead of a single version, and tags them by release line.

Tag rules

get-build-targets.sh (replaces check-missing-versions.sh) reads the Node.js release index, ordered by version, not release date, and the release schedule for end-of-life dates, and emits a JSON build matrix of {version, major, tags}:

Tag Applied to
<version> every build
<major> the newest release of that major
<codename> (e.g. krypton) the newest release of that LTS line
lts the newest Active LTS release
current the highest version, only while that line is not yet LTS
latest the highest version overall

Today: 26.10.0 → 26, current, latest; 24.21.0 → 24, krypton, lts; 22.23.3 → 22, jod. 20.x has reached end-of-life and is not built; 22 drops out automatically after 2027-04-30.

Gap behaviour: after a major enters LTS and before the next major ships, there is no Current release. latest follows the new LTS release and current stays on the last Current release.

Ordering by version matters: by date, 22.23.3 (Sep 23) is newer than 26.10.0 (Sep 21).

Workflow changes

  • update-current-image.yml: build and merge are matrices over the targets. Staging tags include the version, and each target's merge runs independently, so one broken line doesn't block the other. LTS builds no longer overwrite current/latest, and manual rebuilds of older patches no longer move the major tag.
  • dockerimage.yml: PR builds test every target (Current and each supported LTS line).
  • tests.yml (new): runs the Bats suite on PRs that touch the script or tests, and weekly so the live integration test catches upstream changes to the release index or schedule. Previously the tests only ran locally.
  • ccache keys and buildx cache scopes are now per major version so parallel targets don't evict each other. The first runs after merge will build from a cold cache.

Testing

  • test/get-build-targets.bats: 20 tests, mostly offline against fixture indexes and a fixture schedule in test/fixtures/ (Current, Active and Maintenance LTS, end-of-life cutoff, no-Current gap, SKIP_VERSIONS fallback, -n manual versions)
  • actionlint, zizmor, shellcheck, shfmt, markdownlint pass

Not testable in this PR: the publish path (merge matrix and tag loop) only runs after merge. The first scheduled run will publish 24.21.0 and 22.23.3 if they're not on Docker Hub yet, moving 24/22 and adding krypton, jod, and lts. Consider triggering workflow_dispatch after merge and watching it.

🤖 Generated with Claude Code

chorrell and others added 3 commits September 28, 2026 22:34
Replace check-missing-versions.sh with get-build-targets.sh, which
resolves the latest Current and Active LTS releases (ordered by
version, not release date) and the tags each should be published
under: exact version, major, LTS codename, lts, current, and latest.

The publish workflow now builds a matrix over those targets instead of
a single version, so LTS builds no longer steal the current/latest
tags, and older patch builds no longer move the major tag. Staging
tags, ccache keys, and buildx cache scopes include the version/major
so parallel targets don't collide.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Let a target's merge job run even if another target's build failed, so
one broken release line doesn't block publishing the other. Name the
matrix jobs by version and platform, and note in the README that the
major and codename tags stop updating once a line leaves Active LTS.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Build the latest release of every LTS line that hasn't reached
end-of-life, using the end dates from the nodejs/Release schedule, so
the major and codename tags of Maintenance LTS lines (e.g. 22, jod)
keep receiving updates until end-of-life.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@chorrell chorrell changed the title ci: build and tag both the Current and Active LTS releases ci: build and tag the Current and all supported LTS releases Sep 29, 2026
chorrell and others added 2 commits September 28, 2026 22:44
The Bats suite only ran locally. Run it on PRs that touch the script or
tests, and weekly so the live integration test catches upstream changes
to the Node.js release index or schedule.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@chorrell
chorrell merged commit 0e4e5df into main Sep 29, 2026
11 checks passed
@chorrell
chorrell deleted the ci/build-lts-and-current branch September 29, 2026 14:02
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