Dagger という CI/CD のツールが話題になっているのをみかけました。
なんでも Docker の創始者さんが開発しているとか。
どんなものかと Getting Started をなぞってみました。今回はその記録です。
https://docs.dagger.io/getting-started/
まずは 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 init
で cue.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 のテンプレートも増えるみたいですね。楽しみです。