What is it, naokirin?

ポータブルな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.io

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で記載する点です。

cuelang.org

CUEは基本的にはYAMLJSONといったものに近いと思ってよいものの、設定ファイルを記述することを念頭にされています。そのため、重複を避けられるような記載方法や、スキーマ定義、バリデーションなどもそれ自体に仕組みとして組み込まれています。

一方でやはりそうした機能性などから、覚えることはYAMLJSONに他に比べるとそこそこ多い印象です。

例)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コマンドのインストールを説明します。といっても、公式にMacLinuxWindowsそれぞれについて記載があるため、そこを参考に行うだけです。

docs.dagger.io

インストールできれば、daggerをコマンドとして実行できます。

# Intel Macでの実行例
$ dagger version
dagger 0.2.9 (4fc38dac) darwin/amd64

Hello Worldを書いてみる

最後に非常に簡単な設定ファイルを書いて、実行してみます。

基本的には用意されたパッケージを利用して、ファイルやGitリポジトリの操作、Dockerイメージの取得などを行います。coreのみであればAPIリファレンスのドキュメントがありますが、それ以外はまだドキュメントがないようなので、最終的にはリポジトリを直接確認するなどが必要なようです。

docs.dagger.io

github.com

// 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上の情報も少なく、厳しいかなという印象はあります。また、inputoutput の部分が個々に型が決まっており、パイプラインを組む際に前後のアクションでその部分にズレがある場合にうまく自力で解決する必要があるなど、実践における難易度はやや高い印象です。

一方でこれまであまりなかった、CI/CDの抽象レイヤーの追加というアプローチは非常に面白いものだと思います。

今後、Web上の情報や、より各フレームワークなどに特化したテンプレができてくるとCI環境に依存せずに設定等を共有できるため、広まっていく可能性も感じます。

まだまだ出てきたばかりのプロダクトなので、注視しつつも、もう少し環境の成熟は必要そうかな、という感じでしょうか。