Repository navigation
Closed as not planned
Closed as not planned
Copy link
Labels
MVPMinimum viable product featuresMinimum viable product featuresenhancementNew feature or requestNew feature or requestgithub_actionsPull requests that update GitHub Actions codePull requests that update GitHub Actions codepriority:highHigh priority taskHigh priority taskstatus:backlogTask in backlogTask in backlog
Milestone
Description
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.ymlis 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.ymlconfiguration 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
- Target:
- 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.ymlwith minimal GoReleaser workflow - Remove cargo-dist installation from:
security.ymlcopilot-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
- GoReleaser configuration successfully builds all current platforms
- GitHub Releases match current format and content
- Homebrew tap updates automatically
- SBOMs are generated for all artifacts
- Attestations/signatures work correctly
- Release workflow is under 100 lines
- No actionlint warnings
- Successfully complete a test release
References
- GoReleaser Rust/Cargo Documentation
- GoReleaser Homebrew Documentation
- Current cargo-dist config:
Cargo.toml(profile.dist section) - Current release workflow:
.github/workflows/release.yml
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.
Metadata
Metadata
Assignees
Labels
MVPMinimum viable product featuresMinimum viable product featuresenhancementNew feature or requestNew feature or requestgithub_actionsPull requests that update GitHub Actions codePull requests that update GitHub Actions codepriority:highHigh priority taskHigh priority taskstatus:backlogTask in backlogTask in backlog
Activity
traycerai commentedon Nov 10, 2025
Plan
Observations
The project uses cargo-dist for multi-platform releases across 5 targets, with shell/PowerShell/Homebrew installers, SBOM via cargo-cyclonedx, attestations, and a Homebrew tap. The auto-generated release workflow is complex (300+ lines) and triggers actionlint warnings. justfile includes cargo-dist recipes and partial GoReleaser setup with macOS SDK handling. Cargo.toml defines a dist profile with thin LTO. Security and Copilot workflows install cargo-dist. Documentation references cargo-dist processes.
Approach
Migrate to GoReleaser by creating
.goreleaser.ymlto replicate all features: Rust builds with cargo-zigbuild and auditable, archives/checksums, SBOM, Homebrew cask publishing, and release assets including custom installers. Replace the release workflow with a simple GoReleaser action plus attestations. Remove cargo-dist from justfile, workflows, and config files. Update documentation for new process. Test via snapshot releases.Reasoning
I listed repository files to identify cargo-dist configs and workflows. I read the release.yml to confirm its complexity and generation. I examined dist-workspace.toml for current settings like targets and installers. I reviewed Cargo.toml for build profiles. I checked justfile for existing recipes. I inspected security.yml and copilot-setup-steps.yml for cargo-dist installations. I browsed docs for release references.
Proposed File Changes
📄 .goreleaser.yml (NEW) 🔗
📄 .github/workflows/release.yml (MODIFY) 🔗
📁 scripts (NEW) 🔗
📄 scripts/install.sh (NEW) 🔗
📄 scripts/install.ps1 (NEW) 🔗
📄 dist-workspace.toml (DELETE) 🔗
📄 justfile (MODIFY) 🔗
📄 Cargo.toml (MODIFY) 🔗
📄 .github/workflows/security.yml (MODIFY) 🔗
📄 .github/workflows/copilot-setup-steps.yml (MODIFY) 🔗
📄 docs/src/installation.md (MODIFY) 🔗
📄 docs/src/contributing.md (MODIFY) 🔗
📄 README.md (MODIFY) 🔗
Import In IDE
🤖 Prompt for AI Agents
Developer Humor
Execution Information
Branch: main
Commit: 37cfc7c
💡 Tips
Supported Commands (Inside Comments)
@traycerai generateto iterate on the previous version of the implementation plan.Supported Commands (Inside Description)
@traycerai ignoreanywhere in the ticket description to prevent this ticket from being processed.@traycerai branch:<branch-name>anywhere in the ticket description to specify the target branch for the implementation plan.Community
unclesp1d3r commentedon Nov 10, 2025
@coderabbitai Enhance this issue body with additional context and a proposed solution. Improve the issue title and assign the proper labels and other metadata.
[-]Move from cargo-dist to GoReleaser[/-][+]Migrate release tooling from cargo-dist to GoReleaser before v0.1[/+]coderabbitai commentedon Nov 10, 2025
Tip
For best results, initiate chat on the files or code changes.
🧩 Analysis chain
🏁 Script executed:
Length of output: 27646
🏁 Script executed:
Length of output: 122
🏁 Script executed:
Length of output: 1642
🏁 Script executed:
Length of output: 1074
@unclesp1d3r I've successfully enhanced issue #65 with the following improvements:
✅ Updated Title
"Migrate release tooling from cargo-dist to GoReleaser before v0.1"
✅ Enhanced Issue Body
Added comprehensive context including:
✅ Added Metadata
enhancement,github_actions,priority:high,MVPThe issue now provides a clear, actionable roadmap for the migration with all the context needed for implementation! 🚀
traycerai commentedon Nov 10, 2025
I have updated the Implementation Plan to reflect the recent changes in the ticket.
unclesp1d3r commentedon Jul 5, 2026
Decision: not migrating to GoReleaser — keeping cargo-dist
After grounding this against the actual repo and verifying GoReleaser's Rust support, this is a won't-do. Summary below.
The migration doesn't survive our target matrix
Our
dist-workspace.tomlbuilds 6 targets, including two MSVC targets —x86_64-pc-windows-msvcandaarch64-pc-windows-msvc(Windows ARM64) — plusx86_64-unknown-linux-musl, withmsvc-crt-static = true.GoReleaser's Rust builder cross-compiles via cargo-zigbuild, which supports only Linux and macOS targets — not Windows MSVC (per cargo-zigbuild's own README). GoReleaser's Rust docs never mention MSVC, Windows-ARM64, or cargo-xwin. The natural workaround (build MSVC natively, then merge) is GoReleaser Pro (paid).
The half-finished
.goreleaser.yamlalready in the repo confirms this: it silently dropped Windows-ARM64 + musl, switched Windows to the GNU ABI, and notes zigbuild can't do macOS (so macOS needs a mac runner anyway). It reaches ~40% parity only by reducing what we ship. Going to GoReleaser at true parity has no open-source path today.The strongest reason to leave cargo-dist turned out false
cargo-dist /
distis actively maintained — v0.32.0 shipped 2026-05-22 with real changelog work; axo.dev is live. No abandonment signal.The actionlint pain is already fixed
The main concrete complaint here was actionlint noise from the generated
release.yml. That's already resolved:actionlint .github/workflows/*.yml→ exit 0, zero warnings..github/actionlint.ymlsuppressesrelease.ymlviapaths:ignore (added 2026-06-20,6aa4147)..pre-commit-config.yamlalso excludesrelease.ymlfrom the actionlint hook.The other cited pains (300+ line generated workflow, cross-workflow tool sync) are inherent to any generated-workflow release tool and don't justify moving to a less-mature one.
Reversal trigger
Revisit if any of these change:
cargo-xwin/MSVC cross-compile in OSS, orClosing as not planned.