Open4
CI/CD devkitのDaggerを試す + Jenkins上で動かしてみる

ポータブルなCI/CDパイプライン devkit
Dockerコンテナ上で実行されて、どこでも動かすことができる。
新しいCI/CDプラットフォームではなく、プラットフォーム上で実行できるレイヤーを追加するようなもの。
今まで
- CI/CDサービス固有の記法を学習する必要があり、移行したくなったときには書き換えが必要
- ローカルで試しにくく、commit & pushしては動くか確認する作業が発生
Daggerを使うと
- プラットフォーム非依存
- CUE言語を使って書ける(CUEの学習コストとYAMLのメンテどっちをとるか)
- ローカルで実行できる

インストール
Macの場合はHomebrewでインストールするのが簡単。
install.sh
を使ってインストールするときにバージョン指定できる
curl -L https://dl.dagger.io/dagger/install.sh | DAGGER_VERSION=0.2.19 sh
./bin/dagger version
dagger 0.2.19 (GIT_SHA) darwin/arm64

サンプル
公式の todoapp がサンプルとして用意されている
git clone https://github.com/dagger/todoapp
cd todoapp
dagger project update
dagger do build
dagger do <Action>
で実行できる

Jenkins上で利用する
Dockerがインストールされていればどこでも実行できるのが良いところ。
各CI/CDでは、Daggerを実行する部分だけを書けばいい。
JenkinsfileにDaggerのインストールからすべてベタ書きするとこんな感じ
pipeline {
agent any
environment {
// 環境変数にセット
NAME='John'
}
stages {
stage("setup") {
steps {
sh '''
# グローバルにインストールずみなら不要
curl -L https://dl.dagger.io/dagger/install.sh | sh
./bin/dagger project init
./bin/dagger project update
'''
}
}
stage("do") {
steps {
sh '''
cat << EOF > dagger.cue
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
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.#Plan & {
// Say hello by writing to a file
actions: hello: #AddHello & {
dir: client.filesystem.".".read.contents
name: client.env.NAME
}
client: {
filesystem: ".": {
read: contents: dagger.#FS
write: contents: actions.hello.result
}
env : {
NAME: string
}
}
}
EOF
./bin/dagger do hello
'''.stripIndent()
}
}
}
}