CI/CDパイプラインをポータブルにする「Dagger」登場/マイクロソフト、「Windows 365 Boot」発表/JavaScriptの高速フォーマッター「Rome Formatter」ほか、2022年4月の人気記事 - Publickey

久しぶりに胸熱なプロダクトの情報が舞い込んできたので、更新も絶え絶えになりつつありますが、早速使ってみました

環境

  • WSL2(Debian)
  • Docker version 20.10.14, build a224086

インストール

公式(Linux)を参考にインストール

1
2
3
4
5
6
7
8
9
// 公式どおりやると権限エラーになるのでsudoにパイプする
$ curl -L https://dl.dagger.io/dagger/install.sh | sudo sh
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 7649 100 7649 0 0 57511 0 --:--:-- --:--:-- --:--:-- 57511
sh debug downloading files into /tmp/tmp.Fyb9GLb8S6
sh debug http_download https://dagger-io.s3.amazonaws.com/dagger/releases/0.2.8/dagger_v0.2.8_linux_amd64.tar.gz
sh debug http_download https://dagger-io.s3.amazonaws.com/dagger/releases/0.2.8/checksums.txt
sh info installed ./bin/dagger
1
2
$ ./bin/dagger version
dagger 0.2.8 (92c8c7a2) linux/amd64

todoappのビルド~デプロイ

サンプルどおり、todoappのビルド~デプロイをやってみる

ビルドしてみる

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// todoappのダウンロード
$ cd /var/tmp/
$ git clone https://github.com/dagger/dagger
$ cd dagger
$ git checkout v0.2.8

// ビルド
$ cd pkg/universe.dagger.io/examples/todoapp
$ dagger do build
[✔] actions.build.run.script 0.1s
[✔] actions.deps 0.1s
[✔] client.filesystem."./".read 0.1s
[✔] actions.test.script 0.1s
[✔] actions.test 1.4s
[✔] actions.build.run 9.3s
[✔] actions.build.contents 0.0s
[✔] client.filesystem."./_build".write 0.1s

無事終わったらしい

色々見てみる

ビルドしたものは _buildディレクトリに入ってました

1
2
3
4
5
6
7
8
9
10
11
12
/dagger/pkg/universe.dagger.io/examples/todoapp $ ls -l ./_build
合計 52
-rw-r--r-- 1 user user 1047 5月 2 23:06 asset-manifest.json
-rw-r--r-- 1 user user 3150 5月 2 23:05 favicon.ico
-rw-r--r-- 1 user user 2244 5月 2 23:06 index.html
-rw-r--r-- 1 user user 5347 5月 2 23:05 logo192.png
-rw-r--r-- 1 user user 9664 5月 2 23:05 logo512.png
-rw-r--r-- 1 user user 492 5月 2 23:05 manifest.json
-rw-r--r-- 1 user user 663 5月 2 23:06 precache-manifest.991d0144d7c053587adfe0b942852a91.js
-rw-r--r-- 1 user user 67 5月 2 23:05 robots.txt
-rw-r--r-- 1 user user 1183 5月 2 23:06 service-worker.js
drwxr-xr-x 4 user user 4096 5月 2 23:06 static

この時点で、 docker psをすると、 dagger-buildkitdというコンテナが動いていました(前もって調べてなかったけど、DaggerでビルドするためにDockerは必須らしい)

1
2
3
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS NAMES
1f2553b443c5 moby/buildkit:v0.10.1 "buildkitd" 47 minutes ago Up 47 minutes dagger-buildkitd

CIの内容は todoapp.cueファイルに書かれています。CUE言語というらしいです(まだ書式よくわかってないけど、俺たちは雰囲気でcueファイルを読んでいる)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
$ cat todoapp.cue
package todoapp

import (
"dagger.io/dagger"
"dagger.io/dagger/core"
"universe.dagger.io/alpine"
"universe.dagger.io/bash"
"universe.dagger.io/docker"
"universe.dagger.io/netlify"
)

