Multi-arch (linux/amd64 + linux/arm64) publishing for whp-default, applying the template proven in haproxy-manager-base PR #17 (run 5159). Plan: whp repo docs/arm64/IMAGE-PIPELINE-PLAN.md sections 1.1 / 4.1 / 5 (T7).
One job on the x86 runner: amd64 + arm64 (QEMU, already set up in this workflow) each pushed by digest to the existing registry only (Gitea; no new registry/secret), then scripts/assemble-multiarch-index.sh creates :latest.
The arm64 step is continue-on-error; its digest comes only from this run's step output, so a failed arm64 leg publishes the usual amd64-only :latest and a stale arm64 is never re-attached.
Only one tag/variant exists here (:latest); covered.
No Dockerfile change: httpd:alpine publishes arm64; the Dockerfile only uses sed and COPY.
Added workflow_dispatch. Triggers otherwise unchanged (push to the default branch only; no schedule; a push to this branch does not publish).
scripts/test-assemble-multiarch-index.py: the template's script tests plus workflow-wiring tests (triggers, arm64 non-fatal, push-by-digest, identical build args, single registry/tag). Run: python3 scripts/test-assemble-multiarch-index.py.
Owner note: merge and first run
Merging to the default branch itself triggers a publish (push trigger). Merge with [skip ci] in the merge commit title, then run workflow_dispatch manually. Before the first run record rollback digests:
docker buildx imagetools inspect repo.anhonesthost.net/cloud-hosting-platform/whp-default:latest # note the index Digest and the linux/amd64 manifest digest
Rollback: re-tag the recorded amd64 manifest digest as latest (docker buildx imagetools create -t repo.anhonesthost.net/cloud-hosting-platform/whp-default:latest repo.anhonesthost.net/cloud-hosting-platform/whp-default@sha256:<recorded>), or revert this PR. Not verified locally: real Gitea/GHCR push of the index, CI runner timing.
## What
Multi-arch (linux/amd64 + linux/arm64) publishing for `whp-default`, applying the template proven in haproxy-manager-base PR #17 (run 5159). Plan: whp repo `docs/arm64/IMAGE-PIPELINE-PLAN.md` sections 1.1 / 4.1 / 5 (T7).
- One job on the x86 runner: amd64 + arm64 (QEMU, already set up in this workflow) each pushed **by digest** to the existing registry only (Gitea; no new registry/secret), then `scripts/assemble-multiarch-index.sh` creates `:latest`.
- The arm64 step is `continue-on-error`; its digest comes only from this run's step output, so a failed arm64 leg publishes the usual amd64-only `:latest` and a stale arm64 is never re-attached.
- Only one tag/variant exists here (`:latest`); covered.
- No Dockerfile change: `httpd:alpine` publishes arm64; the Dockerfile only uses `sed` and `COPY`.
- Added `workflow_dispatch`. Triggers otherwise unchanged (push to the default branch only; no schedule; a push to this branch does not publish).
- `scripts/test-assemble-multiarch-index.py`: the template's script tests plus workflow-wiring tests (triggers, arm64 non-fatal, push-by-digest, identical build args, single registry/tag). Run: `python3 scripts/test-assemble-multiarch-index.py`.
## Owner note: merge and first run
Merging to the default branch **itself triggers a publish** (push trigger). Merge with `[skip ci]` in the merge commit title, then run `workflow_dispatch` manually. Before the first run record rollback digests:
```
docker buildx imagetools inspect repo.anhonesthost.net/cloud-hosting-platform/whp-default:latest # note the index Digest and the linux/amd64 manifest digest
```
Rollback: re-tag the recorded amd64 manifest digest as latest (`docker buildx imagetools create -t repo.anhonesthost.net/cloud-hosting-platform/whp-default:latest repo.anhonesthost.net/cloud-hosting-platform/whp-default@sha256:<recorded>`), or revert this PR. Not verified locally: real Gitea/GHCR push of the index, CI runner timing.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
https://claude.ai/code/session_0185ukXjXyosSkunDsdWz3mb
One job on the trusted x86 runner builds amd64 and arm64 (QEMU), pushes each
platform by digest, then scripts/assemble-multiarch-index.sh creates :latest.
arm64 is continue-on-error: a failed arm64 leg publishes the usual amd64-only
tag. No Dockerfile change (both base images publish arm64). Adds
workflow_dispatch and an offline test for the assemble script and workflow
wiring.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0185ukXjXyosSkunDsdWz3mb
jknapp
merged commit 156e9eae8b into main2026-11-12 02:02:59 +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
Multi-arch (linux/amd64 + linux/arm64) publishing for
whp-default, applying the template proven in haproxy-manager-base PR #17 (run 5159). Plan: whp repodocs/arm64/IMAGE-PIPELINE-PLAN.mdsections 1.1 / 4.1 / 5 (T7).scripts/assemble-multiarch-index.shcreates:latest.continue-on-error; its digest comes only from this run's step output, so a failed arm64 leg publishes the usual amd64-only:latestand a stale arm64 is never re-attached.:latest); covered.httpd:alpinepublishes arm64; the Dockerfile only usessedandCOPY.workflow_dispatch. Triggers otherwise unchanged (push to the default branch only; no schedule; a push to this branch does not publish).scripts/test-assemble-multiarch-index.py: the template's script tests plus workflow-wiring tests (triggers, arm64 non-fatal, push-by-digest, identical build args, single registry/tag). Run:python3 scripts/test-assemble-multiarch-index.py.Owner note: merge and first run
Merging to the default branch itself triggers a publish (push trigger). Merge with
[skip ci]in the merge commit title, then runworkflow_dispatchmanually. Before the first run record rollback digests:Rollback: re-tag the recorded amd64 manifest digest as latest (
docker buildx imagetools create -t repo.anhonesthost.net/cloud-hosting-platform/whp-default:latest repo.anhonesthost.net/cloud-hosting-platform/whp-default@sha256:<recorded>), or revert this PR. Not verified locally: real Gitea/GHCR push of the index, CI runner timing.🤖 Generated with Claude Code
https://claude.ai/code/session_0185ukXjXyosSkunDsdWz3mb