digdagに入門してみる(Pythonスクリプト実行、サーバーモードGUI実行)
前々から気になっていたdigdagに入門してみた
digdagはワークフローエンジンで、何となくcronより高級で、Jenkinsよりコード管理が容易というざっくりした理解
Zozo や、GMOなどイケてる企業で使われている(検討された?)ようなので、実際に触ってみた
digdagインストール
digdagインストールの公式手順に沿ってインストールする
参考:Getting started
前提としてJavaのインストールが必要なので、入れておく
digdag自体は、Macのパッケージ管理ツールであるHomebrewでインストール可能だったので、Homebrewでdigdagを入れた(楽ちん)
参考:Using packages?
% brew install digdag
「digdag version」コマンドでバージョン情報が出れば無事にインストールされている
% digdag version 2022-08-05 23:42:59 +0900: Digdag v0.10.4 Client version: 0.10.4 Server version: 0.10.4
サンプルフローを動かす
何からやっていいのか分からないので、以下を参考に、とりあえずサンプルフローを動かしてみる
参考:3. Running sample workflow
「digdag init」コマンドを叩くとディレクトリができるので、作成して移動する
% digdag init mydag 2022-07-29 15:57:43 +0900: Digdag v0.10.4 Creating mydag/mydag.dig Creating mydag/.gitignore Done. Type `cd mydag` and then `digdag run mydag.dig` to run the workflow. Enjoy!
% cd mydag
ディレクトリの中には、「mydag.dig」というサンプルワークフローができている
% cat mydag.dig 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}
「digdag run」コマンドで動かしてみると、ログが出てきて、何やら動いている様子が確認できる
% digdag run mydag.dig 2022-07-29 15:58:31 +0900: Digdag v0.10.4 WARNING: An illegal reflective access operation has occurred WARNING: Illegal reflective access by org.skife.jdbi.cglib.core.ReflectUtils$1 (file:/usr/local/Cellar/digdag/0.10.4_1/libexec/digdag-0.10.4.jar) to method java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain) WARNING: Please consider reporting this to the maintainers of org.skife.jdbi.cglib.core.ReflectUtils$1 WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations WARNING: All illegal access operations will be denied in a future release 2022-07-29 15:58:33 +0900 [WARN] (main): Using a new session time 2022-07-29T00:00:00+00:00. 2022-07-29 15:58:33 +0900 [INFO] (main): Using session $HOME/digdag_work/mydag/.digdag/status/20220729T000000+0000. 2022-07-29 15:58:33 +0900 [INFO] (main): Starting a new session project id=1 workflow name=mydag session_time=2022-07-29T00:00:00+00:00 2022-07-29 15:58:34 +0900 [INFO] (0020@[0:default]+mydag+setup): echo>: start 2022-07-29T00:00:00+00:00 start 2022-07-29T00:00:00+00:00 2022-07-29 15:58:35 +0900 [INFO] (0020@[0:default]+mydag+disp_current_date): echo>: 2022-07-29 00:00:00 +00:00 2022-07-29 00:00:00 +00:00 2022-07-29 15:58:35 +0900 [INFO] (0020@[0:default]+mydag+repeat): for_each>: {order=[first, second, third], animal=[dog, cat]} 2022-07-29 15:58:35 +0900 [INFO] (0021@[0:default]+mydag+repeat^sub+for-0=order=0=first&1=animal=1=cat): echo>: first cat first cat 2022-07-29 15:58:35 +0900 [INFO] (0022@[0:default]+mydag+repeat^sub+for-0=order=1=second&1=animal=0=dog): echo>: second dog second dog 2022-07-29 15:58:35 +0900 [INFO] (0020@[0:default]+mydag+repeat^sub+for-0=order=0=first&1=animal=0=dog): echo>: first dog first dog 2022-07-29 15:58:35 +0900 [INFO] (0024@[0:default]+mydag+repeat^sub+for-0=order=2=third&1=animal=0=dog): echo>: third dog third dog 2022-07-29 15:58:35 +0900 [INFO] (0025@[0:default]+mydag+repeat^sub+for-0=order=2=third&1=animal=1=cat): echo>: third cat third cat 2022-07-29 15:58:35 +0900 [INFO] (0023@[0:default]+mydag+repeat^sub+for-0=order=1=second&1=animal=1=cat): echo>: second cat second cat 2022-07-29 15:58:35 +0900 [INFO] (0023@[0:default]+mydag+teardown): echo>: finish 2022-07-29T00:00:00+00:00 finish 2022-07-29T00:00:00+00:00 Success. Task state is saved at $HOME/digdag_work/mydag/.digdag/status/20220729T000000+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.
再度動かすと「Skipped」とスキップされてしまうので、再び動かしたい場合は「 –rerun」オプションをつける必要がある
% digdag run mydag.dig 2022-07-29 16:00:01 +0900: Digdag v0.10.4 WARNING: An illegal reflective access operation has occurred WARNING: Illegal reflective access by org.skife.jdbi.cglib.core.ReflectUtils$1 (file:/usr/local/Cellar/digdag/0.10.4_1/libexec/digdag-0.10.4.jar) to method java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain) WARNING: Please consider reporting this to the maintainers of org.skife.jdbi.cglib.core.ReflectUtils$1 WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations WARNING: All illegal access operations will be denied in a future release 2022-07-29 16:00:04 +0900 [WARN] (main): Reusing the last session time 2022-07-29T00:00:00+00:00. 2022-07-29 16:00:04 +0900 [INFO] (main): Using session $HOME/digdag_work/mydag/.digdag/status/20220729T000000+0000. 2022-07-29 16:00:05 +0900 [INFO] (main): Starting a new session project id=1 workflow name=mydag session_time=2022-07-29T00:00:00+00:00 2022-07-29 16:00:05 +0900 [WARN] (0020@[0:default]+mydag+setup): Skipped 2022-07-29 16:00:05 +0900 [WARN] (0020@[0:default]+mydag+disp_current_date): Skipped 2022-07-29 16:00:05 +0900 [WARN] (0020@[0:default]+mydag+repeat): Skipped 2022-07-29 16:00:05 +0900 [WARN] (0021@[0:default]+mydag+repeat^sub+for-0=order=0=first&1=animal=1=cat): Skipped 2022-07-29 16:00:05 +0900 [WARN] (0020@[0:default]+mydag+repeat^sub+for-0=order=0=first&1=animal=0=dog): Skipped 2022-07-29 16:00:05 +0900 [WARN] (0020@[0:default]+mydag+repeat^sub+for-0=order=1=second&1=animal=0=dog): Skipped 2022-07-29 16:00:05 +0900 [WARN] (0021@[0:default]+mydag+repeat^sub+for-0=order=1=second&1=animal=1=cat): Skipped 2022-07-29 16:00:05 +0900 [WARN] (0022@[0:default]+mydag+repeat^sub+for-0=order=2=third&1=animal=0=dog): Skipped 2022-07-29 16:00:05 +0900 [WARN] (0021@[0:default]+mydag+repeat^sub+for-0=order=2=third&1=animal=1=cat): Skipped 2022-07-29 16:00:05 +0900 [WARN] (0021@[0:default]+mydag+teardown): Skipped Success. Task state is saved at $HOME/digdag_work/mydag/.digdag/status/20220729T000000+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.
% digdag run --rerun mydag.dig 2022-08-05 23:53:43 +0900: Digdag v0.10.4 WARNING: An illegal reflective access operation has occurred WARNING: Illegal reflective access by org.skife.jdbi.cglib.core.ReflectUtils$1 (file:/usr/local/Cellar/digdag/0.10.4_1/libexec/digdag-0.10.4.jar) to method java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain) WARNING: Please consider reporting this to the maintainers of org.skife.jdbi.cglib.core.ReflectUtils$1 WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations WARNING: All illegal access operations will be denied in a future release 2022-08-05 23:53:45 +0900 [WARN] (main): Reusing the last session time 2022-07-29T00:00:00+00:00. 2022-08-05 23:53:45 +0900 [INFO] (main): Using session $HOME/digdag_work/mydag/.digdag/status/20220729T000000+0000. 2022-08-05 23:53:45 +0900 [INFO] (main): Starting a new session project id=1 workflow name=mydag session_time=2022-07-29T00:00:00+00:00 2022-08-05 23:53:46 +0900 [INFO] (0020@[0:default]+mydag+setup): echo>: start 2022-07-29T00:00:00+00:00 start 2022-07-29T00:00:00+00:00 2022-08-05 23:53:47 +0900 [INFO] (0020@[0:default]+mydag+disp_current_date): echo>: 2022-07-29 00:00:00 +00:00 2022-07-29 00:00:00 +00:00 2022-08-05 23:53:47 +0900 [INFO] (0020@[0:default]+mydag+repeat): for_each>: {order=[first, second, third], animal=[dog, cat]} 2022-08-05 23:53:47 +0900 [INFO] (0022@[0:default]+mydag+repeat^sub+for-0=order=1=second&1=animal=0=dog): echo>: second dog second dog 2022-08-05 23:53:47 +0900 [INFO] (0024@[0:default]+mydag+repeat^sub+for-0=order=2=third&1=animal=0=dog): echo>: third dog third dog 2022-08-05 23:53:47 +0900 [INFO] (0021@[0:default]+mydag+repeat^sub+for-0=order=0=first&1=animal=1=cat): echo>: first cat first cat 2022-08-05 23:53:47 +0900 [INFO] (0023@[0:default]+mydag+repeat^sub+for-0=order=1=second&1=animal=1=cat): echo>: second cat second cat 2022-08-05 23:53:47 +0900 [INFO] (0020@[0:default]+mydag+repeat^sub+for-0=order=0=first&1=animal=0=dog): echo>: first dog first dog 2022-08-05 23:53:48 +0900 [INFO] (0020@[0:default]+mydag+repeat^sub+for-0=order=2=third&1=animal=1=cat): echo>: third cat third cat 2022-08-05 23:53:49 +0900 [INFO] (0020@[0:default]+mydag+teardown): echo>: finish 2022-07-29T00:00:00+00:00 finish 2022-07-29T00:00:00+00:00 Success. Task state is saved at $HOME/digdag_work/mydag/.digdag/status/20220729T000000+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.
外部pythonファイルを動かす
以下ドキュメントを参考に、digdagからPythonファイルを実行してみる
参考:py>: Python scripts
ディレクトリ構成はこんな感じ(最低限)
% tree . ├── sample.dig └── tasks └── mytask.py
実行するPythonファイルの中身はこんな感じ
現在時刻と「hello digdag!」というメッセージが表示されるだけ
% cat tasks/mytask.py import datetime dt_now = datetime.datetime.now().strftime('%Y年%m月%d日 %H:%M:%S') def my_task(): print(f"{dt_now}: hello digdag!")
「dig」ファイルの中身はこう
「py>」でPythonファイルを指定実行することができる
Pythonファイルの指定方法は、「ディレクトリ名.ファイル名.関数名」と指定している(クラス.メソッドなども指定できる)
% cat sample.dig +step1: py>: tasks.mytask.my_task
実行してみると期待通りの表示(「17:19:41: hello digdag!」)が出力された
% digdag run sample.dig 2022-08-04 17:19:39 +0900: Digdag v0.10.4 WARNING: An illegal reflective access operation has occurred WARNING: Illegal reflective access by org.skife.jdbi.cglib.core.ReflectUtils$1 (file:/usr/local/Cellar/digdag/0.10.4_1/libexec/digdag-0.10.4.jar) to method java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain) WARNING: Please consider reporting this to the maintainers of org.skife.jdbi.cglib.core.ReflectUtils$1 WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations WARNING: All illegal access operations will be denied in a future release 2022-08-04 17:19:41 +0900 [WARN] (main): Reusing the last session time 2022-08-04T00:00:00+00:00. 2022-08-04 17:19:41 +0900 [INFO] (main): Using session $HOME/digdag_work/mydag/.digdag/status/20220804T000000+0000. 2022-08-04 17:19:41 +0900 [INFO] (main): Starting a new session project id=1 workflow name=sample session_time=2022-08-04T00:00:00+00:00 2022-08-04 17:19:41 +0900 [INFO] (0020@[0:default]+sample+step1): py>: tasks.mytask.my_task 2022年08月04日 17:19:41: hello digdag! Success. Task state is saved at $HOME/digdag_work/mydag/.digdag/status/20220804T000000+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.
サーバーモード(GUI)で動かす
digdagにはGUI(サーバーモード)も用意されているので、以下ドキュメントを参考に、GUIからも先程のワークフローを実行してみる
参考:Server-mode commands
サーバーモードの実行には、「–memory」か「–database」を指定する
データを残したい場合は、「–database」を指定するべきだが、今回は動作確認のみなので「–memory」を指定
「digdag server –memory」コマンドでサーバーモードでdigdagを起動できる
% digdag server --memory 2022-08-05 23:24:36 +0900: Digdag v0.10.4 2022-08-05 23:24:39 +0900 [INFO] (main): secret encryption engine: disabled WARNING: An illegal reflective access operation has occurred WARNING: Illegal reflective access by org.skife.jdbi.cglib.core.ReflectUtils$1 (file:/usr/local/Cellar/digdag/0.10.4_1/libexec/digdag-0.10.4.jar) to method java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain) WARNING: Please consider reporting this to the maintainers of org.skife.jdbi.cglib.core.ReflectUtils$1 WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations WARNING: All illegal access operations will be denied in a future release 2022-08-05 23:24:39 +0900 [INFO] (main): XNIO version 3.3.8.Final 2022-08-05 23:24:39 +0900 [INFO] (main): XNIO NIO Implementation Version 3.3.8.Final 2022-08-05 23:24:39 +0900 [INFO] (main): Starting server on 127.0.0.1:65432 2022-08-05 23:24:39 +0900 [INFO] (main): Bound on 127.0.0.1:65432 (api)
「Starting server on 127.0.0.1:65432」と書いてあるので、ブラウザで「127.0.0.1:65432」にアクセスすると、digdagの管理画面が現れる
今サーバ上には、何もワークフローが定義されていない状態なので、先程CLIで実行したdigファイルたちを、pushコマンドで、digdagサーバに認識させる
※「digdag server」コマンドを実行しているプロセスは終了せずに、別Windowで実行する
% digdag push sample -e http://127.0.0.1:65432 2022-08-05 23:25:57 +0900: Digdag v0.10.4 Creating .digdag/tmp/archive-8547084901558768814.tar.gz... Archiving tasks/__pycache__/mytask.cpython-39.pyc Archiving tasks/mytask.py Archiving sample.dig Archiving mydag.dig Workflows: sample.dig mydag.dig Uploaded: id: 1 name: sample revision: 6d1be331-7307-48c2-936a-dfd171a6ccd7 archive type: db project created at: 2022-08-05T14:25:59Z revision updated at: 2022-08-05T14:25:59Z Use `digdag workflows` to show all workflows.
すると、管理画面にワークフローが表示されるようになる
先程CLIで実行した、「sample」というワークフローをクリックして「RUN」ボタンから実行してみる
「Sessions」の「Status」が「Success」になったら成功
「Success」の文字をクリックしてみる
何やら色々実行詳細データが出力されているのが確認できる
「digdag server」コマンドを叩いていたWindowを確認すると、「23:27:34: hello digdag!」と期待通りの出力がされている
2022-08-05 23:27:33 +0900 [INFO] (XNIO-1 task-17): Starting a new session project id=1 workflow name=sample session_time=2022-08-05T14:27:33+00:00 2022-08-05 23:27:33 +0900 [INFO] (0066@[0:sample]+sample+step1): py>: tasks.mytask.my_task 2022年08月05日 23:27:34: hello digdag!
以上。