Skip to content

chore: bump Node 22 -> 24 (Active LTS) - #28

Merged
guarzo merged 1 commit into
tooling-depsfrom
node-24
Aug 3, 2026
Merged

chore: bump Node 22 -> 24 (Active LTS)#28
guarzo merged 1 commit into
tooling-depsfrom
node-24

Conversation

@guarzo

@guarzo guarzo commented Aug 3, 2026

Copy link
Copy Markdown
Owner

Stacked on #24merge #24 first. This branch is based on tooling-deps, not main, because it corrects two hard-coded Node majors in the comments #24 adds to .github/dependabot.yml. Once #24 merges, GitHub will retarget this to main and the diff will be the eight files below.

What changed and why

Node 22 went to Maintenance LTS on 2025-10-21. Node 24 is the current Active LTS line (maintenance 2026-10-20, EOL 2028-04-30), verified against nodejs/Release/schedule.json. Production should run Active LTS.

scripts/check-node-version.sh forces the Dockerfile, .nvmrc and package.json engines to agree on the major, so all three move in one commit, plus @types/node ^22 -> ^24 so the types describe the runtime that actually ships. engines: >=24 still accepts a local Node 26.

Note 26 was not chosen: it is Current, not LTS, until 2026-10-28.

The --env-file-if-exists (Node 22.9) rationale is preserved in .npmrc, the Dockerfile and docs/ops.md. The floor is now far above it, but it is still why engine-strict=true is load-bearing — npm run db:migrate is fly.toml's release_command.

What CI cannot check

docker build — CI does not build the image, so this was run locally against the real node:24-alpine:

#22 exporting to image
#22 writing image sha256:d54e17bd063a029584a22c636784f395741ac87edf5269d90631a18ff76dda49 done
#22 naming to docker.io/library/authgd:node24-check 0.0s done
#22 DONE 3.9s

Both npm ci stages passed under engine-strict=true, and the runtime image parses the flag the floor exists for:

$ docker run --rm authgd:node24-check node --version
v24.18.1
$ docker run --rm authgd:node24-check sh -c 'node --env-file-if-exists=.env.nope -e "console.log(1)"'
.env.nope not found. Continuing without it.
1

Everything CI does run was also run locally:

  • bash scripts/check-node-version.sh -> node version OK: Dockerfile=24 .nvmrc=24 engines='>=24'
  • npm run typecheck -> clean
  • npm run lint -> 4 problems (0 errors, 4 warnings) — the pre-existing @next/next/no-img-element warnings, unchanged
  • npm run format:check -> All matched files use Prettier code style!
  • npm run build -> succeeded, 15 routes
  • npm test -> Test Files 44 passed (44) / Tests 313 passed (313)
  • npm run test:e2e -> 8 passed (19.9s)

Unit and e2e were run serially against a dedicated Postgres on :5434, not the shared :5433.

Deploy notes

The next deploy after this merges builds on node:24-alpine and runs the release db:migrate on Node 24. No migration, no secret, no fly.toml change.

Flags

  • CI takes its Node from node-version-file: .nvmrc, so there was no separate CI pin to update — the bump propagates automatically.
  • npm install reports 8 pre-existing vulnerabilities (4 moderate, 4 high). Unrelated to this change; Dependabot security alerts are now enabled and will file them individually.

Node 22 entered Maintenance LTS on 2025-10-21; 24 is the current Active
LTS line (maintenance 2026-10-20, end-of-life 2028-04-30). Production
should run Active LTS, so all three pins that
scripts/check-node-version.sh forces to agree move together:
Dockerfile (both stages), .nvmrc, and package.json engines. @types/node
moves to ^24 in the same commit so the types match the runtime rather
than describing APIs it does not have.

The Node 22.9 --env-file-if-exists rationale is preserved in .npmrc,
the Dockerfile, and docs/ops.md — the floor is now well above it, but
that is still why engine-strict is load-bearing for the release
command.

Also corrects the two hard-coded majors in the dependabot.yml comments
added by the preceding commit, which is why this is stacked on
tooling-deps.
@coderabbitai

coderabbitai Bot commented Aug 3, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 8f151bbb-9baf-4acb-870b-99c08bba93a9

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Comment @coderabbitai help to get the list of available commands.

@guarzo
guarzo merged commit d6f0e85 into tooling-deps Aug 3, 2026
4 checks passed
guarzo added a commit that referenced this pull request Aug 3, 2026
* chore: add Dependabot config and a PR template

Dependabot over Renovate: 25 dependencies and one maintainer do not justify
installing a third-party GitHub App with write access. Dependabot's grouping
covers the need with no added trust surface and no infrastructure.

Grouping is ordered first-match-wins so that things which must move together
do (React + its types, drizzle-orm + drizzle-kit), tooling churn batches into
one CI run, and MAJORS of the runtime dependencies — next, zod, pg, pg-boss,
jose, tsx, typescript — match no group and so arrive as individual PRs. Steady
state is roughly one to three PRs a week rather than twenty.

`applies-to` is left unset, so this governs version updates only: security
updates stay ungrouped and immediate.

@types/node majors are ignored. They track Node majors, which this repo pins
in three files that scripts/check-node-version.sh forces to agree; types ahead
of the runtime pass typecheck and fail at execution instead.

The docker ecosystem is deliberately absent — reasoning in the file.

The PR template asks only for what CI cannot check: hand-run verification,
deploy ordering (secrets before the deploy, migration safety), and unprompted
findings. No CODEOWNERS: see the PR description.

* chore: bump Node 22 -> 24 (Active LTS) (#28)

Node 22 entered Maintenance LTS on 2025-10-21; 24 is the current Active
LTS line (maintenance 2026-10-20, end-of-life 2028-04-30). Production
should run Active LTS, so all three pins that
scripts/check-node-version.sh forces to agree move together:
Dockerfile (both stages), .nvmrc, and package.json engines. @types/node
moves to ^24 in the same commit so the types match the runtime rather
than describing APIs it does not have.

The Node 22.9 --env-file-if-exists rationale is preserved in .npmrc,
the Dockerfile, and docs/ops.md — the floor is now well above it, but
that is still why engine-strict is load-bearing for the release
command.

Also corrects the two hard-coded majors in the dependabot.yml comments
added by the preceding commit, which is why this is stacked on
tooling-deps.

* Update .github/pull_request_template.md

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* Update .github/pull_request_template.md

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

---------

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
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