Dagger

【CI/CD】Daggerの基礎を分かりやすく解説【ハンズオンあり】

【CI/CD】Daggerの基礎を分かりやすく解説【ハンズオンあり】

この記事では、DaggerというCI/CDツールの基礎を解説していきます。

ハンズオンも交えつつ解説するので、少しでも参考になれば幸いです。

Daggerとは何か?【概要】

Daggerとは、Docker創始者らが開発したソフトウェアのビルド・テスト・デプロイの自動化(CI/CD)をポータブルにするツールです。

「ポータブル」とは、要は様々なCI/CD用のプラットフォーム(GitHub ActionsやCircleCIなど)で共通で使えるということです。

 

Daggerでは、全てのアクションがDockerコンテナ上で実行されるため、Dockerが動作する環境であれば、共通の設定でどこでも同じようにCI/CDの処理を実行することができます。

図に表すと以下のイメージです。

Daggerの概念図

 

Daggerを使用することで、CI/CDの処理を特定のベンダーに依存しない形で抽象化(共通化)することができるのです。

これはCI/CDの特定のベンダーへの依存度を下げることに繋がるでしょう。

 

Dockerコンテナがローカル・ステージング・本番のそれぞれの環境に対するアプリのポータビリティ性を向上させたように、Daggerは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の設定ファイルを記述する場合、現状だと以下のステップを踏む必要があります。(一部ローカルでデバッグする方法もありますが、基本はこの流れです)

  1. CI/CDの設定を記述する
  2. コミットする
  3. プッシュする
  4. CI/CDの実行を待つ
  5. CI/CDの実行に失敗する
  6. CI/CDの設定を修正する
  7. コミットする
  8. 以下繰り返し…

 

ここでの問題点は、何と言っても時間がかかることです。

実装したら毎回コミットしてプッシュして実行が終わるのを待つ必要があります。

また、何度も試すのでコミットも汚れがちです。

 

一方Daggerを使う場合は、そもそもローカルでも同様に動作させることができるので、何度もプッシュする必要はありません。

 

これはエンジニアの開発効率と開発体験の向上に繋がることでしょう。

 

CI/CDの記述がスッキリして見通しが良くなる

一般的にCI/CDの設定を書く場合、一つのファイル内に全ての処理を記述するため、ファイルが巨大になりがちです。

 

しかし、Daggerを使った場合は特定の処理を共通の設定ファイルとしてまとめることができるため、CI/CDの記述をスッキリさせることができます。

 

これは設定ファイルの可読性の向上と管理しやすさの向上に繋がるでしょう。

 

Daggerを試してみた【ハンズオン】

次に、よりDaggerに対する理解を深めるため、実際にDaggerを触ってみます。

ざっくりと以下の順で作業を行なっていきます。

  1. ローカルにDaggerをインストール
  2. ローカルでDaggerを使って処理を実行
  3. GitHub ActionsでDaggerを使って処理を実行
  4. CircleCIでDaggerを使って処理を実行

 

まずはbrewでローカルにDaggerをインストールします。(Macを想定)

brew install dagger/tap/dagger

 

Windows等他の環境でのインストール方法はこちらを参考にしてください

 

以下のコマンドでインストールした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! と出力するだけのシンプルな構成のファイルです。

CUE言語の勉強をするなら、こちらのCuetorialsという教材が良さそうです!

 

次に、Daggerプロジェクトの作成とDaggerパッケージのインストールを行います。

以下のコマンドを実行して下さい。

dagger project init;dagger project update

 

ここまでできたら、daggerディレクトリ上で以下のコマンドを実行して下さい。(※ローカルでDockerは使える前提です)

これにより、DaggerでCUE言語で記述されたファイルを実行することができます。

dagger do hello --log-format plain

 

以下のように hello, world! と出力されたらOKです。

ローカルのDaggerでhello, world!を出力

 

以上でローカルで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

 

現状の構成は以下のようになっています。

Daggerのディレクトリ構成

 

そして、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! を出力することができます。

GitHub ActionsでDaggerを使って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! を出力させることができます。

CircleCIでDaggerを使ってhello, world!を出力

 

ハンズオンは以上です。

一つの設定ファイル(helloworld.cue)だけで、複数の環境(ローカル・GitHub Actions・CircleCI)で同一の動作(hello, world! の出力)を実現することができました。

 

本格的なプロジェクトの場合は、設定ファイル(今回の例だとhelloworld.cue)に自動テストや自動デプロイの設定を記述します

 

【CI/CD】Daggerの基礎を分かりやすく解説:おわりに

今回は、Daggerの基礎をハンズオンを含めて解説しました。

Daggerは開発者やプロジェクトに以下の恩恵をもたらします。

  • 異なるCI/CDベンダーへの移行が容易になる
  • 特定のCI/CDベンダーへの依存度を下げることができる
  • ローカル環境でのCI/CD設定の実装が楽になる
  • CI/CDの記述がスッキリして見通しが良くなる

 

まだ発表されてから日が浅く、人口に膾炙しているとは言い難いですが、今後普及していってDockerのように使われて当たり前になる可能性も秘めているツールです。

予習も兼ねて今から触ってみてもいいのではないでしょうか?

 

今回は以上となります。

最後まで読んでいただきありがとうございました!

 

2022年11月15日追記:GoとPythonに対応

以下の記事にある通り、Daggerの定義ファイルが、CUE言語だけでなく、GoとPythonでも記述できるようになりました。

 

今後はさらに記述できる言語を増やしていく方針らしいので、さらに扱いやすいツールとなっていくことが予想されます。

 

Dagger:参考資料

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA