Use this checklist for every release. All items must be completed before publishing.
- All tests pass:
go test ./... - Linting passes:
make lint - Formatting is clean:
gofmt -l .returns nothing - Security scan passes:
gosec ./... - No TODOs or FIXMEs in release-critical code
- Dependencies are up to date:
go list -u -m all
- CHANGELOG.md updated with version and changes
- VERSION in version.go matches release tag
- API documentation is current
- MIGRATION.md updated if breaking changes
- Docs build successfully
- Clean build succeeds:
go build ./... - Cross-platform builds pass
- Binary artifacts build correctly
- Docker images build successfully
- Checksums match across builds
- Source tarball created
- Binaries built for all platforms
- SHA256SUMS file generated
- Optional: GPG signature created
- Release notes drafted
# Update version in version.go
# Update CHANGELOG.md
# Commit changes
git add internal/version/version.go CHANGELOG.md
git commit -m "chore: prepare for v0.1.0"# Create signed tag
git tag -s v0.1.0 -m "Release v0.1.0"
# Verify tag
git tag -v v0.1.0
# Push tag
git push origin v0.1.0# Run release build
make release
# Verify checksums
sha256sum -c SHA256SUMS# Using gh CLI
gh release create v0.1.0 \
--title "v0.1.0" \
--notes-file RELEASE_NOTES.md \
lattice-*.tar.gz \
SHA256SUMS- GitHub release published
- Assets downloadable and verify
- Go module proxy has indexed (check pkg.go.dev)
- Docker images available
- CI/CD passes on tag
- GitHub discussion created
- Release notes tweeted/posted
- Changelog updated on website
- Users notified of breaking changes
If critical issues are found:
- Yank the version on GitHub (delete release, keep tag)
- Publish v0.1.1 with fix immediately
- Users can pin to working version
- Delete image tag from registry
- Push corrected image
- Update latest tag
- MAJOR: Breaking changes to API or storage format
- MINOR: New features, backward compatible
- PATCH: Bug fixes, backward compatible
- Format:
v0.1.0-alpha.1,v0.1.0-beta.1,v0.1.0-rc.1 - Alpha: Early development, unstable
- Beta: Feature complete, testing needed
- RC: Release candidate, only fixes allowed
- Mark as deprecated in documentation
- Add compiler warning if applicable
- Maintain for 2 minor versions
- Remove in next major version