Port the GitHub CI gates (gofmt, go vet, golangci-lint, race tests with the coverage profile, the 100% coverage gate, go build) to the shared ci-workflows go.yaml. v* tags build the GoReleaser-equivalent archives with scripts/build-release.sh and attach them with SHA256SUMS to the Gitea release. The GitHub workflows ran on ubuntu-22.04/macos/windows runners that Gitea does not serve; removed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
3.4 KiB
Releasing
For the complete end-to-end runbook (integrating multiple feature PRs, versioning, conflict resolution, tagging, and post-release verification) see RELEASES.md. This file is the short reference.
CI and releases run on Gitea Actions (.gitea/workflows/build.yaml, the shared
KofTwentyTwo/ci-workflows Go workflow). A v* tag runs every gate, then
scripts/build-release.sh builds the archives and CI attaches them with a SHA256SUMS
to the tag's Gitea release. .goreleaser.yaml remains for local snapshot checks.
Changelog Management
All releases must update the CHANGELOG.md file with:
- Version number and release date
- Category of changes (Added, Changed, Fixed)
- Breaking changes if any
Follow the Keep a Changelog format.
Branch Flow
Use the repository's gitflow-style branches:
feature/*branches hold active work and open PRs intodevelop.developreceives merged feature work and runs build/test CI plus branch artifact publishing.release/*orrc/*branches stabilize release candidates and run the same CI plus branch artifact publishing.mainis production and should only receive release-ready changes.
Before pushing release tags, verify GitHub authentication:
gh auth status
git ls-remote --heads origin
Local Release Prep
-
Update CHANGELOG.md with release notes and the release date.
-
Run the pre-release gate:
./scripts/verify-release.shIt runs, in order: formatting, vet,
golangci-lint, race tests with the same coverage profile used by CI, the 100% coverage checker,goreleaser check, agoreleaser release --snapshot --cleandry run, tap repo and token existence, the CHANGELOG date check, the SECURITY/README content checks, and a clean-tree check.You can run the individual GoReleaser gates directly:
gofmt -l . go vet ./... golangci-lint run go test ./... -race -coverpkg=./internal/...,./cmd/... -covermode=atomic -coverprofile=cover.out go run github.com/vladopajic/go-test-coverage/v2@v2.18.8 --config=.testcoverage.yml goreleaser check goreleaser release --snapshot --clean -
Commit the changelog and any version-related changes.
The build version is injected at release time via -ldflags (main.version,
main.commit, main.date); there is no version constant to bump in source.
Release Candidate
From a release candidate branch:
git tag vX.Y.Z-rc.N
git push origin vX.Y.Z-rc.N
The tag build creates a Gitea prerelease (any tag with a - suffix) with the archives and
SHA256SUMS.
Production Release
From main:
-
Update CHANGELOG.md with the release date.
-
Commit changelog changes:
git commit -am "docs: changelog for v$VERSION" -
Push
mainand wait for CI to pass on the release commit. -
Tag and push. Prefer a signed annotated tag:
git tag -s vX.Y.Z -m "vX.Y.Z" git push origin vX.Y.Z
The tag build runs every CI gate, then scripts/build-release.sh <version> cross-compiles the
mac/linux arm64+amd64 and windows amd64 binaries into dist/ archives, and CI attaches them
and a SHA256SUMS to the tag's Gitea release.
The Homebrew cask in KofTwentyTwo/homebrew-tap is not updated by CI; update it by hand from
the release's SHA256SUMS until the tap has its own workflow.