Dagger の Get started やってみた

全般

Dagger という CI/CD のツールが話題になっているのをみかけました。
なんでも Docker の創始者さんが開発しているとか。
どんなものかと Getting Started をなぞってみました。今回はその記録です。

Getting Started | Dagger

まずは CI/CD in your local dev のページから実行します。
業務では windows の利用が多いのですが、私物では MacBook Pro を使っているので macOS の手順に従い実行します。

まずは brew でインストール

# brew でのインストールが久しぶりだったので update から始めています
$ brew update -v

# dagger をインストールします
$ brew install dagger/tap/dagger

# バージョンの確認
$ dagger version                                                                                                                                                           [22-04-23_16:48]
dagger 0.2.7 (18c19174) darwin/amd64

無事に完了。
次にサンプルのソースを取得してビルドします。

# プロジェクトを clone してディレクトリに移動するお決まりの操作
$ git clone https://github.com/dagger/dagger
$ cd dagger

# オプションなしのコピペでは失敗したのでとりあえず新しいブランチに切り替えておく
$ git checkout -b v0.2.7

# サンプルのディレクトリに移動して内容の確認
$ cd pkg/universe.dagger.io/examples/todoapp
$ ls
README.md    package.json    public      src     todoapp.cue yarn.lock

# ビルドの実行
$ dagger do build
[✔] actions.build.run.script              0.1s
[✔] actions.deps                          0.1s
[✔] client.filesystem."./".read           0.2s
[✔] actions.test.script                   0.1s
[✔] actions.test                          1.3s
[✔] actions.build.run                    13.3s
[✔] actions.build.contents                0.0s
[✔] client.filesystem."./_build".write    0.1s

$ ls
README.md    _build      package.json    public      src     todoapp.cue yarn.lock

ビルドが完了したようです。 _build というディレクトリが作成されていますね。
そのしたに index.html が作られているようなので確認しましょう。

# ビルド結果の確認
$ open _build/index.html

タスク管理アプリの画面がでているかと思います。これがサンプルアプリの内容のようですね。
macOS 上で実行しているにもかかわらずいろいろな依存関係のインストールが不要であるのが Daggar の素敵ポイントの一つのようです。

少し内容を変更して再ビルドします

# ファイル内容の変更
$ vi src/components/Form.js 

       <h2 className="label-wrapper">
         <label htmlFor="new-todo-input" className="label__lg">
-          What needs to be done?
+          What must be done today?
         </label>
       </h2>

# 再ビルド
$ dagger do build
[✔] actions.build.run.script             0.0s
[✔] actions.deps                         0.0s
[✔] client.filesystem."./".read          0.0s
[✔] actions.test.script                  0.0s
[✔] actions.test                         1.4s
[✔] actions.build.run                    6.8s
[✔] actions.build.contents               0.0s
[✔] client.filesystem."./_build".write   0.1s

# 画面の確認
$ open _build/index.html

トップのメッセージが変更したものに変わっていますね。
Dagger を使うとビルドとテストが細やかに行えるってことでしょうかね。

ここまでがローカル環境での利用手順になります。
次に他の CI/CD のサービスから利用する方法です。
私は GitLab が好きなので GitLab で試してみます。

taskapp のディレクトリを切り出して GitLab に push してみます。
CI/CD の設定ファイルである .gitlab-ci.yml を追加します。

以下のようなディレクトリ構成です。

.
├── .git
├── .gitignore
├── .gitlab-ci.yml < 追加
├── README.md
├── package.json
├── public
├── src
├── todoapp.cue
└── yarn.lock
.docker:
  image: docker:${DOCKER_VERSION}-git
  services:
    - docker:${DOCKER_VERSION}-dind
  variables:
    # See https://docs.gitlab.com/ee/ci/docker/using_docker_build.html#docker-in-docker-with-tls-enabled-in-the-docker-executor
    DOCKER_HOST: tcp://docker:2376

    DOCKER_TLS_VERIFY: '1'
    DOCKER_TLS_CERTDIR: '/certs'
    DOCKER_CERT_PATH: '/certs/client'

    # Faster than the default, apparently
    DOCKER_DRIVER: overlay2

    DOCKER_VERSION: '20.10'

.dagger:
  extends: [.docker]
  variables:
    DAGGER_VERSION: 0.2.7
    DAGGER_LOG_FORMAT: plain
    DAGGER_CACHE_PATH: .dagger-cache

    ARGS: ''
  cache:
    key: dagger-${CI_JOB_NAME}
    paths:
      - ${DAGGER_CACHE_PATH}
  before_script:
    - apk add --no-cache curl
    - |
      # install dagger
      cd /usr/local
      curl -L https://dl.dagger.io/dagger/install.sh | sh
      cd -

      dagger version
  script:
    - dagger project update
    - |
      dagger \
          do \
          --cache-from type=local,src=${DAGGER_CACHE_PATH} \
          --cache-to type=local,mode=max,dest=${DAGGER_CACHE_PATH} \
          ${ARGS}

build:
  extends: [.dagger]
  variables:
    ARGS: build

パイプラインの実行でエラーが出てしまいました。

$ dagger project update
3:53PM FTL system | dagger project not found. Run `dagger project init`
Cleaning up project directory and file based variables
00:01
ERROR: Job failed: exit code 1

ビルドが通るように修正しましょう。
プロジェクトを切り出してしまったせいでモジュールの定義が足りなくなってしまったようです。
.gitlab-ci.yml にコマンドを追加しました。

       dagger version
   script:
+    - dagger project init
     - dagger project update

dagger project initcue.mod が作られてこれを基に dagger project update が実行されるようです。
再実行すると再びエラーが発生。

$ dagger \ # collapsed multi-line command
time="2022-04-23T16:38:26Z" level=warning msg="commandConn.CloseRead: commandconn: failed to wait: signal: terminated"
time="2022-04-23T16:38:26Z" level=warning msg="local cache import at .dagger-cache not found due to err: could not read .dagger-cache/index.json: open .dagger-cache/index.json: no such file or directory"
time="2022-04-23T16:38:26Z" level=warning msg="local cache import at .dagger-cache not found due to err: could not read .dagger-cache/index.json: open .dagger-cache/index.json: no such file or directory"
server.go:647: http2: server connection error from localhost: connection error: PROTOCOL_ERROR
4:38PM FTL system | failed to execute plan: specifying multiple cache exports is not supported currently
Cleaning up project directory and file based variables
00:01
ERROR: Job failed: exit code 1

dagger の実行でエラーが発生しているようです。
やや乱暴ですがオプションを削除してみました。

     - |
       dagger \
           do \
-          --cache-from type=local,src=${DAGGER_CACHE_PATH} \
-          --cache-to type=local,mode=max,dest=${DAGGER_CACHE_PATH} \
           ${ARGS}

いったんこれでローカル同様 dagger do build が通るようになりました。
デプロイのプロセスに一つレイヤーが追加されるような感じですね。
まだまだ全然実行の詳細が理解できてませんが、実行の内部詳細を確認していきたいと思います。

今回は GitLab で試してみましたが、これからいろいろ Getting Started のテンプレートも増えるみたいですね。楽しみです。

コメント