The weekly mirror re-published only the amd64 manifest, so cloud-hosting-platform/python:3.12-slim and golang:1.25 had no arm64 variant. The pull/tag/push step is replaced by .gitea/scripts/mirror-index-copy.sh:
assert staging lists linux/amd64 AND linux/arm64, and its digest equals the Docker-Hub-reported index digest
only then imagetools create -t <dst>:<tag> <dst>@<digest> (registry-side) and re-assert
A failure in 1-2 leaves the real tag untouched (a previously multi-arch tag cannot be downgraded). resolve-base-image.sh verification and regex checks are kept; login step and secrets handling unchanged; setup-buildx added.
Measured
imagetools create round-trips the index digest exactly (python:3.12-slim and golang:1.25 into a local registry: identical sha256). Test .gitea/scripts/test-mirror-index-copy.sh (throwaway local registry): multi-arch passes, single-platform source is rejected, real tag not created, existing multi-arch tag survives a failing refresh, malformed refs refused.
Not verified
The real workflow has NOT run (no dispatch, no push to repo.anhonesthost.net registry). Notes: the copy now brings the full upstream index (7-8 platforms + attestations; several GB for golang on first run, incremental after); a <tag>-staging tag remains in the registry by design.
First real run
Manual workflow_dispatch after merge; check docker buildx imagetools inspect repo.anhonesthost.net/cloud-hosting-platform/python:3.12-slim shows arm64 and digest equals upstream. Roll back: note current digests of the two tags before the run; re-point with imagetools create -t <repo>:<tag> <repo>@<old digest> (old amd64 manifest stays in the registry).
## What
The weekly mirror re-published only the amd64 manifest, so `cloud-hosting-platform/python:3.12-slim` and `golang:1.25` had no arm64 variant. The pull/tag/push step is replaced by `.gitea/scripts/mirror-index-copy.sh`:
1. `docker buildx imagetools create -t <dst>:<tag>-staging docker.io/<img>@<index digest>` (registry-to-registry, whole index)
2. assert staging lists linux/amd64 AND linux/arm64, and its digest equals the Docker-Hub-reported index digest
3. only then `imagetools create -t <dst>:<tag> <dst>@<digest>` (registry-side) and re-assert
A failure in 1-2 leaves the real tag untouched (a previously multi-arch tag cannot be downgraded). resolve-base-image.sh verification and regex checks are kept; login step and secrets handling unchanged; setup-buildx added.
## Measured
`imagetools create` round-trips the index digest exactly (python:3.12-slim and golang:1.25 into a local registry: identical sha256). Test `.gitea/scripts/test-mirror-index-copy.sh` (throwaway local registry): multi-arch passes, single-platform source is rejected, real tag not created, existing multi-arch tag survives a failing refresh, malformed refs refused.
## Not verified
The real workflow has NOT run (no dispatch, no push to repo.anhonesthost.net registry). Notes: the copy now brings the full upstream index (7-8 platforms + attestations; several GB for golang on first run, incremental after); a `<tag>-staging` tag remains in the registry by design.
## First real run
Manual `workflow_dispatch` after merge; check `docker buildx imagetools inspect repo.anhonesthost.net/cloud-hosting-platform/python:3.12-slim` shows arm64 and digest equals upstream. Roll back: note current digests of the two tags before the run; re-point with `imagetools create -t <repo>:<tag> <repo>@<old digest>` (old amd64 manifest stays in the registry).
🤖 Generated with [Claude Code](https://claude.com/claude-code)
https://claude.ai/code/session_0185ukXjXyosSkunDsdWz3mb
mirror-base-image.yaml pulled the upstream index digest on an amd64 runner and
re-pushed it, publishing only the amd64 manifest; the python/golang mirrors
had no arm64 variant. Replace pull/tag/push with a registry-to-registry
`imagetools create` of the digest-pinned index via .gitea/scripts/
mirror-index-copy.sh: copy to <tag>-staging, assert linux/amd64+linux/arm64
are listed and the index digest equals the Docker Hub digest, then move the
real tag and re-assert. A failed assertion never touches the real tag.
Adds a local-registry test (.gitea/scripts/test-mirror-index-copy.sh).
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0185ukXjXyosSkunDsdWz3mb
jknapp
merged commit 74fc9ef183 into main2026-11-12 00:46:13 +00:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
What
The weekly mirror re-published only the amd64 manifest, so
cloud-hosting-platform/python:3.12-slimandgolang:1.25had no arm64 variant. The pull/tag/push step is replaced by.gitea/scripts/mirror-index-copy.sh:docker buildx imagetools create -t <dst>:<tag>-staging docker.io/<img>@<index digest>(registry-to-registry, whole index)imagetools create -t <dst>:<tag> <dst>@<digest>(registry-side) and re-assertA failure in 1-2 leaves the real tag untouched (a previously multi-arch tag cannot be downgraded). resolve-base-image.sh verification and regex checks are kept; login step and secrets handling unchanged; setup-buildx added.
Measured
imagetools createround-trips the index digest exactly (python:3.12-slim and golang:1.25 into a local registry: identical sha256). Test.gitea/scripts/test-mirror-index-copy.sh(throwaway local registry): multi-arch passes, single-platform source is rejected, real tag not created, existing multi-arch tag survives a failing refresh, malformed refs refused.Not verified
The real workflow has NOT run (no dispatch, no push to repo.anhonesthost.net registry). Notes: the copy now brings the full upstream index (7-8 platforms + attestations; several GB for golang on first run, incremental after); a
<tag>-stagingtag remains in the registry by design.First real run
Manual
workflow_dispatchafter merge; checkdocker buildx imagetools inspect repo.anhonesthost.net/cloud-hosting-platform/python:3.12-slimshows arm64 and digest equals upstream. Roll back: note current digests of the two tags before the run; re-point withimagetools create -t <repo>:<tag> <repo>@<old digest>(old amd64 manifest stays in the registry).🤖 Generated with Claude Code
https://claude.ai/code/session_0185ukXjXyosSkunDsdWz3mb