[VS-NfD] Pin the Node version #236

Closed
opened 2026-07-30 01:44:02 +02:00 by fable-5 · 1 comment
Collaborator

Plan reference: n/a — 10-ist-aufnahme.md -> I-26
ADR: ADR 0024
Effort: S (0,5 AT)
Depends on:

Context

A reproducible offline build cannot rest on "any Node ≥ 22". This is a
precondition for the reproducibility claim in #219, which is why it lands
before the offline milestone.

Current state

  • package.json:7–10: "engines": { "node": ">=22" } — a lower bound, not
    a pin. "packageManager": "pnpm@11.9.0" is exact, so the pattern for
    pinning is already established in the same file.
  • Dockerfiles and CI (.gitea/workflows/ci.yml, actions/setup-node@v4)
    each select a version independently.

Acceptance criteria

  • One authoritative Node version is declared and consumed by CI, the
    Dockerfiles and local development; a drift between them fails CI.
  • The update procedure for that version is documented (it will need
    raising for security fixes).
  • The version is stated in #228 alongside the other toolchain
    versions.

Out of scope

Changing the Node major, and pinning image digests (#203).

**Plan reference:** n/a — `10-ist-aufnahme.md` -> I-26 **ADR:** ADR 0024 **Effort:** S (0,5 AT) **Depends on:** — ## Context A reproducible offline build cannot rest on "any Node ≥ 22". This is a precondition for the reproducibility claim in #219, which is why it lands before the offline milestone. ## Current state - `package.json:7–10`: `"engines": { "node": ">=22" }` — a lower bound, not a pin. `"packageManager": "pnpm@11.9.0"` is exact, so the pattern for pinning is already established in the same file. - Dockerfiles and CI (`.gitea/workflows/ci.yml`, `actions/setup-node@v4`) each select a version independently. ## Acceptance criteria - [ ] One authoritative Node version is declared and consumed by CI, the Dockerfiles and local development; a drift between them fails CI. - [ ] The update procedure for that version is documented (it will need raising for security fixes). - [ ] The version is stated in #228 alongside the other toolchain versions. ## Out of scope Changing the Node major, and pinning image digests (#203).
fable-5 added this to the M25 — VS-NfD: hardening & supply chain milestone 2026-07-30 01:44:02 +02:00
fable-5 added the
vs-nfd
effort:S
area:supply-chain
labels 2026-07-30 01:44:02 +02:00
fable-5 referenced this issue from a commit 2026-07-31 04:14:56 +02:00
Author
Collaborator

Implemented in PR #257 (commits 6a520e2 + 9326177, CI run 520 green, fast-forward merged per Stefan's standing go-ahead for this issue block).

Evidence against the acceptance criteria:

  • One authoritative version: .node-version (22.15.1 — the patch the previously floating 22.15 tag already resolved to). Consumed by CI/CD via node-version-file (3 ci.yml jobs + cd.yml), by all four Dockerfiles (node:22.15.1-alpine), by the throwaway helper containers in release.yml/drill.yml, and offered to local development via the .node-version convention (engines floor raised to >=22.15.1, open-ended upwards).
  • Drift fails CI: new early step 'Node version pin is consistent' checks Dockerfile tags, forbids literal node-version: in workflows, checks helper-image refs and the engines floor; positive and negative case tested locally.
  • Update procedure documented in docs/architecture/operations.md (Update strategy).
  • Toolchain versions for #228: Node 22.15.1 (.node-version), pnpm 11.9.0 (packageManager), postgres 17.5-alpine (CI service/stage compose), pandoc/core:3.6 (fixtures), gotenberg 8 (compose; digest pinning is #203).

CD verification follows on the main-push run.

Implemented in PR #257 (commits 6a520e2 + 9326177, CI run 520 green, fast-forward merged per Stefan's standing go-ahead for this issue block). Evidence against the acceptance criteria: - One authoritative version: .node-version (22.15.1 — the patch the previously floating 22.15 tag already resolved to). Consumed by CI/CD via node-version-file (3 ci.yml jobs + cd.yml), by all four Dockerfiles (node:22.15.1-alpine), by the throwaway helper containers in release.yml/drill.yml, and offered to local development via the .node-version convention (engines floor raised to >=22.15.1, open-ended upwards). - Drift fails CI: new early step 'Node version pin is consistent' checks Dockerfile tags, forbids literal node-version: in workflows, checks helper-image refs and the engines floor; positive and negative case tested locally. - Update procedure documented in docs/architecture/operations.md (Update strategy). - Toolchain versions for #228: Node 22.15.1 (.node-version), pnpm 11.9.0 (packageManager), postgres 17.5-alpine (CI service/stage compose), pandoc/core:3.6 (fixtures), gotenberg 8 (compose; digest pinning is #203). CD verification follows on the main-push run.
Sign in to join this conversation.
No project
No Assignees
1 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: stwaidele/dorfteich#236
No description provided.