CI/CDのDaggerで、GithubActionsとCircleCIにシュッと連携してみた
前々から気になっていた、CI/CD の非ベンダーロックインな Dagger というツールを試してみました。本記事では、試した内容について共有しようと思います。
CI/CD のパイプラインを書く
Dagger では、CUE という言語を使って CI/CD のパイプラインを書きます。
公式サイトのチュートリアルから、そのまま使ってみます。
コードは、次のようなものになります。
package todoapp
import (
"dagger.io/dagger"
"dagger.io/dagger/core"
"universe.dagger.io/netlify"
"universe.dagger.io/yarn"
)
dagger.#Plan & {
actions: {
source: core.#Source & {
path: "."
exclude: [
"node_modules",
"build",
"*.cue",
"*.md",
".git",
]
}
build: yarn.#Script & {
name: "build"
source: actions.source.output
}
test: yarn.#Script & {
name: "test"
source: actions.source.output
container: env: CI: "true"
}
deploy: netlify.#Deploy & {
contents: actions.build.output
site: string | *"dagger-todoapp"
}
}
}
見慣れない構文かもしれませんが、何をやっているかはなんとなく分かるんじゃないかなと思います。
actions は、実行するものを定義していて、dagger do <action名>
のようにして使います。
上の定義にあるsource: core.#Source
は、 source
がアクション名で、core
が実行するパッケージになります。
パッケージは、次の 2 つに分類されます。
-
dagger.io
- 標準機能
- core
- 標準機能
-
universe.dagger.io
- 非標準機能
- yarn, netlify, aws, bash, etc
- 非標準機能
ローカル環境で Dagger を動かす
実際にローカルで動かしてみます。
$ dagger do test
[✔] actions.test.container 11.6s
[✔] actions.test.install.container.script 0.1s
[✔] actions.source 0.5s
[✔] actions.test.install.container 2.3s
[✔] actions.test.container.script 0.1s
[✔] actions.test.install.container.export 0.0s
[✔] actions.test.container.export 0.2s
Field Value
logs """\n yarn run v1.22.17\n $ react-scripts test\n Done in 6.78s.\n\n """
特に問題なく、PASS しています。--log-format plain
をつけると、実行の詳細な情報が出力されます。
$ dagger do test --log-format plain
8:06PM INFO actions.test.install.container.script._write | computing
8:06PM INFO actions.test.container._image._dag."0"._pull | computing
8:06PM INFO actions.test.install.container._image._dag."0"._pull | computing
8:06PM INFO actions.test.container.script._write | computing
8:06PM INFO actions.source | computing
...
ちなみに、actions.source
が実行されているのは、actions.test
がactions.source
に依存しているためと思います。
$ NETLIFY_TOKEN=**** USER=**** dagger do deploy
[✔] actions.deploy.container.script 0.2s
[✔] actions.build.install.container 3.8s
[✔] client.env 0.0s
[✔] actions.source 0.4s
[✔] actions.build.install.container.script 0.2s
[✔] actions.build.container 21.0s
[✔] actions.build.container.script 0.2s
[✔] actions.deploy 4.8s
[✔] actions.build.install.container.export 0.1s
[✔] actions.build.container.export 0.1s
[✔] actions.deploy.container 91.0s
[✔] client.filesystem."./build".write 0.3s
[✔] actions.deploy.container.export 0.0s
Field Value
site "****-dagger-todoapp"
url "https://******-dagger-todoapp.netlify.app"
deployUrl "https://xxxx--******-dagger-todoapp.netlify.app"
logsUrl "https://app.netlify.com/sites/******-dagger-todoapp/deploys/xxxx"
ローカル環境で、CI/CD のパイプラインコードを動かくことができました。
次は、CI と連携したいと思います。
CircleCI で Dagger を動かす
まずは、CircleCI で Dagger を動かしてみます。
CircleCI の yml ファイルは、次の定義になります。
# .circleci/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: "Update project"
command: |
dagger project init
dagger project update
- run:
name: "Testing"
command: |
dagger do test --log-format plain
- run:
name: "Deploy to Netlify"
command: |
dagger do deploy --log-format plain
workflows:
dagger-workflow:
jobs:
- install-and-run-dagger
CircleCI の環境変数に、NETLIFY_TOKEN
とUSER
を設定しておきます。
この定義ファイルは、Dagger をインストールして、先程ローカル環境で動かしていた dagger do test
や dagger do deploy
を実行しているだけです。
この定義は、CircleCI 上で PASS します。めちゃくちゃ簡単ですね。
GithubActions で Dagger を動かす
次は、GithubActions で Dagger を動かしてみます。
GithubActions の yml ファイルは、次の定義になります。
# .github/workflows/todoapp.yml
name: todoapp
on:
push:
branches:
- main
jobs:
dagger:
runs-on: ubuntu-latest
steps:
- name: Clone repository
uses: actions/checkout@v2
- name: Update project
uses: dagger/dagger-for-github@v3
with:
version: 0.2
cmds: |
project init
project update
- name: Testing
uses: dagger/dagger-for-github@v3
with:
version: 0.2
cmds: |
do test
- name: Deploy to Netlify
uses: dagger/dagger-for-github@v3
with:
version: 0.2
cmds: |
do deploy
env:
USER: ${{ secrets.USER }}
NETLIFY_TOKEN: ${{ secrets.NETLIFY_TOKEN }}
ここの定義も、CircleCI の定義とほとんど一緒だと思います。
ただ、少し違うのは、GithubActions では、uses: dagger/dagger-for-github@v3
が使えるため、
cmds
が、do test
や do deploy
のように、dagger
を書かなくて済むようになります。
GithubActions の環境変数に、NETLIFY_TOKEN
とUSER
を設定しておきます。
そうすれば、このパイプラインも成功します。
終わりに
ローカル環境で、CI/CD のパイプラインをテストできて、それをシュッと CI サービスに連携できました。
今回は、チュートリアルのものをそのまま使っているので、テストやデプロイがシンプルな構成になっていましたが、
実務になると、より複雑な構成になると思うので、手元で確認できるのは良いものと思いました。
ただし、CUE
への学習コストがかかるため、導入する際は、そのあたりも含めて検討しましょう。
Discussion