anodizer について
anodizerはRustプロジェクト向けのリリースツールで、Cargo workspaceや複数の配布先を管理する開発者を対象としています。宣言的な設定でビルド、パッケージ化、署名、公開、告知をまとめ、MCPサーバーも備えています。
主な機能
- 01Cargo workspaceとcrateごとのリリース周期
- 02クロスプラットフォームビルドとパッケージ生成
- 03再現性チェックと成果物の署名
- 04crates.ioなど複数の配布先への公開
- 05リリース操作と進捗確認のMCPツール
活用シーン
- 01Cargo workspaceからリリース一式を実行
- 02依存順に複数のcrateを公開
- 03MCPクライアントから設定確認やリリース操作
MCP 対応
`anodizer mcp`は、CLIのサブコマンドをJSON Schema付きのMCPツールとしてstdioまたはstreamable HTTPで公開します。長時間処理ではタスクハンドルを返し、進捗確認やキャンセルができます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
docker run -i --rm ghcr.io/tj-smith47/anodizerローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ghcr.io/tj-smith47/anodizerstdioツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
Anodizer は宣言型の設定ファイルを読み込み、単一の anodizer release コマンドでビルド、アーカイブ、チェックサム、変更履歴、署名、リリース、公開、告知まで、リリース全体を実行します。Rust エコシステムを中心に構築されており、Cargo ワークスペース、Cargo.lock を考慮したバージョン更新、crates.io、バイト単位で再現可能なアーティファクトに対応しています。
機能ごとのステータスについては、実際に動作する機能(証拠付き)をご覧ください。「稼働中」とするすべての機能には、自分で検証できる実際の公開済みアーティファクトへのリンクがあります。
anodizer を選ぶ理由
リリース対象は Cargo ワークスペースであり、ばらばらのバイナリの寄せ集めではありません。anodizer は最初からその前提で構築されています。
- Cargo に対応しています。 クレートごとのリリース周期、クレートごとのタグ、タグ解決機能により、単一クレートから 30 クレートのモノレポまで、ひとつの設定を共有できます。
anodizer tagとanodizer bumpはCargo.tomlとCargo.lockの両方を書き換えたうえで、コミットとタグ付けを行います。デフォルトではローカルで実行され、(--pushを指定した場合は)バージョン更新のコミットとタグをアトミックにプッシュします。取り残されたバージョン更新コミットも、手作業でのgit pushも、ロックファイルの不整合もありません。 - 依存関係に適した順序で crates.io に公開します。 依存関係を考慮した順序付けと sparse-index のポーリングにより、依存先のクレートが伝播するまで各クレートの公開を保留します。そのため、ワークスペースの公開処理が競合し、一時的に「バージョンが見つからない」状態になることはありません。
- ツールチェーンの負担なくクロスコンパイルできます。
cargo-zigbuildまたはcrossを使い、1 台のマシンから musl、glibc、Windows、macOS 向けにビルドできます。rustup target addを繰り返す必要も、ターゲットごとに CI のジョブを分割して管理する必要もありません。 - 再現可能であることを証明できます。 デフォルトで決定論的なアーティファクトを生成し、さらに
anodizer check determinismで再ビルドしてバイト単位で比較します。「再現可能」はリリースノート上の主張ではなく、CI が強制する事実になります。 - 署名と証明書が中核機能です。 cosign と GPG によるバイナリ、アーカイブ、チェックサム、イメージの署名に加え、SLSA 形式のビルド来歴にも、数行の設定で対応できます。
さらに、Rust の作者が実際に必要とする細かな機能もそろっています。クレートごとに README を生成し、設定から直接 cargo-binstall のメタデータを作成するため、404 になる pkg-url を手作業で管理する必要がありません。また、version_files でドキュメントやインストールスクリプトのバージョンをリリース済みのバージョンに固定できるほか、リリース後のインストールスモークテストで、ユーザーが気付く前にアーティファクトの不具合を検出できます。
GoReleaser をご存じですか? anodizer の {{ .Field }} テンプレート構文はすぐに使いこなせるでしょう。cargo-dist、release-plz、cargo-release からの移行をお考えですか? 移行ガイドで、現在の設定をそのまま置き換える方法をご確認ください。
機能
ビルド
cargo-zigbuild、cross、またはネイティブのcargo buildによるクロスプラットフォームビルド- ビルドごとのフック(前処理/後処理)、環境変数、機能フラグ、ターゲットの上書き
- ターゲットごとのフィルタリングに対応したUPXバイナリ圧縮
- クレートごとに独立したリリースサイクルを設定できるワークスペース対応
パッケージ
- OS固有の上書き設定に対応した、tar.gz、tar.xz、tar.zst、zip、gz、またはrawバイナリ形式のアーカイブ
- nFPMによるLinuxパッケージ(.deb、.rpm、.apk、.archlinux、.ipk)と、完全なライフサイクルスクリプト
- prime-dir方式のSnapcraftスナップ
- macOS DMGディスクイメージとPKGインストーラー
- Windows MSIおよびNSISインストーラー
- Flatpakバンドル
- AppImageポータブルLinuxアプリケーション
- Makeself自己解凍アーカイブ
curl | shインストールスクリプトの生成 — ビルド/アーカイブ設定から生成されるプラットフォームごとのアセットテーブル(404になるURLを手作業で管理する必要はありません)とチェックサム検証ゲート- ソースRPM(.src.rpm)
- ファイルフィルタリングに対応したソースアーカイブ
- SBOMの生成(CycloneDX/SPDX)
- SHA-256、SHA-512、SHA3、BLAKE2b、BLAKE2s、BLAKE3、CRC32、MD5などによるチェックサム — すべてまとめた形式、または成果物ごとに分けたサイドカーファイル形式に対応し、bare形式とcoreutils形式(
shasum -c)を選択可能
署名
- バイナリ、アーカイブ、チェックサム、Dockerイメージ、SBOMに対するGPGおよびcosign署名
- 既存のgit署名鍵を使用した署名付きgitタグ(GPGまたはSSH)
- 複数の独立した署名設定
- テンプレート式による条件付き署名
- バイナリと成果物のビルド来歴証明(SLSA形式)
公開
- アセットのアップロード、ドラフト/プレリリースの検出、ヘッダー/フッターのテンプレートに対応したGitHub/GitLab/Gitea Releases。リポジトリのオーナーと名前は
originリモートから自動設定されます - 依存関係を考慮した順序付けとインデックスのポーリングに対応したcrates.io
- Homebrewフォーミュラおよびcaskの生成
- Homebrew-coreフォーミュラの更新PR(既存の
homebrew-coreフォーミュラを更新) - Scoopマニフェストの生成
- Chocolateyパッケージの生成
- Wingetマニフェストの生成
- AUR PKGBUILDおよび.SRCINFOの生成
- Krewプラグインマニフェストの生成
- Nix導出の生成
- 設定ファイルのエディター自動補完のためのSchemaStoreカタログ登録
- MCPレジストリへのサーバーマニフェストの公開(Model Context Protocol)
docker buildxによるDockerマルチアーキテクチャイメージ- Blobストレージへのアップロード(S3、GCS、Azure)
- プラットフォームごとのNPMバイナリパッケージおよびPyPIネイティブバイナリホイール
- crates.io、npm(来歴情報付き)、PyPI向けのキーレスOIDC Trusted Publishing — レジストリトークンの保存は不要です
- Artifactory、Cloudsmith、Fury、Docker Hub
- カスタム公開コマンド
告知
- Discord、Slack、Telegram、Teams、Mattermost
- メール、Reddit、Twitter/X、Mastodon、Bluesky、LinkedIn
- OpenCollective、Discourse
- カスタムヘッダーとテンプレートに対応した汎用Webhook
高度な機能
- GoReleaser互換の
{{ .Field }}構文に対応したTeraテンプレート(Jinja2風) - 日付ベースのバージョン管理によるナイトリービルド
- 設定共有のための設定ファイルのインクルード
- ビルドを並列に振り分けるファンアウト型CIに対応した分割/マージ
- ワークスペースごとに独立して運用できるモノレポ対応
- コミットメッセージのディレクティブによる自動タグ付け
mod_timestampとbuilds_infoによる再現可能なビルド- バージョン文字列ファイルの同期(
version_files)により、タグ付け時にドキュメント、スクリプト、マニフェストのバージョンを一致 - 公開先をまたいだトラック昇格(
anodizer promote) — 再ビルドせずに、公開済みの成果物を安定版トラックに切り替え(snapcraftチャンネル、npm dist-tag、OCIの可変タグ、GitHubプレリリース) - インストールのスモークテストによるリリース後の検証
- 実行時に公開されたすべてのリリース、プルリクエスト、パッケージ、イメージを一覧表示するGitHub Actionsのジョブサマリー
- エディターの自動補完と検証に対応したJSON Schema
- AIアシスタント向けに、注釈付きツールとしてCLIを公開する組み込みMCPサーバー(
anodizer mcp)
インストール
Homebrew(macOS/Linux)
brew install tj-smith47/tap/anodizer
Cargo
cargo install anodizer
ソースから
git clone https://github.com/tj-smith47/anodizer.git
cd anodizer
cargo install --path crates/cli
クイックスタート
# Generate a starter config from your Cargo workspace
anodizer init > .anodizer.yaml
# Validate your config
anodizer check
# Check that required tools are available
anodizer healthcheck
# Build a snapshot (no publishing)
anodizer release --snapshot
# Dry run (full pipeline, no side effects)
anodizer release --dry-run
# Bump crate versions from Conventional Commits — rewrites Cargo.toml + Cargo.lock,
# no tag (tag separately, or let the release workflow tag for you)
anodizer bump --dry-run --output json # preview the per-crate plan as JSON
anodizer bump # infer patch/minor/major per crate since its last tag
anodizer bump minor --package mycrate # force a level for one crate
anodizer bump --workspace --commit --changelog # bump every member, commit, refresh CHANGELOG.md
anodizer bump --pre rc.1 # append a prerelease identifier (0.5.0-rc.1)
# Auto-tag from commit directives
# (Conventional Commits: feat: → minor, fix: → patch, BREAKING CHANGE: → major)
anodizer tag --dry-run # preview what tag would be created
anodizer tag --push --changelog # tag + refresh changelog + push (triggers the release)
anodizer tag --sign --push # signed annotated tag (uses git user.signingkey)
anodizer tag --custom-tag v0.1.0 # force a tag value, bypassing bump derivation
anodizer tag --version 1.2.3 --crate mycrate # pin an exact version for recovery (per-crate mode)
anodizer tag rollback "$GITHUB_SHA" # delete anodizer-managed tags at a SHA + revert the bump
# Resume a stalled release from a populated dist/ — no rebuild
anodizer continue # resume the publish-only pipeline after a transient failure
anodizer continue --merge # fan-in split-build workers, then sign/checksum/release/publish
anodizer continue --skip npm,announce # resume but skip named stages/publishers
# Run only the publish stages (release / blob / publish) from a completed dist/
anodizer publish --publishers homebrew,scoop # publish to a subset of configured publishers
anodizer publish --dry-run # preview the publish chain with no side effects
# Promote an already-published artifact to a stable track — no rebuild
anodizer promote --to stable # promote the newest prerelease artifact
anodizer promote --to stable --from candidate --dry-run # preview promoting from a named source track
anodizer promote --to stable --version v1.2.0 \
--publishers snapcraft,npm # promote a pinned version on chosen publishers
CIベースのリリースでは、GITHUB_TOKEN(またはANODIZER_GITHUB_TOKEN)をシークレットとして設定してください。リリースパイプラインが自動的に読み込みます。
設定
Anodizer は、プロジェクトのルートにある .anodizer.yaml(または .anodizer.toml)を使用します。エディターの自動補完を有効にするには、スキーマコメントを追加します。
# yaml-language-server: $schema=https://tj-smith47.github.io/anodizer/schema.json
project_name: myapp
defaults:
targets:
- x86_64-unknown-linux-gnu
- aarch64-unknown-linux-gnu
- x86_64-apple-darwin
- aarch64-apple-darwin
- x86_64-pc-windows-msvc
cross: auto
crates:
- name: myapp
path: "."
tag_template: "v{{ Version }}"
builds:
- binary: myapp
archives:
- name_template: "{{ ProjectName }}-{{ Version }}-{{ Os }}-{{ Arch }}"
files: [LICENSE, README.md]
release:
github:
owner: myorg # optional: read from the origin remote when omitted
name: myapp
publish:
cargo: {}
homebrew_cask:
repository:
owner: myorg
name: homebrew-tap
binaries: [myapp]
使用できるすべてのフィールド、変数、フィルターについては、設定の完全なリファレンスとテンプレートのリファレンスをご覧ください。
実際の導入例:cfgd
cfgd — 宣言型の GitOps スタイルによるマシン設定管理 — は anodizer を実際のプロジェクトに初めて導入し、リリース済みのすべてのパブリッシャーを自ら利用しています。4 つのクレートからなるワークスペース(共有ライブラリ+CLI+Kubernetes オペレーター+CSI ドライバー)で、依存関係を考慮した順序で crates.io に公開するほか、GitHub Releases、Homebrew、Scoop、Chocolatey、Winget、Snap Store、Krew、GHCR、および cargo binstall を通じて配布しています。これらすべてを 1 つの .anodizer.yaml と 1 回のタグプッシュで実現しています。
cfgd の .anodizer.yamlを一部抜粋します。
workspaces:
- name: cfgd-core
crates:
- name: cfgd-core
tag_template: "core-v{{ Version }}"
version_sync: { enabled: true, mode: cargo }
- name: cfgd
crates:
- name: cfgd
depends_on: [cfgd-core]
version_sync: { enabled: true, mode: cargo }
universal_binaries:
- name_template: "{{ ProjectName }}"
replace: false
binstall:
enabled: true # pkg-url + per-target overrides derived from archive.name_template
# ... cfgd-operator, cfgd-csi
動作する機能(証拠付き)の各セルから、該当する機能の cfgd 公開済みアーティファクトを確認できます。検証結果はリンク先にあります。
GitHub Actions
Anodizer には公式アクション tj-smith47/anodizer-action が付属しています。このリポジトリでは、独自の release.yml でこのアクションを利用しています。
# not an anodizer config
name: Release
on:
push:
tags: ["v*"]
permissions:
contents: write
jobs:
release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0
- uses: dtolnay/rust-toolchain@stable
- name: Release
uses: tj-smith47/anodizer-action@v1
with:
version: latest # accepts `latest`, `nightly`, or an exact tag (e.g. `v0.5.0`). Pin in production.
auto-install: true # auto-detect nfpm/makeself/snapcraft/cosign/etc from .anodizer.yaml
args: release --clean
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
分割・統合後のファンアウト、GPG キーのインポート、レジストリへのログイン、プラットフォームごとのバリアントについては、anodizer-actionと、このリポジトリの稼働中の.github/workflows/release.ymlをご覧ください。
MCP サーバー
anodizer mcp は、brontes をベースに、stdio またはストリーミング可能な HTTP 経由で、あらゆる MCP クライアントから CLI を利用できるようにします。Claude Desktop、VS Code、Cursor、Zed に対応しています。
すべてのサブコマンドが、フラグを JSON Schema として持つツールになります。そのため、手作業でラッパーを用意しなくても、アシスタントからリリースを実行できます。
$ anodizer mcp claude enable # register with Claude Desktop (also: vscode, cursor, zed)
$ anodizer mcp start # stdio, for a client that spawns the process
$ anodizer mcp stream --port 8080 # streamable HTTP, for a shared/remote client
$ anodizer mcp tools # dump the tool list to mcp-tools.json for inspection
デフォルトでは 23 個のツールが提供されます(completion と man はシェルプロンプト用の機能であるため除外されています)。すべてのツールを表示する必要がないクライアント向けに、3 つのグループで絞り込めます。
| 選択 | ツール | 対象 |
|---|---|---|
| (デフォルト) | 23 | すべて |
--group inspect | 9 | check config、check version-files、healthcheck、preflight、jsonschema、resolve-tag、targets、vocabulary、tools |
--group author | 5 | init、changelog、bump、tag、tag rollback |
--group ship | 7 | build、release、publish、promote、continue、announce、notify |
同じ --group/--command/--tool フラグが mcp start と mcp stream の両方で使用できます。エディター用のインストーラーにもこれらのフラグが引き継がれるため、anodizer mcp claude enable --group inspect を実行すると、読み取り専用のアシスタントを登録できます。それぞれに --hide- を付けたフラグも用意されており、必要なものを選択する代わりに、全リストから不要なものを除外できます。
各ツールにはクライアントが判定に使えるアノテーションが付いているため、設定の検証と公開を、実行前に区別できます。
| アノテーション | コマンド |
|---|---|
readOnlyHint | inspect グループ — preflight のみ openWorldHint も設定 |
| 冪等なローカル書き込み | build、changelog、check determinism、init、tag |
冪等+openWorldHint | announce、continue、notify、promote、publish、release |
| 非冪等 | bump — 2 回実行すると、バージョンが 2 回上がります |
destructiveHint | tag rollback — パブリッシャーを巻き戻し、タグを削除し、履歴を書き換えます |
通常、数分かかる 6 つのコマンド(build、check determinism、continue、promote、publish、release)は、リクエストを開いたままにする代わりにタスクハンドルを返します。そのため、MCP tasks 拡張に対応したクライアントは、実行中のリリースの進捗をポーリングまたはストリーミングし、キャンセルできます。
CLI リファレンス
anodizer release Full release pipeline (--snapshot, --dry-run, --split/--merge, --publish-only)
anodizer tag Auto-tag from commit directives
anodizer tag rollback Delete anodizer-managed tags at a SHA and revert the bump commit
anodizer bump Bump crate versions (Conventional Commits → semver level) without tagging
anodizer promote Promote a published artifact to a stable track without rebuilding
anodizer continue Resume a stalled or split release from a populated dist/ (--merge to fan-in)
anodizer publish Run only the publish stages (release, blob, publish) from a completed dist/
anodizer check Validate configuration + run determinism harness
anodizer preflight Run the release preflight without releasing (tools, secrets, publisher credentials and state)
anodizer init Generate starter .anodizer.yaml
anodizer healthcheck Probe external tools (nfpm, cosign, ...)
失敗処理はプロセス内で行われます。anodizer release が失敗すると、release.on_failure ポリシー自体が実行されます(デフォルトは rollback — タグを削除し、バージョン更新を元に戻します。crates.io のような一方向の公開先で公開された後は、自動的に hold に切り替わります)。そのため、リリースのワークフローに if: failure() による復旧ステップは必要ありません。強制終了または保留になった実行を手動で復旧するコマンドは anodizer tag rollback "$GITHUB_SHA" です。フラグの一覧と復旧の流れについては、
リリースの耐障害性
をご覧ください。
完全なリファレンスは anodizer --help またはドキュメントサイトをご覧ください。
ドキュメント
完全なドキュメントは tj-smith47.github.io/anodizer でご覧いただけます。
運用ガイド:
- リリースの耐障害性ガイド - 3 グループの公開先へのディスパッチ、Submitter ゲート、ロールバック、実行からの再生
- 決定性ガイド - バイト単位の安定性に関する契約、
anodizer check determinismのハーネス、ランタイムの許可リスト
ライセンス
以下のいずれかのライセンスが適用されます。
- Apache License, Version 2.0 (LICENSE-APACHE または https://www.apache.org/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT または https://opensource.org/licenses/MIT)
選択は任意です。
特に明記されていない限り、Apache-2.0 ライセンスで定義されているとおり、本作品への収録を目的としてあなたが意図的に提出した貢献は、追加の条項や条件なしに、上記のデュアルライセンスでライセンスされます。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。