Skip to main content

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

GoReleaserAnodizerNotes
project_nameproject_nameIdentical
buildscrates[].buildsNested under crate config
archivescrates[].archivesSame fields, nested under crate
checksumdefaults.checksum or crates[].checksumCan be global or per-crate
changelogchangelogSame structure
releasecrates[].releaseNested under crate
brewscrates[].publish.homebrewRenamed; nested under publish
scoopcrates[].publish.scoopNested under publish
mcpmcpIdentical 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
dockerscrates[].dockerNested under crate
signssignsTop-level, same structure
nfpmscrates[].nfpmNested under crate
announcesannounceSame structure
snapshotsnapshotIdentical
envenvIdentical
before.hooksbefore.hooksIdentical

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

  1. Crate-centric config: In GoReleaser, builds/archives/releases are top-level arrays. In anodizer, they're nested under crates[] to support workspace-based releases.

  2. Cross-compilation: GoReleaser uses GOOS/GOARCH. Anodizer uses Rust target triples (x86_64-unknown-linux-gnu) with auto-detected cross-compilation strategy.

  3. 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).

  4. Package manager names: brewspublish.homebrew, scooppublish.scoop. MCP keeps the same top-level mcp: key — see MCP registry for the nested mcp.github: collapse.

Migration steps

  1. Install anodizer: cargo install anodizer
  2. Run anodizer init to generate a starter config from your Cargo.toml
  3. Copy relevant settings from your .goreleaser.yaml into .anodizer.yaml, adjusting for the nested crate structure
  4. Run anodizer check to validate
  5. Run anodizer release --dry-run to verify the pipeline
  6. Replace the goreleaser/goreleaser-action step in CI with tj-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.