- Add release.yml workflow: multi-arch builds (linux/amd64, linux/arm64, windows/amd64, darwin/arm64), minisign signing, deb/rpm/apk packages, multi-arch Docker images pushed to ghcr.io and Docker Hub, GitHub Release with auto release notes, gh-pages sha256sum pointer update - Rewrite Dockerfile to use ubi9/ubi-micro base (no inherited MinIO env) - Delete legacy Dockerfiles (Dockerfile.release, .old_cpu, .hotfix) - cmd/update.go: accept 'buckit.' release prefix for self-update, replace minisign pubkey with placeholder, point default URL at GitHub Pages, derive binary URL from GitHub Releases - cmd/build-constants.go: repoint MinioReleaseBaseURL to GitHub Pages - cmd/update_test.go: add buckit prefix test case - Add design docs: release-process.md, release-process-plan.md, self-update-migration.md
8.4 KiB
Buckit Release Process — Implementation Plan
This plan describes how to bring the release process defined in
release-process.md into working state. It is a
companion to that design doc: the design specifies what the system should do;
this plan specifies what needs to change in the current repo, in what order,
and how to validate each step.
Gap analysis (design vs. current state)
Much of the design is already scaffolded in .github/workflows/release.yml.
Below is what is done, what is missing, and what is inconsistent with the
design.
| Area | Design | Current | Status |
|---|---|---|---|
| Workflow file exists | release.yml with 3 jobs |
Present | ✅ |
Tag trigger RELEASE.* |
yes | yes | ✅ |
| Build matrix amd64/arm64 | yes | yes | ✅ |
| Minisign sign (v0.2.1) | yes | yes | ✅ |
pkger (v2.3.11) .deb/.rpm/.apk |
yes | yes | ✅ |
Docker multi-arch from root Dockerfile |
yes | yes | ✅ |
Push to ghcr.io/buckit-io/buckit |
yes | yes | ✅ |
Push to docker.io/buckitio/buckit |
yes | missing (no Docker Hub login, no Docker Hub tags) | ❌ |
:latest only for stable (not .rc) |
yes | yes | ✅ |
GitHub Release w/ prerelease on .rc |
yes | yes | ✅ |
cmd/update.go uses Buckit minisign pubkey |
yes | still old MinIO key RWTx5Zr1... |
❌ |
| Legacy Dockerfiles updated/retired | yes | Dockerfile.release, Dockerfile.release.old_cpu, Dockerfile.hotfix still reference MinIO key + dl.min.io |
❌ |
| Required secrets configured in repo | MINISIGN_*, DOCKERHUB_* |
not yet set | ❌ (out-of-band; requires repo owner) |
Unrelated but risky findings flagged for confirmation before the first release:
- Root
DockerfileusesFROM minio/minio:latest— a "buckit" release image inheriting from MinIO's upstream runtime. The design does not mention rebasing, but this is worth an explicit decision before tagging:latest. dockerscripts/docker-entrypoint.shstill usesMINIO_USERNAME/MINIO_GROUPNAMEenv vars. This is orthogonal to release mechanics and can be left unless a rebrand pass is scheduled.
Plan (ordered)
Phase 1 — Code and workflow changes (reversible, in-repo)
-
Update
.github/workflows/release.yml— Docker job- Add a
docker/login-action@v3step fordocker.iousing${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.DOCKERHUB_TOKEN }}. - Extend the "Determine tags" step to also emit:
docker.io/buckitio/buckit:${{ github.ref_name }}docker.io/buckitio/buckit:latest(only when tag does not contain.rc)
- The
docker/build-push-action@v5already consumes the combined tag list — no structural change needed.
- Add a
-
Rotate minisign public key in code (
cmd/update.go)- Replace the
defaultMinisignPubkeyconstant (~line 560) with the new Buckit public key produced in Phase 2, step 1. - Keep the
envMinisignPubKeyoverride path intact. - Update any test fixture in
cmd/update_test.gothat hardcodes the key.
- Replace the
-
Update or retire legacy Dockerfiles
Dockerfile.release,Dockerfile.release.old_cpu,Dockerfile.hotfixall:- download binaries from
https://dl.min.io/...(MinIO infrastructure — will not serve Buckit), - verify against the old MinIO minisign key,
- embed
MINIO_UPDATE_MINISIGN_PUBKEY=RWTx5Zr1...in the image env.
- download binaries from
- Options (pick one):
- (A) Delete them. The automated release uses the root
Dockerfileonly; the hotfix flow (make hotfix) pushes todl.buckit.iowhich does not exist yet anyway. Simpler, avoids a broken build matrix. - (B) Repoint them at a future Buckit release URL and pubkey once
download infrastructure exists. More code; no value until an equivalent
dl.buckit.iomirror is provisioned.
- (A) Delete them. The automated release uses the root
- Recommendation: A for now; revisit when/if a public binary mirror goes up.
-
Sanity-check root
Dockerfile- Decide whether
FROM minio/minio:latestis acceptable for a v1 release or should be replaced with a minimal base (e.g.,ubi9/ubi-microoralpine) that just ships thebuckitbinary. This is the image the release will publicly tag as:latest. - If replacing, also bring over the
CREDITS/LICENSE/docker-entrypoint.shcopies thatDockerfile.releaseperformed.
- Decide whether
-
Document the release procedure
- Add a short
RELEASE.md(or section inREADME.md) covering the tag format (RELEASE.YYYY-MM-DDTHH-MM-SSZ[.rcN]) and the single command developers run to cut a release. - Cross-link from
docs/release-process.md.
- Add a short
Phase 2 — Owner setup tasks (out-of-band, one-time)
These need access to the GitHub org, Docker Hub, and a local machine with
minisign installed.
-
Generate the Buckit minisign keypair
minisign -G -p buckit.pub -s buckit.keyStore
buckit.keyand its passphrase in a password manager. Publishbuckit.pubin the repo (e.g.,SECURITY.mdor abuckit.pubfile at the root) so users can verify releases. -
Configure repository secrets (Settings → Secrets and variables → Actions)
MINISIGN_PRIVATE_KEY=base64 -w0 < buckit.keyMINISIGN_PASSWORD= passphrase from step 1DOCKERHUB_USERNAME= Docker Hub user that ownsbuckitio/buckitDOCKERHUB_TOKEN= Docker Hub access token scoped toRead, Write, Deleteon that repoGITHUB_TOKENis built-in — nothing to add.
-
Pre-create Docker Hub repo
docker.io/buckitio/buckit(public) if it does not already exist. -
Confirm ghcr.io package visibility — after the first push, make the ghcr package public in GitHub Package settings.
Phase 3 — Dry run and first release
-
Local verification of build tooling (no secrets needed):
BUCKIT_RELEASE=RELEASE go run buildscripts/gen-ldflags.go \ RELEASE.2026-05-08T23-00-00Z CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -tags kqueue -trimpath \ --ldflags "$(BUCKIT_RELEASE=RELEASE go run buildscripts/gen-ldflags.go \ RELEASE.2026-05-08T23-00-00Z)" \ -o /tmp/buckit-test /tmp/buckit-test --versionConfirms the tag format parses and ldflags wire through.
-
Cut a release candidate first to exercise the prerelease path without claiming
:latest:git tag RELEASE.$(date -u +%Y-%m-%dT%H-%M-%SZ).rc1 git push origin RELEASE.*.rc1Validate:
- All three jobs succeed.
- GitHub Release exists and is flagged
prerelease. .deb,.rpm,.apk,.sha256sum,.minisig, and raw binaries are all attached for amd64 and arm64.ghcr.io/buckit-io/buckit:RELEASE.*.rc1exists for both platforms:docker manifest inspect ....docker.io/buckitio/buckit:RELEASE.*.rc1exists.- Neither registry has
:latestupdated. - Signature verifies locally:
minisign -Vm <binary> -x <binary>.minisig -P <buckit.pub contents>
-
Cut the first stable release once the RC passes all checks.
Phase 4 — Follow-ups (optional, post-MVP)
- Add an SBOM step (
anchore/sbom-action) and attach it to the GitHub Release. Commonly requested for AGPL-licensed infrastructure software. - Add
cosignimage signing (independent of minisign binary signing). - Publish Helm chart index updates from the same workflow (there is already a
helm-reindex.shat the repo root). - Rename
MINIO_*env variables indockerscripts/docker-entrypoint.shtoBUCKIT_*(separate rebrand task, not release-process).
Risk & rollback
- All Phase 1 changes are reversible via
git revert. - A failed first release only creates an orphaned GitHub Release + container tags; delete the release and the immutable image tags without affecting anything else.
- The only irreversible action is publishing the minisign public key. Once users pin to it, rotating requires a coordinated key-rotation plan. Keep the private key offline after provisioning.
Deliverables summary
| File | Change |
|---|---|
.github/workflows/release.yml |
Add Docker Hub login + tags |
cmd/update.go |
Replace defaultMinisignPubkey |
cmd/update_test.go |
Update pubkey fixture if present |
Dockerfile.release, Dockerfile.release.old_cpu, Dockerfile.hotfix |
Delete (recommended) or repoint |
Dockerfile (root) |
Confirm base image is acceptable; optionally rebase |
buckit.pub (new) |
Publish Buckit minisign public key |
README.md / new RELEASE.md |
Document tag format + workflow |