#202: SBOM and license report in CI #258

Merged
fable-5 merged 1 commits from feat/202-sbom-license-report into main 2026-07-31 04:51:41 +02:00
Collaborator

Stacked on #257 (#236) — reduces to one commit after its merge. Issue #202.

  • Release run generates CycloneDX 1.6 SBOMs via pinned anchore/syft:v1.33.0 — one per released image (from the built image tar, OS packages included) and one for the pnpm workspace (from the lockfile) — plus the full pnpm licenses report; all attached as supply-chain-vX.Y.Z build artefacts BEFORE the release publishes (red gate stops the release).
  • Runner constraints (documented in the workflow comment): job talks to the HOST daemon, so no bind mounts — files enter the syft container via docker cp, images via docker save to a tar copied the same way (syft cannot read tar from stdin; verified).
  • License policy lives in scripts/check-licenses.mjs: permissive allowlist + MPL-2.0/CC-BY-4.0 with recorded reasoning + per-package exceptions (khroma ships the MIT text but omits the metadata field). CI runs the gate on every PR; local pnpm licenses:check.
  • Locally verified: gate positive (1125 packages green) and negative (fabricated GPL fails), workspace SBOM (1382 components) and image SBOM (1047 components) generated against real inputs.
  • Provenance/regeneration documented in security.md §Supply chain artefacts; SBOM publication note for #228 follows as issue comment after merge.
Stacked on #257 (#236) — reduces to one commit after its merge. Issue #202. - Release run generates CycloneDX 1.6 SBOMs via pinned anchore/syft:v1.33.0 — one per released image (from the built image tar, OS packages included) and one for the pnpm workspace (from the lockfile) — plus the full pnpm licenses report; all attached as `supply-chain-vX.Y.Z` build artefacts BEFORE the release publishes (red gate stops the release). - Runner constraints (documented in the workflow comment): job talks to the HOST daemon, so no bind mounts — files enter the syft container via `docker cp`, images via `docker save` to a tar copied the same way (syft cannot read tar from stdin; verified). - License policy lives in `scripts/check-licenses.mjs`: permissive allowlist + MPL-2.0/CC-BY-4.0 with recorded reasoning + per-package exceptions (khroma ships the MIT text but omits the metadata field). CI runs the gate on every PR; local `pnpm licenses:check`. - Locally verified: gate positive (1125 packages green) and negative (fabricated GPL fails), workspace SBOM (1382 components) and image SBOM (1047 components) generated against real inputs. - Provenance/regeneration documented in security.md §Supply chain artefacts; SBOM publication note for #228 follows as issue comment after merge.
fable-5 added 3 commits 2026-07-31 04:22:13 +02:00
#236: pin the Node version
All checks were successful
CI / Lint, typecheck, test (pull_request) Successful in 5m40s
CI / Build container images (pull_request) Successful in 4m15s
CI / Auth e2e pack (pull_request) Successful in 8m33s
CI / Import/export fidelity gate (pull_request) Successful in 59s
6a520e27b1
.node-version (22.15.1) becomes the single authoritative Node version:
CI/CD select Node only via node-version-file, every Dockerfile pins
node:22.15.1-alpine, and the engines floor in package.json states the
same version (open-ended upwards so a newer local Node keeps working —
reproducibility rests on images and CI). An early CI step fails on any
drift between those places; update procedure in operations.md
(Update strategy). Precondition for the reproducibility claim in #219.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0168Ph5uBmHm8X28CSVpbpnJ
#236: also pin the node helper images in workflows
All checks were successful
CI / Lint, typecheck, test (pull_request) Successful in 5m41s
CI / Build container images (pull_request) Successful in 3m9s
CI / Auth e2e pack (pull_request) Successful in 8m32s
CI / Import/export fidelity gate (pull_request) Successful in 1m7s
CD / Build and push images (push) Successful in 21s
CD / Deploy to Test (push) Successful in 12s
CD / Smoke tests against Test (push) Successful in 1m17s
CD / Promote to Int (push) Successful in 11s
CI / Lint, typecheck, test (push) Successful in 6m0s
CI / Build container images (push) Has been skipped
CI / Auth e2e pack (push) Successful in 8m32s
CI / Import/export fidelity gate (push) Successful in 1m3s
9326177534
release.yml and drill.yml ran throwaway `docker run node:22.15-alpine`
helpers outside the pin; the drift check now also fails on any
node:<other>-alpine reference in .gitea/workflows.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0168Ph5uBmHm8X28CSVpbpnJ
#202: SBOM and license report in CI
Some checks failed
CI / Lint, typecheck, test (pull_request) Successful in 5m33s
CI / Build container images (pull_request) Successful in 4m38s
CI / Auth e2e pack (pull_request) Successful in 9m14s
CI / Import/export fidelity gate (pull_request) Successful in 1m12s
CD / Smoke tests against Test (push) Blocked by required conditions
CD / Deploy to Test (push) Blocked by required conditions
CD / Promote to Int (push) Blocked by required conditions
CI / Auth e2e pack (push) Blocked by required conditions
CI / Build container images (push) Blocked by required conditions
CI / Lint, typecheck, test (push) Waiting to run
CI / Import/export fidelity gate (push) Blocked by required conditions
CD / Build and push images (push) Has been cancelled
d3289b2167
The release run now generates CycloneDX 1.6 SBOMs with a pinned
anchore/syft container — one per released image (scanned from the
freshly built image tar, OS packages included) and one for the pnpm
workspace (from the lockfile) — plus the full pnpm licenses report, and
attaches everything as build artefacts BEFORE publishing the release,
so a red gate stops the release. Runner constraints dictated the
mechanics (documented in the workflow): the job talks to the HOST
daemon, so files travel into the syft container via docker cp and
images via docker save to a tar copied the same way (syft cannot read
a tar from stdin — verified).

scripts/check-licenses.mjs is the documented license policy: permissive
allowlist, MPL-2.0/CC-BY-4.0 with recorded reasoning, per-package
exception table (khroma: MIT text shipped, metadata missing). CI runs
the gate on every PR (pnpm licenses:check); positive and negative case
tested locally, both SBOM paths tested against real images/lockfile.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0168Ph5uBmHm8X28CSVpbpnJ
fable-5 merged commit d3289b2167 into main 2026-07-31 04:51:41 +02:00
Sign in to join this conversation.
No description provided.