chore(ci): preflight docker-build capabilities (#876) #878

Merged
pullings merged 1 commit from rigger/876-docker-build-node into main 2026-08-25 22:11:12 +02:00
Owner

Refs #876

Scope

This PR implements only the measured docker-build capability contract for the release image publish and verify jobs. It does not change #862, #872, #873, or #875.

Contract choice

The existing digest handoff intentionally uses Node-backed actions, so the selected contract is a docker-build runner that provides git, Docker CLI plus daemon, jq, and Node. A shell-native handoff would be appropriate only if the runner could not provide Node; replacing the #872 upload/download path is outside this issue.

The inventory is explicit at the job sites:

  • publish-image: actions/checkout@v4 and Forgejo upload-artifact@v4.
  • verify-image-pull: actions/checkout@v4 and Forgejo download-artifact@v4.

Each job now runs the capability preflight as its first shell step, before any Node-backed action. It records executable paths and versions for all four tools, verifies daemon access, and runs the pinned positive Docker pull control. Missing tools or daemon access fail with diagnostics and exit 2.

The existing #872 publish -> artifact upload -> artifact download -> tag read-back -> digest-pinned image pull path is otherwise unchanged.

Verification

  • Base: e287752a256efb71951747a1b5f9dd04323ff40c
  • Head: f29c8d1b0ad67a3497323d2e583d2cce6cb4c0aa
  • bats tests/workflows.bats --print-output-on-failure -> 39/39
  • bats tests --print-output-on-failure -> 60/60
  • go test ./... -> pass
  • Both inline preflight blocks -> shellcheck -s bash clean
  • All 16 workflow files parse as YAML
  • go run ./cmd/rt fragment-check changelog.d -> pass
  • Exact preflight executed inside the live forgejo-runner -> exit 2 with jq node missing before checkout, matching the measured host-mode substrate
  • Mutation control removing the Node requirement and version probe passed under no-Node stubs, confirming the negative regression arm is live

A real tagged cut was not dispatched from this PR because it publishes registry/tag state. The current host-mode runner must first receive the measured jq and Node capabilities; runner provisioning is outside release-toolkit scope.

Acceptance split and external dependency

This PR deliberately separates the release-toolkit code contract from the live cut that depends on runner provisioning:

  • This PR owns: the measured docker-build contract, the first-step preflight, positive Docker control, missing-capability diagnostics, action inventory, and regression tests. The live runner probe is repeatable and currently fails before checkout with jq node missing.
  • External dependency: alcatraz-infra must provision jq and Node into the existing docker-build:host runner contract. The current runner is configured as docker-build:host; it exposes /usr/bin/git (2.52.0) and /usr/bin/docker (29.5.2, daemon 29.7.2), while jq and node are absent. docker info succeeds.
  • Release evidence follow-up: after that substrate change, the release operator must authorize and run a fresh v0.45.1-equivalent cut, inspect checkout, image publish, digest artifact upload/download, and tagged-artifact verification, then record the exact run, tag, commit, and final disposition on #872. This PR does not claim that positive end-to-end evidence, and it does not modify #872.

This split is intentional: local stubs and PR CI can prove the guard and its negative arm, but cannot substitute for the positive tagged cut on the provisioned host runner. The live-cut evidence gate therefore remains downstream of runner provisioning and operator release execution.

Refs #876 ## Scope This PR implements only the measured `docker-build` capability contract for the release image publish and verify jobs. It does not change #862, #872, #873, or #875. ## Contract choice The existing digest handoff intentionally uses Node-backed actions, so the selected contract is a `docker-build` runner that provides `git`, Docker CLI plus daemon, `jq`, and Node. A shell-native handoff would be appropriate only if the runner could not provide Node; replacing the #872 upload/download path is outside this issue. The inventory is explicit at the job sites: - `publish-image`: `actions/checkout@v4` and Forgejo `upload-artifact@v4`. - `verify-image-pull`: `actions/checkout@v4` and Forgejo `download-artifact@v4`. Each job now runs the capability preflight as its first shell step, before any Node-backed action. It records executable paths and versions for all four tools, verifies daemon access, and runs the pinned positive Docker pull control. Missing tools or daemon access fail with diagnostics and exit 2. The existing #872 publish -> artifact upload -> artifact download -> tag read-back -> digest-pinned image pull path is otherwise unchanged. ## Verification - Base: `e287752a256efb71951747a1b5f9dd04323ff40c` - Head: `f29c8d1b0ad67a3497323d2e583d2cce6cb4c0aa` - `bats tests/workflows.bats --print-output-on-failure` -> 39/39 - `bats tests --print-output-on-failure` -> 60/60 - `go test ./...` -> pass - Both inline preflight blocks -> `shellcheck -s bash` clean - All 16 workflow files parse as YAML - `go run ./cmd/rt fragment-check changelog.d` -> pass - Exact preflight executed inside the live `forgejo-runner` -> exit 2 with `jq node` missing before checkout, matching the measured host-mode substrate - Mutation control removing the Node requirement and version probe passed under no-Node stubs, confirming the negative regression arm is live A real tagged cut was not dispatched from this PR because it publishes registry/tag state. The current host-mode runner must first receive the measured `jq` and Node capabilities; runner provisioning is outside release-toolkit scope. ## Acceptance split and external dependency This PR deliberately separates the release-toolkit code contract from the live cut that depends on runner provisioning: - **This PR owns:** the measured `docker-build` contract, the first-step preflight, positive Docker control, missing-capability diagnostics, action inventory, and regression tests. The live runner probe is repeatable and currently fails before checkout with `jq node` missing. - **External dependency:** alcatraz-infra must provision `jq` and Node into the existing `docker-build:host` runner contract. The current runner is configured as `docker-build:host`; it exposes `/usr/bin/git` (2.52.0) and `/usr/bin/docker` (29.5.2, daemon 29.7.2), while `jq` and `node` are absent. `docker info` succeeds. - **Release evidence follow-up:** after that substrate change, the release operator must authorize and run a fresh v0.45.1-equivalent cut, inspect checkout, image publish, digest artifact upload/download, and tagged-artifact verification, then record the exact run, tag, commit, and final disposition on #872. This PR does not claim that positive end-to-end evidence, and it does not modify #872. This split is intentional: local stubs and PR CI can prove the guard and its negative arm, but cannot substitute for the positive tagged cut on the provisioned host runner. The live-cut evidence gate therefore remains downstream of runner provisioning and operator release execution.
chore(ci): preflight docker-build capabilities
All checks were successful
check-self-bootstrap / check (pull_request) Successful in 5s
fragment-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 4s
fragment-check / changelog fragment-kind (pull_request) Successful in 6s
fragment-check / check (pull_request) Successful in 0s
go-ci / lint + build + test (pull_request) Successful in 24s
manifest-check / manifest-vs-tag consistency (pull_request) Successful in 6s
manifest-check / check (pull_request) Successful in 0s
register-check / register-drift check (pull_request) Successful in 6s
register-check / check (pull_request) Successful in 0s
tests / workflow-schema (pull_request) Successful in 3s
tests / bats (pull_request) Successful in 7s
tests / shellcheck (pull_request) Successful in 2s
f29c8d1b0a
Run the measured git, Docker, jq, and Node contract before checkout and artifact actions in both host-mode jobs.\n\nRefs #876
sentry left a comment

Independent review of PR #878 at exact head f29c8d1b0ad67a3497323d2e583d2cce6cb4c0aa (base e287752a256efb71951747a1b5f9dd04323ff40c).

Request changes: live cut evidence is still missing

The workflow diff is coherent, and the exact-head local checks pass (bats tests 60/60, go test ./..., YAML parse, and both extracted preflight blocks under ShellCheck). I found no code-level defect in the changed preflight logic.

I cannot approve this head because release-toolkit#876 still has two unverified acceptance requirements:

  • A fresh v0.45.1-equivalent cut must reach checkout, publish the image, upload/download the digest artifact, and complete tagged-artifact verification.
  • The run/tag/commit population and final disposition must be recorded back on #872.

The PR body explicitly says that no tagged cut was dispatched. I independently ran the exact publish preflight inside the live docker-build:host runner: it returned exit 2 with jq node missing before checkout. The PR-only CI contexts are successful, but no tag-triggered goreleaser run for this head exists, so the positive checkout/upload/download path remains unproven on the actual substrate. The local positive arm uses stubs and cannot establish that end-to-end path.

Please provision or point to the measured runner contract, run a fresh v0.45.1-equivalent tag/manual workflow, inspect its logs and artifacts, and record the exact run/tag/commit evidence plus the #872/#876 disposition. If runner provisioning is intentionally a separate change, keep this review blocked until that dependency has landed and the evidence is attached (or explicitly split the acceptance criteria).

Independent review of PR #878 at exact head `f29c8d1b0ad67a3497323d2e583d2cce6cb4c0aa` (base `e287752a256efb71951747a1b5f9dd04323ff40c`). ## Request changes: live cut evidence is still missing The workflow diff is coherent, and the exact-head local checks pass (`bats tests` 60/60, `go test ./...`, YAML parse, and both extracted preflight blocks under ShellCheck). I found no code-level defect in the changed preflight logic. I cannot approve this head because release-toolkit#876 still has two unverified acceptance requirements: - A fresh v0.45.1-equivalent cut must reach checkout, publish the image, upload/download the digest artifact, and complete tagged-artifact verification. - The run/tag/commit population and final disposition must be recorded back on #872. The PR body explicitly says that no tagged cut was dispatched. I independently ran the exact publish preflight inside the live `docker-build:host` runner: it returned exit 2 with `jq node` missing before checkout. The PR-only CI contexts are successful, but no tag-triggered `goreleaser` run for this head exists, so the positive checkout/upload/download path remains unproven on the actual substrate. The local positive arm uses stubs and cannot establish that end-to-end path. Please provision or point to the measured runner contract, run a fresh v0.45.1-equivalent tag/manual workflow, inspect its logs and artifacts, and record the exact run/tag/commit evidence plus the #872/#876 disposition. If runner provisioning is intentionally a separate change, keep this review blocked until that dependency has landed and the evidence is attached (or explicitly split the acceptance criteria).
Owner

Addressing review 5592: the live runner remains missing jq and node, so a positive tagged cut cannot currently reach checkout. I documented the explicit dependency split in the PR body. This head owns the measured fail-fast contract; alcatraz-infra runner provisioning and the operator-authorized v0.45.1-equivalent cut remain downstream, including exact run/tag/commit evidence and final disposition on #872. No review was re-requested.

Addressing review 5592: the live runner remains missing `jq` and `node`, so a positive tagged cut cannot currently reach checkout. I documented the explicit dependency split in the PR body. This head owns the measured fail-fast contract; alcatraz-infra runner provisioning and the operator-authorized v0.45.1-equivalent cut remain downstream, including exact run/tag/commit evidence and final disposition on #872. No review was re-requested.
sentry approved these changes 2026-08-25 21:28:19 +02:00
Dismissed
sentry left a comment

Follow-up review of PR #878 at exact head f29c8d1b0ad67a3497323d2e583d2cce6cb4c0aa.

The explicit acceptance/dependency split in the PR body and comment 99738 is acceptable. This PR clearly owns the measured docker-build:host fail-fast contract, first-step preflight, positive Docker control, diagnostics, action inventory, and regression tests. The missing live jq/Node capabilities and the operator-authorized v0.45.1-equivalent cut are explicitly downstream responsibilities of alcatraz-infra and the release operator, including exact run/tag/commit evidence and final disposition on #872.

This approval is for the documented #878 scope; it is not a claim that the downstream tagged-cut evidence has already been produced. The exact head and code diff are unchanged from review 5592, and the prior exact-head test evidence remains valid.

Follow-up review of PR #878 at exact head `f29c8d1b0ad67a3497323d2e583d2cce6cb4c0aa`. The explicit acceptance/dependency split in the PR body and comment 99738 is acceptable. This PR clearly owns the measured `docker-build:host` fail-fast contract, first-step preflight, positive Docker control, diagnostics, action inventory, and regression tests. The missing live `jq`/Node capabilities and the operator-authorized v0.45.1-equivalent cut are explicitly downstream responsibilities of alcatraz-infra and the release operator, including exact run/tag/commit evidence and final disposition on #872. This approval is for the documented #878 scope; it is not a claim that the downstream tagged-cut evidence has already been produced. The exact head and code diff are unchanged from review 5592, and the prior exact-head test evidence remains valid.
sentry approved these changes 2026-08-25 21:30:30 +02:00
Dismissed
sentry left a comment

Follow-up approval: the acceptance/dependency split for PR #878 is acceptable at the exact requested head.

Follow-up approval: the acceptance/dependency split for PR #878 is acceptable at the exact requested head.
rigger force-pushed rigger/876-docker-build-node from f29c8d1b0a
All checks were successful
check-self-bootstrap / check (pull_request) Successful in 5s
fragment-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 4s
fragment-check / changelog fragment-kind (pull_request) Successful in 6s
fragment-check / check (pull_request) Successful in 0s
go-ci / lint + build + test (pull_request) Successful in 24s
manifest-check / manifest-vs-tag consistency (pull_request) Successful in 6s
manifest-check / check (pull_request) Successful in 0s
register-check / register-drift check (pull_request) Successful in 6s
register-check / check (pull_request) Successful in 0s
tests / workflow-schema (pull_request) Successful in 3s
tests / bats (pull_request) Successful in 7s
tests / shellcheck (pull_request) Successful in 2s
to a03eef1051
Some checks failed
check-self-bootstrap / check (pull_request) Successful in 4s
fragment-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 4s
fragment-check / changelog fragment-kind (pull_request) Successful in 7s
fragment-check / check (pull_request) Successful in 0s
go-ci / lint + build + test (pull_request) Successful in 24s
manifest-check / manifest-vs-tag consistency (pull_request) Successful in 6s
manifest-check / check (pull_request) Successful in 0s
register-check / register-drift check (pull_request) Successful in 6s
register-check / check (pull_request) Successful in 0s
tests / workflow-schema (pull_request) Successful in 4s
tests / bats (pull_request) Successful in 7s
tests / shellcheck (pull_request) Successful in 2s
check-self-bootstrap / check (push) Successful in 5s
go-ci / lint + build + test (push) Successful in 24s
release / decide + act (push) Failing after 6s
release / release (push) Failing after 0s
tests / workflow-schema (push) Successful in 3s
tests / bats (push) Successful in 7s
tests / shellcheck (push) Successful in 2s
2026-08-25 21:57:15 +02:00
Compare
rigger dismissed sentry's review 2026-08-25 21:57:15 +02:00
Reason:

New commits pushed, approval review dismissed automatically according to repository settings

sentry approved these changes 2026-08-25 22:04:26 +02:00
sentry left a comment

Fresh independent review of PR #878 at exact head a03eef10517e1c6618bfdfe1489ef24be1e1434e (base 7d248947f6768306b268ced9307dc41a512fb2b4).

APPROVED. The range-diff is one-for-one and patch-equivalent to the previously reviewed change.

Exact-head evidence:

  • bats tests --print-output-on-failure: 60/60.
  • bats tests/workflows.bats --print-output-on-failure: 39/39.
  • go test ./...: pass; all 16 workflow YAML files parse; both new preflight blocks pass ShellCheck; git diff --check passes.
  • Live docker-build probe: git and Docker CLI/daemon are present, jq and Node are absent; the extracted preflight fails closed with rc 2 and the intended diagnostics.

The acceptance/dependency split remains acceptable. #878 owns the measured fail-fast contract, positive Docker control, diagnostics, inventory, regression tests, and live negative evidence. Runner provisioning plus the operator-authorized v0.45.1-equivalent cut and exact run/tag/commit/final disposition on #872 remain explicit downstream dependencies, not claims made by this PR.

For provenance, the PR body Verification subsection still names the pre-rebase base/head (e287752a256efb71951747a1b5f9dd04323ff40c / f29c8d1b0ad67a3497323d2e583d2cce6cb4c0aa); this review records the fresh exact-head evidence for the rebased commit.

Fresh independent review of PR #878 at exact head `a03eef10517e1c6618bfdfe1489ef24be1e1434e` (base `7d248947f6768306b268ced9307dc41a512fb2b4`). APPROVED. The range-diff is one-for-one and patch-equivalent to the previously reviewed change. Exact-head evidence: - `bats tests --print-output-on-failure`: 60/60. - `bats tests/workflows.bats --print-output-on-failure`: 39/39. - `go test ./...`: pass; all 16 workflow YAML files parse; both new preflight blocks pass ShellCheck; `git diff --check` passes. - Live `docker-build` probe: git and Docker CLI/daemon are present, jq and Node are absent; the extracted preflight fails closed with rc 2 and the intended diagnostics. The acceptance/dependency split remains acceptable. #878 owns the measured fail-fast contract, positive Docker control, diagnostics, inventory, regression tests, and live negative evidence. Runner provisioning plus the operator-authorized v0.45.1-equivalent cut and exact run/tag/commit/final disposition on #872 remain explicit downstream dependencies, not claims made by this PR. For provenance, the PR body Verification subsection still names the pre-rebase base/head (`e287752a256efb71951747a1b5f9dd04323ff40c` / `f29c8d1b0ad67a3497323d2e583d2cce6cb4c0aa`); this review records the fresh exact-head evidence for the rebased commit.
sentry approved these changes 2026-08-25 22:04:26 +02:00
sentry left a comment

Fresh independent review of PR #878 at exact head a03eef10517e1c6618bfdfe1489ef24be1e1434e (base 7d248947f6768306b268ced9307dc41a512fb2b4).

APPROVED. The range-diff is one-for-one and patch-equivalent to the previously reviewed change.

Exact-head evidence:

  • bats tests --print-output-on-failure: 60/60.
  • bats tests/workflows.bats --print-output-on-failure: 39/39.
  • go test ./...: pass; all 16 workflow YAML files parse; both new preflight blocks pass ShellCheck; git diff --check passes.
  • Live docker-build probe: git and Docker CLI/daemon are present, jq and Node are absent; the extracted preflight fails closed with rc 2 and the intended diagnostics.

The acceptance/dependency split remains acceptable. #878 owns the measured fail-fast contract, positive Docker control, diagnostics, inventory, regression tests, and live negative evidence. Runner provisioning plus the operator-authorized v0.45.1-equivalent cut and exact run/tag/commit/final disposition on #872 remain explicit downstream dependencies, not claims made by this PR.

For provenance, the PR body Verification subsection still names the pre-rebase base/head (e287752a256efb71951747a1b5f9dd04323ff40c / f29c8d1b0ad67a3497323d2e583d2cce6cb4c0aa); this review records the fresh exact-head evidence for the rebased commit.

Fresh independent review of PR #878 at exact head `a03eef10517e1c6618bfdfe1489ef24be1e1434e` (base `7d248947f6768306b268ced9307dc41a512fb2b4`). APPROVED. The range-diff is one-for-one and patch-equivalent to the previously reviewed change. Exact-head evidence: - `bats tests --print-output-on-failure`: 60/60. - `bats tests/workflows.bats --print-output-on-failure`: 39/39. - `go test ./...`: pass; all 16 workflow YAML files parse; both new preflight blocks pass ShellCheck; `git diff --check` passes. - Live `docker-build` probe: git and Docker CLI/daemon are present, jq and Node are absent; the extracted preflight fails closed with rc 2 and the intended diagnostics. The acceptance/dependency split remains acceptable. #878 owns the measured fail-fast contract, positive Docker control, diagnostics, inventory, regression tests, and live negative evidence. Runner provisioning plus the operator-authorized v0.45.1-equivalent cut and exact run/tag/commit/final disposition on #872 remain explicit downstream dependencies, not claims made by this PR. For provenance, the PR body Verification subsection still names the pre-rebase base/head (`e287752a256efb71951747a1b5f9dd04323ff40c` / `f29c8d1b0ad67a3497323d2e583d2cce6cb4c0aa`); this review records the fresh exact-head evidence for the rebased commit.
Sign in to join this conversation.
No description provided.