dagger.#Plan & {
_nodeModulesMount: "/src/node_modules": {
dest: "/src/node_modules"
type: "cache"
contents: core.#CacheDir & {
id: "todoapp-modules-cache"
}

}
client: {
filesystem: {
"./": read: {
contents: dagger.#FS
exclude: [
"README.md",
"_build",
"todoapp.cue",
"node_modules",
]
}
"./_build": write: contents: actions.build.contents.output
}
env: {
APP_NAME: string
NETLIFY_TEAM: string
NETLIFY_TOKEN: dagger.#Secret
}
}
actions: {
deps: docker.#Build & {
steps: [
alpine.#Build & {
packages: {
bash: {}
yarn: {}
git: {}
}
},
docker.#Copy & {
contents: client.filesystem."./".read.contents
dest: "/src"
},
bash.#Run & {
workdir: "/src"
mounts: {
"/cache/yarn": {
dest: "/cache/yarn"
type: "cache"
contents: core.#CacheDir & {
id: "todoapp-yarn-cache"
}
}
_nodeModulesMount
}
script: contents: #"""
yarn config set cache-folder /cache/yarn
yarn install
"""#
},
]
}

test: bash.#Run & {
input: deps.output
workdir: "/src"
mounts: _nodeModulesMount
script: contents: #"""
yarn run test
"""#
}

build: {
run: bash.#Run & {
input: test.output
mounts: _nodeModulesMount
workdir: "/src"
script: contents: #"""
yarn run build
"""#
}

contents: core.#Subdir & {
input: run.output.rootfs
path: "/src/build"
}
}

deploy: netlify.#Deploy & {
contents: build.contents.output
site: client.env.APP_NAME
token: client.env.NETLIFY_TOKEN
team: client.env.NETLIFY_TEAM
}
}
}

actionsの部分が、 dagger do [Action名]で実行できるActionぽいです。これは、 dagger doで空打ちすると、以下のように、 Available Actions:の部分に一覧表示されます

1
2
3
4
5
6
7
8
9
10
11
dagger/pkg/universe.dagger.io/examples/todoapp $ dagger do
Usage:
dagger do [flags]

Options

Available Actions: ←★ココ
deps
test
build
deploy

デプロイしてみる

deployアクションの部分を見てみると、Netlifyというサービスにデプロイするように、このサンプルは書かれているようです

1
2
3
4
5
6
7
// ★この部分
deploy: netlify.#Deploy & {
contents: build.contents.output
site: client.env.APP_NAME
token: client.env.NETLIFY_TOKEN
team: client.env.NETLIFY_TEAM
}

Netlifyは初見ですが、なんか便利そうだしFreeプランもあるようでしたので、登録してTokenをゲットしてきました。

1
2
3
4
// 環境変数に設定
export APP_NAME=[Netlifyのアプリケーション名]
export NETLIFY_TOKEN=[NetlifyのToken]
export NETLIFY_TEAM=[NetlifyのTeam名]
  • Tokenはこのページで作れるようです
  • APP_NAMEは、他と重複しないように設定しないとデプロイに失敗するようです。無骨なエラーメッセージしか出なかったので5分ぐらい右往左往しました

では、デプロイしてみます

1
2
3
4
5
6
7
8
9
10
11
12
13
$ dagger do deploy

[✔] actions.deploy.container.script 0.1s
[✔] actions.deps 0.0s
[✔] actions.deploy.container.script 0.1s
[✔] actions.deps 0.0s
[✔] actions.deploy.container.script 0.1s
[✔] actions.deps 0.0s
[✔] actions.deploy.container.script 0.1s
[✔] actions.deps 0.0s
[✔] actions.deploy.container.script 0.1s
[✔] actions.deps 0.0s
(以下略)

なんかこんな感じのがたくさん出て、作業が完了してもSuccessみたいなのは表示されません
NetlifyのDashboardを見るとサイトが出来ています

001

以上で、デプロイできました → こんな感じ