registry-mirror: the Kanidm pin drifted to 1.10.4 and nothing can notice #441
Etiketter
Inga etiketter
area/backups
area/ci
area/control-panel
area/identity
area/infra
area/observability
area/payments
area/security
area/storage
area/web
blocked
needs-info
needs-triage
ready-for-implementation
type
bug
type
chore
type
docs
type
epic
type
feature
type
task
wontfix
Ingen milstolpe
Inget projekt
Inga tilldelade
1 deltagare
Notiser
Förfallodatum
Inget förfallodatum satt.
Beroenden
Inga beroenden satta
Referens
bitborg/bitborg-infra#441
Läser in…
Hänvisa till i nytt ärende
Ingen beskrivning angiven.
Ta bort grenen "%!s()"
Borttagning av en gren är permanent. Även om den borttagna grenen kan fortsätta existera en kort tid innan den faktiskt tas bort, kan det INTE ångras i de flesta fall. Vill du fortsätta?
The drift
registry_mirror_imagesstill pins Kanidm at 1.10.4. The role has run 1.11.1 since theupgrade on 2026-08-16 (#424).
The comment says "keep in lockstep". It is not in lockstep, and nothing noticed for two days.
Why nothing noticed
Three properties compound, and each is individually reasonable.
1. Nothing consumes the mirrored image.
bitborg/kanidmappears exactly once in the repository,as its own
dest. The Kanidm container pulls{{ kanidm_image }}:{{ kanidm_image_tag }}fromdocker.io directly, so no consumer exists that could fail when the mirror entry is wrong. Contrast
renovate_image, which is{{ bitborg_registry_host }}/bitborg/renovate:43and therefore points ATthe mirror: a mismatch there fails loudly with a missing image. The Kanidm entry is unverifiable by
construction.
2. The smoke's mirror lookup degrades to silence.
load_mirror_map()keys the map on the exactupstream ref, and
pull_image()doesmirror_map.get(image). A tag mismatch is not a miss, it is aNone, which means "this image has no mirror candidate" and is documented as never an error. So thesmoke silently falls back to upstream. That is correct behaviour for a genuinely unmirrored image
and wrong only here, where the image IS mirrored under a stale tag.
3. Renovate cannot catch it.
kanidm_image_tagisrenovate-exemptby deliberate decision, asthe server refuses minor skips and downgrades. So the one bot that would otherwise bump both
literals together will never look at either.
Observed
From today's CI run on
main:Forgejo and postgres resolve to the instance. Kanidm reaches docker.io. That is the sovereignty and
CI-resilience goal of #137 quietly not being met for one image, plus a stale 1.10.4 image occupying
registry space that nothing will ever pull.
Options
A. A static check (recommended, cheap). Assert that every literal
srcinregistry_mirror_imagesmatches the role default it claims lockstep with. Same shape ascheck-renovate-annotations.pyandcheck-metric-names.py: a pure text-adjacency property, noproduction access, runs in CI on the
ansiblegate. It also generalises, so the next literal addedto the list is covered without anyone remembering to add a check.
B. Move
kanidm_image/kanidm_image_tagintogroup_vars/all/vars.ymland template themirror entry the way forgejo, postgres and caddy already are, removing the duplicated literal
entirely. Structurally the better answer, but it has real blast radius:
# renovate-exempt:comment must move with the variable and stay directly adjacent, orcheck-renovate-annotations.pyreads differently than intended.site.ymlturns the ADR 0038 concealment gate off on the monitoring host becausekanidm_image_tagis a role default and therefore undefined in that play. Promoting it to agroup_var changes that reasoning, and the comment there would become wrong.
A is the fix for the bug. B is a separate refactor and should not ride along on it.
Done when
Changing a role's image tag without updating its mirror entry fails CI, and that failure has been
observed rather than assumed.
Notes
there are four forced upgrades a year (#424).
Sun *-*-* 04:30) and once on deploy, so the corrected entry populates onthe next apply.