Zot push credential for pipelines: secret-extension rule + AppRole path #112

Merged
tepichord merged 8 commits from feat/110-zot-push-credential into main 2026-10-03 12:38:51 -07:00
Owner

Closes #110

Automated PR created by forgejo-done adapter.

Closes #110 Automated PR created by forgejo-done adapter.
Add the third secret-extension rule `annia-infra-publish`: a push or
manual run of tepichord/annia-infra gets `ZOT_TOKEN` from the logical
path `ci/zot` — a rule of its own rather than a wider secret on
`annia-infra-merged-pr`, so the file stays a list of what each token is
for. Push-only events are the gate that keeps the registry password off
every pull request, and the file's two AppRole comments move from two
paths to three to match.

Refs: #110
§9k step 1's policy gains the read-only `path "secret/data/ci/zot"`
block, placed with the other secret paths ahead of the `auth/token/*`
blocks — the rule and the block are one change (§9k's invariant: no
block without a rule, no rule without a block), and the root write stays
before the ConfigMap is relied on. The section's intro and step-1
comments now say three paths and name the publish step as the third
consumer.

Refs: #110
The AppRole now reads `secret/data/ci/zot` and the
`annia-infra-publish` rule serves it, so the three passages saying the
prefix is ungranted (or that nothing reads the entry, or that §9k grants
exactly one path) are wrong: README's `milner/**` paragraph and
"what holds the credential" table note, values.yaml's `milner/**`
comment, and set-credential.sh's header. Each now states the truth that
matters — the grant exists, and the follow-on retiring `milner/**` waits
on a rule for tepichord/milner, not on the grant. `accessControl` and
the `--creds` follow-on are untouched, as scoped.

Refs: #110
The comment in test_secret_extension_serves_the_build_notification_
credential still said the shared credential reads "both paths"; with
the registry push credential it is three.

Refs: #110
test_secret_extension_serves_the_registry_push_credential asserts the
annia-infra-publish rule's repo, events and ZOT_TOKEN secret against
annia-infra#310's from_secret contract, that ZOT_TOKEN is served by its
own rule rather than a wider secrets list, and that every rule's
logical path has a `secret/data/<path>` block in §9k's HCL — the
"no rule without a block" invariant, which the out-of-band root policy
write (§4h) otherwise leaves unenforced.

Refs: #110
Refs: #110
docs(zot): the AppRole grants the ci/zot path, not the ci/ prefix
All checks were successful
ci/woodpecker/pr/gates Pipeline was successful
41b06fd684
The §9k policy names exactly `secret/data/ci/zot`; README.md, values.yaml and
set-credential.sh described it as the `ci/` prefix, which reads as a wildcard
grant the policy does not make. Say path, matching the plan's wording.
tepichord added this to the MVP project 2026-10-01 18:49:17 -07:00
Merge branch 'main' of ssh://clone.gloom.garden/tepichord/milner into feat/110-zot-push-credential
All checks were successful
ci/woodpecker/pr/gates Pipeline was successful
ci/woodpecker/pull_request_closed/cleanup Pipeline was successful
d9eaeaad22
tepichord deleted branch feat/110-zot-push-credential 2026-10-03 12:38:51 -07:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
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
tepichord/milner!112
No description provided.