Open8

Dagger 入門

Shunsuke SuzukiShunsuke Suzuki

最近話題の Dagger とはなにか、ちょっとドキュメントを読んでみた。

https://twitter.com/dagger_io/status/1509198788933476356


https://dagger.io/blog/public-launch-announcement
https://dagger.io/
https://github.com/dagger/dagger

Docker の作者が開発
portable devkit for CI/CD pipelines

まだ early stages of development

DevOps エンジニアが CI/CD pipeline を素早く構築できる

  • ローカルで動かせる
    • 検証しやすい
  • ベンダーロックインにならない
  • エコシステムの提供
    • 再利用できる

解決したい課題

  • CI/CD pipeline が複雑すぎる
  • テスト・デバッグが難しい
  • 再利用性が低く、車輪の再発明をしがち

解決方法

  • 宣言的な言語・API
  • パッケージ管理システムにより Action を共有できる

2 つの技術を使っている

2 つの問題を解決する

  • dev/CI drift
    • CI とローカル用に 2 つコードを書く必要はない。 Dagger plan は CI, ローカル両方で使える
  • CI lock-in
    • Dagger はどのメジャーな CI プラットフォームでも実行できる
Shunsuke SuzukiShunsuke Suzuki

Docker に依存している。
BuildKit に依存しているし、他のコンテナランタイムだとだめなのかな?

Shunsuke SuzukiShunsuke Suzuki

アプリケーション固有のツールをホストにインストールする必要がない。
コンテナ上で実行しているから。
生成物はホストに保存される。

$ dagger do build

ローカルで実行できるので、 commit, push する必要がなく、早くループを回せる。
結果はローカルにキャッシュされるので、高速に実行できる。

Shunsuke SuzukiShunsuke Suzuki

https://docs.dagger.io/1230/better-logs/

The default mode is auto. If you want to keep each actions' logs, use the plain mode

package main

import (
	"dagger.io/dagger"
	"universe.dagger.io/alpine"
	"universe.dagger.io/bash"
)

#Run: {
	_img: alpine.#Build & {
		packages: bash: _
	}

	bash.#Run & {
		always: true
		input:  _img.output
	}
}

dagger.#Plan & {
	actions: {
		hello: #Run & {
			script: contents: "echo \"Hello!\""
		}
	}
}

普通に実行すると、コマンドのログが見れない

$ dagger do hello
[✔] actions.hello.script                                                                                                      0.0s
[✔] actions.hello

log format を指定すると見えるが、ログが見やすいかと言われると微妙。けど仕方ない気もする。

$ dagger --log-format plain do hello
5:51PM INFO  actions.hello.script._write | computing
5:51PM INFO  actions.hello._img._dag."0"._pull | computing
5:51PM INFO  actions.hello.script._write | completed    duration=0s
5:51PM INFO  actions.hello._img._dag."0"._pull | completed    duration=0s
5:51PM INFO  actions.hello._img._dag."1"._exec | computing
5:51PM INFO  actions.hello._img._dag."1"._exec | completed    duration=0s
5:51PM INFO  actions.hello._exec | computing
5:51PM INFO  actions.hello._exec | completed    duration=100ms
5:51PM INFO  actions.hello._exec | #5 0.042 Hello!