この記事では、DaggerというCI/CDツールの基礎を解説していきます。
ハンズオンも交えつつ解説するので、少しでも参考になれば幸いです。
Daggerとは何か?【概要】
Daggerとは、Docker創始者らが開発したソフトウェアのビルド・テスト・デプロイの自動化(CI/CD)をポータブルにするツールです。
And we are live! Introducing Dagger, a new way to build CI/CD pipelines. By the creators of Docker. https://t.co/DU8racmoUo
— dagger (@dagger_io) March 30, 2022
「ポータブル」とは、要は様々なCI/CD用のプラットフォーム(GitHub ActionsやCircleCIなど)で共通で使えるということです。
Daggerでは、全てのアクションがDockerコンテナ上で実行されるため、Dockerが動作する環境であれば、共通の設定でどこでも同じようにCI/CDの処理を実行することができます。
図に表すと以下のイメージです。
Daggerを使用することで、CI/CDの処理を特定のベンダーに依存しない形で抽象化(共通化)することができるのです。
これはCI/CDの特定のベンダーへの依存度を下げることに繋がるでしょう。
Daggerのメリット【どんな場面で有効?】
Daggerの概要を掴んだところで、次にDaggerのメリットをもう少し詳しく見ていきます。
(個人的な意見も含めて)Daggerのメリットは以下の4つです。
- 異なるCI/CDベンダーへの移行が容易になる
- 特定のCI/CDベンダーへの依存度を下げることができる
- ローカル環境でのCI/CD設定の実装が楽になる
- CI/CDの記述がスッキリして見通しが良くなる
それぞれ簡単に説明していきます。
異なるCI/CDベンダーへの移行が容易になる
概要で説明したように、Daggerを使えば、共通のCI/CD設定ファイルを様々なCI/CDベンダー上で使うことができます。
そのため、CI/CDの定義ファイル(ex. CirCleCIのconfig.yml)では、共通の設定ファイルを実行する記述を書くだけでOKです。
そのベンダー独自の記法に依存した難しい処理を実装する必要はありません。
これは、別のCI/CDベンダーへ移行する際の学習コストを下げることに繋がります。
そして、学習コストを下げることは、別のベンダーに移行する際のハードルを下げることにも繋がるでしょう。
特定のCI/CDベンダーへの依存度を下げることができる
Daggerを使うことで、特定のCI/CDベンダーへの依存度を下げることができます。
そして、依存度を下げることは、CI/CDの安定度の向上に繋がります。
例えば以下の状況を考えましょう。
- 使っていたCI/CDベンダーが突然倒産した
- 使っているCI/CDベンダーで障害が発生して一切のアプリリリースができなくなった
こういった状況の場合、今までだとなすすべがありませんでした。
別のベンダーに乗り換えるにしても、多大な学習コストと労力が発生してしまうからです。
CI/CDの長期間の停止は必至です。
しかし、Daggerを使った場合は、別のベンダーでも共通の設定ファイルを使えるため、圧倒的に短いスパンで別のベンダーに切り替えることができます。
つまり、CI/CDが長期間停止してしまうリスクを下げることができるのです。
変化の速い現代において、サービスのCI/CDを止めないことは非常に重要です。
その意味でも、CI/CDの安定度を高めることができるDaggerは有用であると言えるでしょう。
ローカル環境でのCI/CD設定の実装が楽になる
CI/CDの設定ファイルを記述する場合、現状だと以下のステップを踏む必要があります。(一部ローカルでデバッグする方法もありますが、基本はこの流れです)
- CI/CDの設定を記述する
- コミットする
- プッシュする
- CI/CDの実行を待つ
- CI/CDの実行に失敗する
- CI/CDの設定を修正する
- コミットする
- 以下繰り返し…
ここでの問題点は、何と言っても「時間がかかる」ことです。
実装したら毎回コミットしてプッシュして実行が終わるのを待つ必要があります。
また、何度も試すのでコミットも汚れがちです。
一方Daggerを使う場合は、そもそもローカルでも同様に動作させることができるので、何度もプッシュする必要はありません。
これはエンジニアの開発効率と開発体験の向上に繋がることでしょう。
CI/CDの記述がスッキリして見通しが良くなる
一般的にCI/CDの設定を書く場合、一つのファイル内に全ての処理を記述するため、ファイルが巨大になりがちです。
しかし、Daggerを使った場合は特定の処理を共通の設定ファイルとしてまとめることができるため、CI/CDの記述をスッキリさせることができます。
これは設定ファイルの可読性の向上と管理しやすさの向上に繋がるでしょう。
Daggerを試してみた【ハンズオン】
次に、よりDaggerに対する理解を深めるため、実際にDaggerを触ってみます。
ざっくりと以下の順で作業を行なっていきます。
- ローカルにDaggerをインストール
- ローカルでDaggerを使って処理を実行
- GitHub ActionsでDaggerを使って処理を実行
- CircleCIでDaggerを使って処理を実行
まずはbrewでローカルにDaggerをインストールします。(Macを想定)
brew install dagger/tap/dagger
以下のコマンドでインストールしたDaggerのバージョンを確認できます。
dagger version
次に、任意のディレクトリ配下で以下のコマンドを実行してdaggerディレクトリ配下にhelloworld.cueを作成します。
mkdir dagger;cd dagger;touch helloworld.cue
※「;」でコマンドを連続で記述できます
helloworld.cueは、あらゆるCI/CDベンダーで使える共通の設定を記述するファイルです。
拡張子にもある通り、CUE言語というGoogleが開発した設定記述向けのプログラミング言語で記述します。
helloworld.cueには以下の記述を追加して下さい。
package helloworld import ( "dagger.io/dagger" "dagger.io/dagger/core" ) dagger.#Plan & { actions: { _alpine: core.#Pull & {source: "alpine:3"} hello: core.#Exec & { input: _alpine.output args: ["echo", "hello, world!"] always: true } } }
これは、こちらのDaggerのリポジトリにあるサンプルファイルです。
CUE言語の記事ではないので詳細は省きますが、実行したら hello, world! と出力するだけのシンプルな構成のファイルです。
次に、Daggerプロジェクトの作成とDaggerパッケージのインストールを行います。
以下のコマンドを実行して下さい。
dagger project init;dagger project update
ここまでできたら、daggerディレクトリ上で以下のコマンドを実行して下さい。(※ローカルでDockerは使える前提です)
これにより、DaggerでCUE言語で記述されたファイルを実行することができます。
dagger do hello --log-format plain
以下のように hello, world! と出力されたらOKです。
以上でローカルでDaggerを使って処理を実行することはできました。
次に、同じ定義ファイル(helloworld.cue)をGitHub Actionsでも実行してみましょう。
GitHubにdagger-sampleリポジトリを作成し、ローカルにcloneしてきます。
git clone git@github.com:[各自の名前]/dagger-sample.git
そして、以下のコマンドを実行して、dagger-sampleディレクトリ配下に先ほど作成したdaggerディレクトリ内のファイル(helloworld.cue)とディレクトリ(cue.mod)を移動させます。
cd dagger-sample;mv ../dagger/cue.mod .;mv ../dagger/helloworld.cue .
次に、GitHub Actions用の定義ファイルを作成します。
mkdir -p .github/workflows;touch .github/workflows/helloworld.yml
現状の構成は以下のようになっています。
そして、helloworld.ymlの中に以下の記述を追加します。
name: helloworld on: push jobs: dagger: runs-on: ubuntu-latest steps: - name: Clone repository uses: actions/checkout@v2 - name: Do helloworld uses: dagger/dagger-for-github@v3 with: version: 0.2 cmds: | do hello --log-format plain
この状態でpushをすると、以下のようにGitHub Actionsでローカルと同じように hello, world! を出力することができます。
最後に、CircleCIでも同様に hello, world! を出力させてみましょう。(GitHubとCircleCIの連携は済ませてある前提です)
dagger-sample配下に、以下のコマンドでCircleCI用の定義ファイルを追加します。
mkdir .circleci;touch .circleci/config.yml
そして、config.ymlに以下の設定を追加します。
version: 2.1 jobs: install-and-run-dagger: docker: - image: cimg/base:stable steps: - checkout - setup_remote_docker: version: "20.10.14" - run: name: "Install Dagger" command: | cd /usr/local wget -O - https://dl.dagger.io/dagger/install.sh | sudo sh cd - - run: name: "Run Dagger" command: | dagger do hello --log-format plain workflows: dagger-workflow: jobs: - install-and-run-dagger
これでcommitしてpushすると、以下のようにCircleCI上で hello, world! を出力させることができます。
ハンズオンは以上です。
一つの設定ファイル(helloworld.cue)だけで、複数の環境(ローカル・GitHub Actions・CircleCI)で同一の動作(hello, world! の出力)を実現することができました。
【CI/CD】Daggerの基礎を分かりやすく解説:おわりに
今回は、Daggerの基礎をハンズオンを含めて解説しました。
Daggerは開発者やプロジェクトに以下の恩恵をもたらします。
- 異なるCI/CDベンダーへの移行が容易になる
- 特定のCI/CDベンダーへの依存度を下げることができる
- ローカル環境でのCI/CD設定の実装が楽になる
- CI/CDの記述がスッキリして見通しが良くなる
まだ発表されてから日が浅く、人口に膾炙しているとは言い難いですが、今後普及していってDockerのように「使われて当たり前」になる可能性も秘めているツールです。
予習も兼ねて今から触ってみてもいいのではないでしょうか?
今回は以上となります。
最後まで読んでいただきありがとうございました!
2022年11月15日追記:GoとPythonに対応
以下の記事にある通り、Daggerの定義ファイルが、CUE言語だけでなく、GoとPythonでも記述できるようになりました。
今後はさらに記述できる言語を増やしていく方針らしいので、さらに扱いやすいツールとなっていくことが予想されます。
Dagger:参考資料
- Dagger(公式ドキュメント)
- Docker創始者らが開発、ビルド/テスト/デプロイの自動化をポータブルにするツール「Dagger」登場。そのままローカルでもGitHubでもCircleCIでも実行可能に
- Docker founder launches Dagger, a new DevOps platform
- 話題の CI/CD ツール Dagger を体験してみる
- DaggerでベンダーフリーなCIパイプラインを作成する
- ポータブルなCI/CD Daggerを試してみる
- CI/CDツール「Dagger」のお試し
- コンテナベースのCI/CDツール「Dagger」を試してみよう
- CI・CD界隈期待の星!!Daggerに入門してローカルとGithubActionsでCIを動かしてみた