仕事で Digdag を導入することになったので少しずつ情報をまとめていきます。最初は HelloWorld 的にワークフローエンジン Digdag の始め方について。
Digdag – Open Source Workflow Engine for the Multi-Cloud Era
Digdag のインストール
インストールはバイナリをダウンロードして実行権限を付けるだけです。
$ curl -o ~/bin/digdag --create-dirs -L "https://dl.digdag.io/digdag-latest" $ chmod +x ~/bin/digdag $ echo 'export PATH="$HOME/bin:$PATH"' >> ~/.bashrc
Digdag を実行するには Java8 (8u72) 以上が必要になります。
$ java -version java version "1.8.0_102" Java(TM) SE Runtime Environment (build 1.8.0_102-b14) Java HotSpot(TM) 64-Bit Server VM (build 25.102-b14, mixed mode)
MacでHomebrewを使用して複数バージョンのJava (JDK) をインストールして切り替える方法+アップデート - TASK NOTES
コマンドが実行できたら準備完了です。
$ ./bin/digdag --version 0.9.35
Digdag のアップデート
selfupdate
コマンドでバイナリをアップデートすることができます。
$ ~/bin/digdag selfupdate <version|latest>
ワークフローの実行
init
コマンドでサンプルワークフローを作成しましょう。
$ ~/bin/digdag init mydag 2019-04-06 23:39:28 +0900: Digdag v0.9.35 Creating mydag/mydag.dig Creating mydag/.gitignore Done. Type `cd mydag` and then `digdag run mydag.dig` to run the workflow. Enjoy!
run
コマンドでワークフローを実行できます。
$ cd mydag/ $ ~/bin/digdag run mydag.dig 2019-04-06 23:39:44 +0900: Digdag v0.9.35 2019-04-06 23:39:45 +0900 [WARN] (main): Using a new session time 2019-04-06T00:00:00+00:00. 2019-04-06 23:39:45 +0900 [INFO] (main): Using session /Users/tasukujp/Documents/digdag/mydag/.digdag/status/20190406T000000+0000. 2019-04-06 23:39:45 +0900 [INFO] (main): Starting a new session project id=1 workflow name=mydag session_time=2019-04-06T00:00:00+00:00 2019-04-06 23:39:47 +0900 [INFO] (0017@[0:default]+mydag+setup): echo>: start 2019-04-06T00:00:00+00:00 start 2019-04-06T00:00:00+00:00 2019-04-06 23:39:47 +0900 [INFO] (0017@[0:default]+mydag+disp_current_date): echo>: 2019-04-06 00:00:00 +00:00 2019-04-06 00:00:00 +00:00 2019-04-06 23:39:48 +0900 [INFO] (0017@[0:default]+mydag+repeat): for_each>: {order=[first, second, third], animal=[dog, cat]} 2019-04-06 23:39:48 +0900 [INFO] (0018@[0:default]+mydag+repeat^sub+for-0=order=0=first&1=animal=1=cat): echo>: first cat first cat 2019-04-06 23:39:48 +0900 [INFO] (0020@[0:default]+mydag+repeat^sub+for-0=order=1=second&1=animal=1=cat): echo>: second cat second cat 2019-04-06 23:39:48 +0900 [INFO] (0017@[0:default]+mydag+repeat^sub+for-0=order=0=first&1=animal=0=dog): echo>: first dog first dog 2019-04-06 23:39:48 +0900 [INFO] (0019@[0:default]+mydag+repeat^sub+for-0=order=1=second&1=animal=0=dog): echo>: second dog second dog 2019-04-06 23:39:48 +0900 [INFO] (0022@[0:default]+mydag+repeat^sub+for-0=order=2=third&1=animal=1=cat): echo>: third cat third cat 2019-04-06 23:39:49 +0900 [INFO] (0021@[0:default]+mydag+repeat^sub+for-0=order=2=third&1=animal=0=dog): echo>: third dog third dog 2019-04-06 23:39:49 +0900 [INFO] (0021@[0:default]+mydag+teardown): echo>: finish 2019-04-06T00:00:00+00:00 finish 2019-04-06T00:00:00+00:00 Success. Task state is saved at /Users/tasukujp/Documents/digdag/mydag/.digdag/status/20190406T000000+0000 directory. * Use --session <daily | hourly | "yyyy-MM-dd[ HH:mm:ss]"> to not reuse the last session time. * Use --rerun, --start +NAME, or --goal +NAME argument to rerun skipped tasks.
実行した mydig.dig
ファイルは以下のようになっています。 YAML
で書かれているのでシンプルで分かりやすいですね。拡張子が .yml
じゃないのは map のキーの順番が維持される必要があるためだそうです。
timezone: UTC +setup: echo>: start ${session_time} +disp_current_date: echo>: ${moment(session_time).utc().format('YYYY-MM-DD HH:mm:ss Z')} +repeat: for_each>: order: [first, second, third] animal: [dog, cat] _do: echo>: ${order} ${animal} _parallel: true +teardown: echo>: finish ${session_time}
依存関係のあるタスクを順番に実行することができるので cron でジョブの終了時間を考慮する必要がなくなりますね。今回はこんな所でそれでは次回。