Context
Our current release process uses cargo-dist to build and publish releases. While cargo-dist has served us well, we've encountered some friction points that would be resolved by migrating to GoReleaser.
Current State
The cargo-dist configuration includes:
- Multi-platform builds (Linux x86_64, Linux ARM, macOS, Windows)
- GitHub Release creation with auto-generated release notes
- Homebrew formula publishing to
EvilBit-Labs/homebrew-tap
- SBOM generation using cargo-cyclonedx
- Build attestations for supply chain security
- Artifact signing and checksums
Problems with Current Approach
- Workflow Complexity: The generated
.github/workflows/release.yml is over 300 lines and difficult to customize
- Actionlint Warnings: The auto-generated workflow consistently triggers actionlint warnings, cluttering our CI output
- Limited Flexibility: cargo-dist's opinionated approach makes it challenging to customize the release process
- Maintenance Burden: Need to keep cargo-dist installation scripts in sync across multiple workflow files (
security.yml, copilot-setup-steps.yml)
Why GoReleaser?
- Better Rust Support: GoReleaser now has official Rust/Cargo support with good cross-compilation capabilities
- More Mature Ecosystem: Extensive plugin system and well-documented customization options
- Cleaner Configuration: YAML-based config is easier to understand and maintain than generated workflows
- Flexible: Easier to customize release behavior, artifacts, and publishing strategies
- No Generated Workflows: Uses a single reusable action, avoiding actionlint issues
- Rich Feature Set: Built-in support for Docker, Snapcraft, AUR, and many other distribution channels
Proposed Solution
Phase 1: Setup GoReleaser Configuration
- Create
.goreleaser.yml configuration file with:
- Rust build configuration for all target platforms
- Archive generation matching current artifact structure
- Checksum generation
- GitHub Release publishing
Phase 2: Migrate Publishing Targets
- Homebrew: Configure GoReleaser's Homebrew tap publisher
- Target:
EvilBit-Labs/homebrew-tap
- Ensure formula matches current structure
- SBOM Generation: Integrate SBOM generation (cargo-cyclonedx or built-in)
- Attestations: Configure artifact signing and attestations
Phase 3: Update CI/CD
- Replace
.github/workflows/release.yml with minimal GoReleaser workflow
- Remove cargo-dist installation from:
security.yml
copilot-setup-steps.yml
- Update any documentation referencing cargo-dist
Phase 4: Testing & Validation
- Test release process with pre-release tag
- Verify all artifacts are generated correctly
- Confirm Homebrew formula updates work
- Validate checksums and signatures
- Test installation on all supported platforms
Success Criteria
References
Timeline
This migration should be completed before releasing v0.1, as changing release tooling after the first major release would be more disruptive to users who may have automated installations.
Context
Our current release process uses cargo-dist to build and publish releases. While cargo-dist has served us well, we've encountered some friction points that would be resolved by migrating to GoReleaser.
Current State
The cargo-dist configuration includes:
EvilBit-Labs/homebrew-tapProblems with Current Approach
.github/workflows/release.ymlis over 300 lines and difficult to customizesecurity.yml,copilot-setup-steps.yml)Why GoReleaser?
Proposed Solution
Phase 1: Setup GoReleaser Configuration
.goreleaser.ymlconfiguration file with:Phase 2: Migrate Publishing Targets
EvilBit-Labs/homebrew-tapPhase 3: Update CI/CD
.github/workflows/release.ymlwith minimal GoReleaser workflowsecurity.ymlcopilot-setup-steps.ymlPhase 4: Testing & Validation
Success Criteria
References
Cargo.toml(profile.dist section).github/workflows/release.ymlTimeline
This migration should be completed before releasing v0.1, as changing release tooling after the first major release would be more disruptive to users who may have automated installations.