From GoReleaser
Migrate from GoReleaser to anodizer
If you're coming from GoReleaser, anodizer will feel familiar. The config structure, CLI verbs, and template vocabulary are intentionally similar.
Config mapping
| GoReleaser | Anodizer | Notes |
|---|---|---|
project_name | project_name | Identical |
builds | crates[].builds | Nested under crate config |
archives | crates[].archives | Same fields, nested under crate |
checksum | defaults.checksum or crates[].checksum | Can be global or per-crate |
changelog | changelog | Same structure |
release | crates[].release | Nested under crate |
brews | crates[].publish.homebrew | Renamed; nested under publish |
scoop | crates[].publish.scoop | Nested under publish |
mcp | mcp | Identical top-level key. The deprecated nested mcp.github: block from older GoReleaser configs collapses to top-level mcp.* fields in anodizer (matches upstream's current recommendation). See MCP registry |
dockers | crates[].docker | Nested under crate |
signs | signs | Top-level, same structure |
nfpms | crates[].nfpm | Nested under crate |
announces | announce | Same structure |
snapshot | snapshot | Identical |
env | env | Identical |
before.hooks | before.hooks | Identical |
Template syntax
Both GoReleaser and anodizer template styles work:
# GoReleaser style (works in anodizer):
name_template: "{{ .ProjectName }}-{{ .Version }}-{{ .Os }}-{{ .Arch }}"
# Native Tera style:
name_template: "{{ ProjectName }}-{{ Version }}-{{ Os }}-{{ Arch }}"Key differences
-
Crate-centric config: In GoReleaser, builds/archives/releases are top-level arrays. In anodizer, they're nested under
crates[]to support workspace-based releases. -
Cross-compilation: GoReleaser uses
GOOS/GOARCH. Anodizer uses Rust target triples (x86_64-unknown-linux-gnu) with auto-detected cross-compilation strategy. -
Template engine: GoReleaser uses Go templates. Anodizer uses Tera (Jinja2-like). The GoReleaser
{{ .Field }}syntax is supported for compatibility, but Tera's native syntax offers more features (pipes, filters, loops). -
Package manager names:
brews→publish.homebrew,scoop→publish.scoop. MCP keeps the same top-levelmcp:key — see MCP registry for the nestedmcp.github:collapse.
Migration steps
- Install anodizer:
cargo install anodizer - Run
anodizer initto generate a starter config from yourCargo.toml - Copy relevant settings from your
.goreleaser.yamlinto.anodizer.yaml, adjusting for the nested crate structure - Run
anodizer checkto validate - Run
anodizer release --dry-runto verify the pipeline - Replace the
goreleaser/goreleaser-actionstep in CI withtj-smith47/anodizer-action
CI workflow replacement
Where a GoReleaser workflow looks like:
- uses: goreleaser/goreleaser-action@v6
with:
version: latest
args: release --clean
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
The anodizer equivalent is:
- uses: tj-smith47/anodizer-action@v1
with:
auto-install: true # auto-installs nfpm, cosign, etc. from .anodizer.yaml
args: release --clean
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
auto-install: true parses .anodizer.yaml and installs pipeline dependencies (nfpm for linux packages, cosign for signing, zig/cargo-zigbuild for cross-compilation, ...) — the anodizer action's equivalent of GoReleaser's bundled Go-native implementations. See anodizer-action reference for all inputs.