Uh oh!
There was an error while loading. Please reload this page.
ci(dev-image): propagate to GHCR and ECR with registry-state re-entry - #297
Open
robinnsc wants to merge 1 commit into
Open
ci(dev-image): propagate to GHCR and ECR with registry-state re-entry#297robinnsc wants to merge 1 commit into
robinnsc wants to merge 1 commit into
Conversation
Adds the propagate wave (ghcr environment, approval 2): version, state-derived latest, and the signature go to GHCR and ECR Public through the promote-registry composite action — signature verified at each destination before any tag, forward-only latest re-guarded per destination. The publish job becomes re-entrant on registry state: an existing version tag with a verifying signature is authoritative (a rebuild is not bit-reproducible, so artifact comparison would always refuse), signing is skipped when the .sig already exists (never double-sign), and only a definite absence proceeds to push. Enables interrupted-release recovery and the v0.1.7 mirror backfill. Supersedes the Docker Hub-only scoping (release owner decision 2026-08-20; AWS side already live).
robinnsc
requested review from
LeeroyHannigan, amrith, c33howard, jcshepherd, pdf-amzn and yesyayen
as code ownersAugust 21, 2026 03:51
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for freeto join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
release-dev-imagenow covers all three registries in its single dispatch:after the existing publish+sign job (
dockerhubenvironment, approval 1), anew
propagatejob (ghcrenvironment, approval 2) carries the versiontag, a state-derived
latest, and the signature to GHCR and ECR Publicthrough the
promote-registrycomposite action — signature verified ateach destination before any tag is placed, forward-only
latestre-guardedper destination, three-way fail-closed probes throughout.
The publish job also becomes re-entrant on registry state: an existing
version tag whose signature verifies is treated as authoritative (skip
push, skip sign); existing-but-unsigned proceeds to signing only; and only
a definite manifest-unknown proceeds to push. Signing is additionally
guarded by a signature-existence check, so a re-dispatch never double-signs.
move-latestfor the mirrors is derived from Docker Hub state (doeslatestpoint at this digest?) rather than re-deciding, so mirrors alwaysconverge on what the canonical registry serves.
Why
Release-owner decision 2026-08-20: the dev image lands on the same three
registries as the Postgres image (superseding the 08-15 Docker Hub-only
scoping — and matching the three-registry expectation from the #283 review).
The AWS side is already live and read-back-verified:
extenddb-devexistson ECR Public with catalog metadata, and both ECR role policies cover it.
Re-entry has to be registry-state-based rather than #284-style artifact
comparison because this workflow rebuilds on every dispatch and the build
is not bit-reproducible — comparing a fresh build against the released
artifact would refuse every time. An existing version tag with a verifying
signature is the release; immutability says never to touch it anyway.
Immediate use — the v0.1.7 backfill: dev 0.1.7 is Docker Hub-only
today. After this merges, re-dispatching
v0.1.7no-ops publish andsigning (tag exists, signature verifies) and runs the propagate wave,
putting the already-released artifact on GHCR and ECR. The first GHCR push
auto-creates the package: verify repo linkage and visibility per runbook
10.6 (the summary reminds the operator).
Testing done
yaml.safe_loadpasses.promote-registryaction reviewed and mergedin ci(promote): fan out promotion to GHCR and ECR in one approved run #283 (four hostile rounds), pointed at the dev repositories; the AWS
prerequisites were verified by read-back and the policy diffs archived.
(exists + signed → skip to propagate ✓); a fresh version (absent →
normal path ✓); the interrupted case (exists + unsigned → sign only ✓);
probe failure (abort ✓).
dispatch is the live verification, and every gate fails closed.
Checklist
ADR / RFC: n/a — CI tooling only.
Breaking changes
None. A normal first-time dispatch behaves as before, plus the propagate wave.
By submitting this pull request, I confirm that my contribution is made under the terms of the Apache License 2.0 and I agree to the Developer Certificate of Origin (DCO). See CONTRIBUTING.md for details.