yoshiislandblog.net
元営業の駆け出しアラサーSEが、休日にMACと戯れた際の殴り書きメモ。日々勉強。日々進歩。
dig-dag-logo-tr

digdagに入門してみる(Pythonスクリプト実行、サーバーモードGUI実行)

2022-08-06

前々から気になっていた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.
スケジュール実行については、以下公式ドキュメント参考
Scheduling workflow

外部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の管理画面が現れる

20220806_digdag_1

今サーバ上には、何もワークフローが定義されていない状態なので、先程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.

すると、管理画面にワークフローが表示されるようになる

20220806_digdag_2

先程CLIで実行した、「sample」というワークフローをクリックして「RUN」ボタンから実行してみる

20220806_digdag_3
20220806_digdag_4

「Sessions」の「Status」が「Success」になったら成功
「Success」の文字をクリックしてみる
20220806_digdag_5

何やら色々実行詳細データが出力されているのが確認できる
20220806_digdag_6

「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!

以上。