Dagger vs Earthly: ポータブルなCIパイプライン比較
どちらもラップトップと任意のCIで同一に動くコンテナ化されたパイプラインを定義できます。DaggerはSDKを介してパイプラインをコードとして表現し、EarthlyはDockerfileとMakefileの構文を融合したEarthfileを使います。
DaggerとEarthlyは同じ痛みに取り組みます: CIでしか動かず、ローカルでは異なる挙動をするCIパイプラインです。どちらもキャッシュと再現性のためにBuildKitを基盤としますが、パイプラインの記述方法が異なります。以下は比較です。
| Dagger | Earthly | |
|---|---|---|
| パイプライン定義 | SDK経由のコード(Go、Python、TS)+ Dagger Functions | Earthfile(Dockerfile + Makefileスタイル) |
| エンジン | BuildKitベース | BuildKitベース |
| ポータビリティ | ラップトップと任意のCIで同じ | ラップトップと任意のCIで同じ |
| キャッシュ | 自動のレイヤー/opキャッシュ | 自動のレイヤーキャッシュ + cache mounts |
| メンタルモデル | プログラム可能なDAG / 関数 | 宣言的なtargets |
| 最適な用途 | 複雑なロジック、言語をまたいだ再利用 | シンプルで読みやすいbuild targets |
コード vs 宣言的
Daggerはパイプラインを、本物の言語(Go、Python、TypeScriptなど)で書くプログラム可能な関数としてモデル化します。これはパイプラインのロジックが複雑または共有される場合に強力です。Earthlyは物事を宣言的に保ちます。EarthfileはビルドtargetsをもつDockerfileのように読め、素早く理解しレビューできます。プログラマビリティが欲しいか読みやすさが欲しいかで選びましょう。
キャッシュと再現性
どちらもBuildKit上で動くため、ビルドステップを内容でキャッシュし、変更されていない作業をスキップします。Earthlyは明示的なcache mountsとtargetレベルのキャッシュを公開し、Daggerはエンジン内で操作を自動的にキャッシュします。どちらも、ローカルでのグリーンな実行がCIでのグリーンな実行を意味するのが主な利点です。
CIでは
どちらもステップをコンテナで包むため、私の環境では動くという失敗を減らし、CIロジックをCIプロバイダーの外でテスト可能にします。CIがビルド間でレイヤーを再利用するように、永続的なBuildKitキャッシュとともにDaggerエンジンまたはEarthlyを実行しましょう。
結論
言語をまたいだ再利用ができる本物のコードとしてのパイプラインが欲しいなら: Dagger。読みやすくDockerfileに似たEarthfileでニーズが満たせるなら: Earthly。どちらもローカルとCIで同じように動く、ポータブルでキャッシュに優しいビルドを提供します。