GoReleaser vs nFPM: リリース vs パッケージ build
両者は重なりますがスコープが異なります。nFPM はネイティブなツールチェーンなしにシンプルな設定から Linux パッケージ (deb、rpm、apk) を build し、GoReleaser はリリース全体 (build、archive、package、checksum、publish) を自動化し、パッケージングステップでは内部で nFPM を使います。
GoReleaser と nFPM はどちらも Go プロジェクト (およびそれ以外) で人気ですが、ソフトウェア出荷の異なる部分を担います。nFPM は絞り込まれた依存のない packager で、dpkg や rpmbuild をインストールせずに 1 つの YAML ファイルから deb、rpm、apk パッケージを生成します。GoReleaser はエンドツーエンドのリリースツールで、クロスプラットフォームのバイナリをコンパイルし、archive と checksum を作成し、(nFPM 経由で) パッケージを build し、GitHub/registry に公開します。
| GoReleaser | nFPM | |
|---|---|---|
| スコープ | 完全なリリース pipeline | パッケージ build のみ |
| 出力 | バイナリ、archive、パッケージ、リリース | deb、rpm、apk パッケージ |
| クロスコンパイル | あり (build を管理) | なし (ファイルは自分で用意) |
| 公開 | GitHub、registry、Homebrew など | なし (パッケージを生成するだけ) |
| 必要なネイティブツール | 不要 | 不要 (純粋な実装) |
| 関係 | 内部で nFPM を使用 | ビルディングブロック |
それぞれが本当に優れている点
nFPM はパッケージングだけが必要な場合に優れます。既存のバイナリとファイルを、ディストロ固有のツールをインストールせずに deb/rpm/apk へ変換でき、最小限の CI イメージに最適です。GoReleaser はリリース全体を自動化したい場合に優れます。クロスコンパイル、archive、checksum、changelog、署名、そして GitHub Releases、コンテナ registry、パッケージマネージャーへの公開を、すべて 1 つの設定から処理します。
CI では
GoReleaser は CI 向けに作られています。tag 付きのリリースが goreleaser release をトリガーし、あらゆる artifact を生成して公開します。多くの場合、単一の workflow ステップとして行われます。パッケージだけが必要な場合 (例えば build が別の方法ですでにバイナリを生成する場合)、nFPM は CI ステップを小さくツールチェーン不要に保ちます。多くの pipeline は、シンプルなパッケージ出力には nFPM を直接使い、完全なリリースオーケストレーションが欲しいときに GoReleaser を使います。
正直な注意点
GoReleaser は広範ですが Go プロジェクトで最も使いやすく、他の言語で使うのは動作はしますが慣用的ではなく、設定が大きくなることがあります。nFPM は意図的に狭く、build も、署名と公開も、リリース管理も行わないため、それらのステップは自分で配線します。nFPM を選ぶということは、pipeline のより多くを手動で組み立てることを意味します。
結論
ネイティブなツールなしに deb/rpm/apk パッケージだけが必要なら nFPM を使いましょう。完全なリリース自動化 (build、package、sign、publish) が欲しいなら、パッケージング部分で nFPM に依存していることを念頭に置きつつ GoReleaser を使いましょう。