chore(distribution): cut on alcatraz, push-mirror to gitea.com for public adoption #1021
Labels
No labels
bump
major
bump
minor
bump
patch
kind/bug
kind/chore
kind/docs
kind/feature
priority/critical
priority/high
priority/low
priority/medium
size/L
size/M
size/S
size/XL
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
frankenbit/release-toolkit#1021
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Release cuts stay on alcatraz and gitea.com gets a public push-mirror for adoption and demos. This tracker owns that topology so it is not decided ad hoc during the first mirror push.
Shape
git.frankenbit.deis network-private, so gitea.com cannot reach it. Outbound push only..forgejo/-only makes this inert on Gitea today — that accident is currently load-bearing and should be made deliberate rather than relied on.Open questions
@vX.Y.Zresolves the tag, gets no binary, and sees no signal that anything is missing. Adjacent case the same day —v0.54.1published its binary assets but never built its container image, so a consumer pinning it for the docker action got nothing. Same shape, one hop out. (@bosun)uses:source and GitHub runners are free for public repos. Same directory question as #1020.Acceptance criteria
FIRST — measure whether release objects and their assets reach a push-mirror at all. This is the one that fails silent, so it must not be discovered by an adopter
They do not — 0 of 87. Measured 2026-08-28, both ends:
The control is what makes this a measurement rather than an absence: the same ref is present as git data and absent as an API object, so the gap is the kind of object, not the sync.
If they do not: decision recorded on how assets reach gitea.com, or an explicit note to adopters that they will not — DEFERRED → #1030, which owns copying releases and assets
Both halves are satisfied in the interim, deliberately. #1030 is the decision and it is blocked on a gitea.com PAT that does not exist (the push mirror needs none — ssh, Forgejo-generated key; every release-creation call does), so it may sit. Meanwhile
#1054puts the explicit note to adopters in the README, where the silent failure is actually met.Mirror configured, verified to carry the tags consumers pin
Configured already (
ssh://gitea.com/FrankenBit/release-toolkit.git, 8h, last sync 19:20), so this was discharged by verification rather than setup.Verified by name AND SHA, and the SHA half is the load-bearing one: 0 missing, 0 extra, 0 same-name-different-SHA. A tag that resolves to a different commit is worse than a missing one — it fails a consumer silently while looking correct — and a bulk count of 105 = 105 cannot see that class at all. The three pins our docs name (
v0.55.0,v0.25.0,v0.10.0) each match on both sides.Documented that a cut never originates on a mirror —
#1054In the README, plus an arm refusing
.gitea/or.github/workflow directories. Gitea Actions reads those and not.forgejo/, which is the only reason the mirror does not run our release CI — verified on the mirror:.forgejo200,.gitea404,.github404. The arm turns that directory-naming accident into a stated guarantee, and is a refusal to let those dirs appear without the mirror question being answered, not a ban.Anchor
Operator, 2026-08-28: "ideally we would still cut them here on Alcatraz and mirror them to gitea... Otherwise this will end up in a maintenance nightmare."
🔴 MEASURED: three answers, and the one that mattered is NO
The control that makes this a finding rather than an absence — same ref, same repo, read one after the other:
The tag is present and the release is absent at the same commit. So this is releases specifically, not a sync that half-failed. Spot-checked
v0.54.1,v0.53.0,v0.49.0— same shape. Zero of fifty.⚠️ It is worse than the v0.54.1 defect, one hop out
On
v0.54.1the digest was visibly zeroed — broken in a way a reader could see. Here an adopter gets a repo that looks complete: 50 tags, correct commits,git cloneworks,checkout v0.54.2works. The binary is simply not there, no release page says so, and nothing on either end reports an error.By every signal our side offers, the mirror is healthy — and it is. A push mirror pushes git. Release objects are Forgejo API objects, so they were never in scope for the mechanism.
🔑 The far-end check is what caught it. Our side reports "synced" and is telling the truth about what it synced. Same shape as
rt#1022closing on artifacts rather than on a green run.What the mirror actually buys — 1 of 3 consumption paths
So a gitea.com adopter can reference our reusable workflows and cannot use either binary path.
Decision required — not attempted, and it is not a config flip
git.frankenbit.de. Cheapest, and honest, but an adopter who cannot reach our forge gets one path of three.⚠️ Two things NOT measured, flagged rather than assumed: whether an adopter's
uses:against gitea.com actually resolves — the question one layer up from assets — and whether the container image mirrors anywhere.v0.54.2has one.📌 Measured by @quartermaster, who captured the far-end baseline BEFORE touching anything — the mirror turned out to be already configured, so without that baseline he could not have separated what the mirror delivered from what was already there. Credential handled via Vault to a
0600file and never placed in argv.🔴 CORRECTION TO MY OWN "1 of 3 paths" — it is ZERO for an external adopter
I wrote that a gitea.com adopter can reference our reusable workflows and only loses the binary paths. That is wrong, and the reusable is not exempt:
The reusable workflow bootstraps
rtfrom OUR forge. So referencing it from gitea.com resolves the workflow and then fails fetching the binary.RT_DOWNLOAD_BASEis overridable, which is the seam — but it points somewhere that also has to hold the assets.🔑 And the link-instead-of-copy design is FORECLOSED, which settles the shape
git.frankenbit.deis LAN-only at the ingress —allow 172.22/16 · 192.168.178/24 · 10.10.10/24 · deny all, verified against 7 days of logs. An external adopter cannot reach it at all.✅ The machinery mostly exists, and is misnamed for a forge we have left
Both API URLs are declared INPUTS;
codeberg_api_urlmerely defaults to codeberg.org. Repointing is awith:change, not new code. Codeberg was dropped weeks ago over their AI-code policy; the Codeberg repo now 404s and the job has not fired since ~task 24207 — it did not run forv0.54.2despite the trigger being wired.⚠️ But repointing alone would NOT fix assets. That workflow POSTs the release object and never uploads one — the only upload-shaped matches in it are
trap rm -fcleanup lines. An adopter would get a release PAGE with no binary, which is arguably worse than none: a populated page reads as complete.Sizing, because "backfill 50 releases" is a different proposition at 3 GiB
Scope, if this is taken
target_api_url/target_owner/target_repo. Forge-agnostic in fact, so make it so in name./releases/{id}/assets. Verify the uploaded SIZE rather than trusting a 201; handle partial uploads and re-runs.workflow_dispatchiterating tags — nearly free, and not by luck: the existing GET-before-POST idempotency makes re-running safe by construction.📌
checksums.txtmatters more than its 81 bytes suggest: an adopter two hops from the build has no other way to verify what they pulled. It is the whole provenance story.📌 Existing-machinery discovery, the LAN-only foreclosure, the sizing and the empty-asset caveat by @quartermaster; the reusable-also-needs-the-binary correction by @bosun, against his own earlier framing.