Part of #23. Spec: ADR 0016 — The 0.1.0 shape, clauses D28, D29, D30, D31, D32, D34.
Phase 3 — CI and release
Blocked by: #33, #34, #37, #43
Blocks: #51, #52
What
Replaces harness-release.yml + images-release.yml + dockerhub-description.yml. On push: tags: v* plus workflow_dispatch. Measured target: a release lands in under 6 minutes (today's equivalent Images Edge run — both images, both arches, both registries — took 3m16s; tarball legs are ~0.7–0.8 min each).
Jobs: resolve → tarball (matrix ×2, native runners) → panel / core (via the reusable container-image.yml, push: true) → github-release → descriptions (T23).
Two things that must not be "fixed" later and belong in the workflow as comments:
- GHCR is pushed first and must complete, even though Docker Hub is the "primary" registry. Primary means the canonical place a user is told to pull from, not publish order. GHCR authenticates with the workflow's own
github.token and therefore cannot fail on credentials, which is exactly why it goes first.
- Present-but-broken Docker Hub credentials publish GHCR completely — per-arch tags and manifest — then fail the run at the very end. Failing early would strand GHCR with per-arch tags and no manifest.
Done when
Decisions are locked in ADR 0016. If this ticket needs one changed, amend the ADR in the same PR — do not decide it in a comment.
Part of #23. Spec: ADR 0016 — The 0.1.0 shape, clauses D28, D29, D30, D31, D32, D34.
Phase 3 — CI and release
Blocked by: #33, #34, #37, #43
Blocks: #51, #52
What
Replaces
harness-release.yml+images-release.yml+dockerhub-description.yml. Onpush: tags: v*plusworkflow_dispatch. Measured target: a release lands in under 6 minutes (today's equivalent Images Edge run — both images, both arches, both registries — took 3m16s; tarball legs are ~0.7–0.8 min each).Jobs:
resolve→tarball(matrix ×2, native runners) →panel/core(via the reusablecontainer-image.yml,push: true) →github-release→descriptions(T23).Two things that must not be "fixed" later and belong in the workflow as comments:
github.tokenand therefore cannot fail on credentials, which is exactly why it goes first.Done when
actana-core-<version>-linux-x64.tar.gz,actana-core-<version>-linux-arm64.tar.gz,SHA256SUMS<version>andlatestfrom a version tag (non-prerelease only); no0/0.1ladder — under semver a0.xminor bump is the breaking change, so a moving:0tag is a lie by constructionv1.0.0-rc.1publishes1.0.0-rc.1and does not move:latestdocker loginand the description API;DOCKERHUB_DESCRIPTION_USERNAME/_TOKENare deleted. (An OAT can push images but returns "Cannot log into an organization account" onPOST /v2/users/login, so it would mean paying for Team/Business and still provisioning a PAT)actana/controland still skips on forks — a release that never reached the primary registry must not report successdocs/contribute/repo-setup.md: the token belongs to a person and dies with that accountinstall.shis not an asset and stays onraw.githubusercontent.com/actana/control/main/install.shDecisions are locked in ADR 0016. If this ticket needs one changed, amend the ADR in the same PR — do not decide it in a comment.