ポータブルなCI/CD Daggerを試してみる
基本的に継続的な開発を行っていく上で、CI/CDは避けて通れなくなっています。CI/CDといえば、これまでも様々なツールやサービスがありました。
クラウドの発展やインフラ環境の変化などもあり、個々の特性を生かした機能やサポートなどを持つツールやサービスが生まれてきています。
OSSで基本的に自身で環境を構築する汎用ツール:Jenkinsなど CI/CD専用のSaaS:Circle CI、Travis CI、AWS Codeシリーズ、Google Cloud DevOps、GitHub Actionsなど クラウドやKubernetes環境向けのCD:Spinnakerなど アプリケーション実行環境とCDがセットになったPaaS:GAE、AWS Beanstalkなど
一方、この各ツールやサービス間で移行することになると、複雑になりがちな設定の書き換えや、特定ツールのサポートやプラグインに乗っかった部分を置き換えるなど、それなりに労力をかける必要があり、どうしても一度使い始めると乗り換えが難しくなりがちです。また、ローカル環境で実行してみることが難しいことも多く、実際の環境でしかテストできないといった欠点もあります。
そこで、Dockerを利用したポータブルなCI/CDの抽象レイヤーとして、Dockerの開発者が新たにDaggerというプロダクトを作成したとのことです。
Daggerとは
Daggerのページには以下のように書かれています。
A PORTABLE DEVKIT FOR CI/CD PIPELINES. Build powerful CI/CD pipelines quickly, then run them anywhere.
・Give your developers parity between dev and CI environments ・Test and debug your pipelines locally ・Run the same pipeline on any CI environment without re-writes ・Developed in the open by the creators of Docker
CI/CDパイプラインのためのポータブル開発キット
強力なCI/CDパイプラインをすばやく構築し、どこでも実行できます
・開発者に開発環境とCI環境の間の同等性を提供する ・パイプラインをローカルでテスト、デバッグできる ・再書き変えせずに、任意のCI環境で同じパイプラインを実行できる ・Dockerの作成者によってオープンに開発されました
つまるところ、CI/CDに抽象レイヤーとしてDaggerを追加することで、CIでしか実行できないといったことを避けて開発を容易にし、CI/CDにおけるベンダロックインも避けられるということを目的にしています。
Daggerに入門してみる
まずは特徴を抑えつつ、Daggerのインストールをして、非常に簡単な設定を書いてみることにします。
CUEを利用している
まず、Daggerにおいて特徴的なのは、CIのConfigurationをCUEで記載する点です。
CUEは基本的にはYAMLやJSONといったものに近いと思ってよいものの、設定ファイルを記述することを念頭にされています。そのため、重複を避けられるような記載方法や、スキーマ定義、バリデーションなどもそれ自体に仕組みとして組み込まれています。
一方でやはりそうした機能性などから、覚えることはYAMLやJSONに他に比べるとそこそこ多い印象です。
例)Daggerのドキュメントより引用 https://docs.dagger.io/1221/action
package main import ( "dagger.io/dagger" "dagger.io/dagger/core" ) // Write a greeting to a file, and add it to a directory #AddHello: { // The input directory dir: dagger.#FS // The name of the person to greet name: string | *"world" write: core.#WriteFile & { input: dir path: "hello-\(name).txt" contents: "hello, \(name)!" } // The directory with greeting message added result: write.output }
daggerコマンド
Daggerを実行するにはDocker実行環境と、daggerコマンドが必要になります。逆にこの2つさえあれば、基本的にはローカルだろうと実行が可能です。
Dockerは一般的なDocker Desktop公式やその他多くの記事に任せることにして、daggerコマンドのインストールを説明します。といっても、公式にMac、Linux、Windowsそれぞれについて記載があるため、そこを参考に行うだけです。
インストールできれば、daggerをコマンドとして実行できます。
# Intel Macでの実行例 $ dagger version dagger 0.2.9 (4fc38dac) darwin/amd64
Hello Worldを書いてみる
最後に非常に簡単な設定ファイルを書いて、実行してみます。
基本的には用意されたパッケージを利用して、ファイルやGitリポジトリの操作、Dockerイメージの取得などを行います。coreのみであればAPIリファレンスのドキュメントがありますが、それ以外はまだドキュメントがないようなので、最終的にはリポジトリを直接確認するなどが必要なようです。
// helloworld.cue package helloworld import ( "dagger.io/dagger" "dagger.io/dagger/core" ) dagger.#Plan & { // クライアントの情報を保持する client: { env: { NAME: string } } // 各種アクションを定義 actions: { _alpine: core.#Pull & {source: "alpine:3"} hello: core.#Exec & { input: _alpine.output args: ["echo", "Hello, \( client.env.NAME )!"] always: true } } }
上記の設定ファイルを用意した状態で、そのディレクトリで以下を実行します。
$ NAME=naokirin dagger do hello --log-format=plain 00:00AM INF actions._alpine | computing 00:00AM INF client.env | computing 00:00AM INF client.env | completed duration=0s 00:00AM INF actions._alpine | completed duration=1.4s 00:00AM INF actions.hello | computing 00:00AM INF actions.hello | #3 0.074 Hello, naokirin! 00:00AM INF actions.hello | completed duration=100ms
dagger do <アクション名>
で actions
に定義したアクションを実行できます。
まとめ
非常に簡単なところまでしか実行してみていませんが、実戦投入としてはまだWeb上の情報も少なく、厳しいかなという印象はあります。また、input
や output
の部分が個々に型が決まっており、パイプラインを組む際に前後のアクションでその部分にズレがある場合にうまく自力で解決する必要があるなど、実践における難易度はやや高い印象です。
一方でこれまであまりなかった、CI/CDの抽象レイヤーの追加というアプローチは非常に面白いものだと思います。
今後、Web上の情報や、より各フレームワークなどに特化したテンプレができてくるとCI環境に依存せずに設定等を共有できるため、広まっていく可能性も感じます。
まだまだ出てきたばかりのプロダクトなので、注視しつつも、もう少し環境の成熟は必要そうかな、という感じでしょうか。