chore(ci): bump ci-base image node 22 → 24-alpine #639

Merged
jason.woltje merged 1 commits from chore/ci-base-node-24-alpine into main 2026-06-23 00:59:40 +00:00
Owner

What

Bumps the pre-baked Woodpecker CI base image (Dockerfile.ci) from node:22-alpine to node:24-alpine (Active LTS). Comments in ci.yml/publish.yml updated for accuracy. No other behavior change.

Why now

This is the planned follow-up to the CI cache work (#635 consumer / #637 producer), deliberately sequenced after caching landed so the runtime-version change carries zero cache variables — if anything regresses, it's unambiguously the node bump, not the cache.

node:26 is intentionally held until it reaches LTS (Oct 2026): the Current line risks node-gyp native-module breakage on the musl runner, which compiles better-sqlite3, canvas, sharp, and node-pty from source.

Validation

⚠️ Note: ci-image.yml only rebuilds ci-base on push to main (Dockerfile.ci path filter) or tag — not on PRs — so this PR's own pipeline still pulls the existing node:22 image and does not exercise node:24. To avoid a blind merge, node:24-alpine was validated locally by building Dockerfile.ci and running the real pnpm install --frozen-lockfile --prefer-offline (compiling all native modules) on node:24-alpine + musl. On merge, the path filter triggers a fresh ci-base build and the next pipeline runs on node:24.

🤖 Generated with Claude Code

## What Bumps the pre-baked Woodpecker CI base image (`Dockerfile.ci`) from `node:22-alpine` to `node:24-alpine` (Active LTS). Comments in `ci.yml`/`publish.yml` updated for accuracy. No other behavior change. ## Why now This is the planned follow-up to the CI cache work (#635 consumer / #637 producer), deliberately sequenced **after** caching landed so the runtime-version change carries zero cache variables — if anything regresses, it's unambiguously the node bump, not the cache. `node:26` is intentionally **held** until it reaches LTS (Oct 2026): the Current line risks node-gyp native-module breakage on the musl runner, which compiles `better-sqlite3`, `canvas`, `sharp`, and `node-pty` from source. ## Validation ⚠️ Note: `ci-image.yml` only rebuilds `ci-base` on **push to main** (Dockerfile.ci path filter) or tag — **not on PRs** — so this PR's own pipeline still pulls the existing node:22 image and does *not* exercise node:24. To avoid a blind merge, node:24-alpine was validated locally by building `Dockerfile.ci` and running the real `pnpm install --frozen-lockfile --prefer-offline` (compiling all native modules) on node:24-alpine + musl. On merge, the path filter triggers a fresh ci-base build and the next pipeline runs on node:24. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
jason.woltje added 1 commit 2026-06-23 00:41:56 +00:00
chore(ci): bump ci-base image node 22 -> 24-alpine
Some checks failed
ci/woodpecker/push/ci Pipeline failed
ci/woodpecker/pr/ci Pipeline was successful
02cf88d0dd
Follow-up to the CI cache work (#635/#637), sequenced separately so the
runtime-version change carries zero cache variables. node:24 is Active
LTS; node:26 is held until it reaches LTS (Oct 2026) since the Current
line risks node-gyp native-module breakage (better-sqlite3, canvas,
sharp, node-pty compile from source on the musl runner).

Only Dockerfile.ci's base changes; ci.yml/publish.yml comments updated
for accuracy. The ci-base image rebuilds automatically on merge (the
Dockerfile.ci path filter in ci-image.yml).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
jason.woltje merged commit 78d67c6261 into main 2026-06-23 00:59:40 +00:00
Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: mosaicstack/stack#639