Open4

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

ikorihnikorihn

Overview | Dagger

ポータブルなCI/CDパイプライン devkit
Dockerコンテナ上で実行されて、どこでも動かすことができる。
新しいCI/CDプラットフォームではなく、プラットフォーム上で実行できるレイヤーを追加するようなもの。

今まで

  • CI/CDサービス固有の記法を学習する必要があり、移行したくなったときには書き換えが必要
  • ローカルで試しにくく、commit & pushしては動くか確認する作業が発生

Daggerを使うと

  • プラットフォーム非依存
  • CUE言語を使って書ける(CUEの学習コストとYAMLのメンテどっちをとるか)
  • ローカルで実行できる
ikorihnikorihn

インストール

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
ikorihnikorihn

サンプル

公式の todoapp がサンプルとして用意されている

git clone https://github.com/dagger/todoapp
cd todoapp
dagger project update
dagger do build

dagger do <Action> で実行できる

ikorihnikorihn

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()
      }
    }    
  }
}