digdagのローカルモードでサンプルを動かしてみる（実行メモ）

# はじめに

digdagはトレジャーデータが公開しているOSSのワークフローマネージャーです。
digdagを使うのは初めてなので、まずは勉強として開発用に使用するローカルモードでサンプルワークフローを動かしてみました。


# digdagのインストール

digdagのGet startedを参考にインストールを実施します。

- [Getting started](http://docs.digdag.io/getting_started.html)

```
# curl -o ~/bin/digdag --create-dirs -L "https://dl.digdag.io/digdag-latest"
# chmod +x ~/bin/digdag
# echo 'export PATH="$HOME/bin:$PATH"' >> ~/.bashrc
# source ~/.bashrc
```

お試しだったので、rootユーザのbin以下にインストールしていますが、/usr/local/binなどインストールした方が良いと思います。


# サンプルワークフローを動かす

digdag initコマンドでサンプルのワークフローを作成できます。
この例ではmydigディレクトリ以下に、mydag.digというファイルが生成されます。

```
# digdag init mydag
```

mydag.digファイルの内容は以下のようになっています。

```yaml: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コマンドを使用します。

```
# cd mydag
# digdag run mydag.dig
```

実行した結果、以下のようにコンソールに出力されました。

```
2019-09-26 14:54:02 +0200 [WARN] (main): Using a new session time 2019-09-26T00:00:00+00:00.
2019-09-26 14:54:02 +0200 [INFO] (main): Using session /root/mydag/.digdag/status/20190926T000000+0000.
2019-09-26 14:54:02 +0200 [INFO] (main): Starting a new session project id=1 workflow name=mydag session_time=2019-09-26T00:00:00+00:00
2019-09-26 14:54:03 +0200 [INFO] (0016@[0:default]+mydag+setup): echo>: start 2019-09-26T00:00:00+00:00
start 2019-09-26T00:00:00+00:00
2019-09-26 14:54:05 +0200 [INFO] (0016@[0:default]+mydag+disp_current_date): echo>: 2019-09-26 00:00:00 +00:00
2019-09-26 00:00:00 +00:00
2019-09-26 14:54:06 +0200 [INFO] (0016@[0:default]+mydag+repeat): for_each>: {order=[first, second, third], animal=[dog, cat]}
2019-09-26 14:54:07 +0200 [INFO] (0016@[0:default]+mydag+repeat^sub+for-0=order=0=first&1=animal=0=dog): echo>: first dog
first dog
2019-09-26 14:54:07 +0200 [INFO] (0020@[0:default]+mydag+repeat^sub+for-0=order=2=third&1=animal=0=dog): echo>: third dog
third dog
2019-09-26 14:54:07 +0200 [INFO] (0019@[0:default]+mydag+repeat^sub+for-0=order=1=second&1=animal=1=cat): echo>: second cat
second cat
2019-09-26 14:54:07 +0200 [INFO] (0018@[0:default]+mydag+repeat^sub+for-0=order=1=second&1=animal=0=dog): echo>: second dog
second dog
2019-09-26 14:54:07 +0200 [INFO] (0021@[0:default]+mydag+repeat^sub+for-0=order=2=third&1=animal=1=cat): echo>: third cat
third cat
2019-09-26 14:54:07 +0200 [INFO] (0017@[0:default]+mydag+repeat^sub+for-0=order=0=first&1=animal=1=cat): echo>: first cat
first cat
2019-09-26 14:54:08 +0200 [INFO] (0017@[0:default]+mydag+teardown): echo>: finish 2019-09-26T00:00:00+00:00
finish 2019-09-26T00:00:00+00:00
Success. Task state is saved at /root/mydag/.digdag/status/20190926T000000+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.
```

もう一度実行すると、既に実行済みのため各タスクはスキップされます。

```
2019-09-26 15:28:31 +0200 [WARN] (0016@[0:default]+mydag+setup): Skipped
2019-09-26 15:28:31 +0200 [WARN] (0016@[0:default]+mydag+disp_current_date): Skipped
2019-09-26 15:28:31 +0200 [WARN] (0016@[0:default]+mydag+repeat): Skipped
2019-09-26 15:28:31 +0200 [WARN] (0016@[0:default]+mydag+repeat^sub+for-0=order=0=first&1=animal=0=dog): Skipped
2019-09-26 15:28:31 +0200 [WARN] (0016@[0:default]+mydag+repeat^sub+for-0=order=0=first&1=animal=1=cat): Skipped
2019-09-26 15:28:31 +0200 [WARN] (0016@[0:default]+mydag+repeat^sub+for-0=order=1=second&1=animal=0=dog): Skipped
2019-09-26 15:28:31 +0200 [WARN] (0017@[0:default]+mydag+repeat^sub+for-0=order=1=second&1=animal=1=cat): Skipped
2019-09-26 15:28:31 +0200 [WARN] (0018@[0:default]+mydag+repeat^sub+for-0=order=2=third&1=animal=0=dog): Skipped
2019-09-26 15:28:31 +0200 [WARN] (0019@[0:default]+mydag+repeat^sub+for-0=order=2=third&1=animal=1=cat): Skipped
2019-09-26 15:28:31 +0200 [WARN] (0017@[0:default]+mydag+teardown): Skipped
Success. Task state is saved at /root/mydag/.digdag/status/20190926T000000+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.
```

- セッションタイム（ワークフローの実行時間）を出力する

+で始まっているものがタスクで、上から順番に実行されます。
echo>となっているものがオペレーターで、echoによりメッセージを表示します。
ここでは「start ${session_time}」というメッセージを表示するということになります。

```
+setup:
  echo>: start ${session_time}

[INFO] (0016@[0:default]+mydag+setup): echo>: start 2019-09-26T00:00:00+00:00
start 2019-09-26T00:00:00+00:00
```

- セッションタイムのフォーマットを変換し表示する

${...}と書いた場合、JavaScriptとして展開されます。
以下ではdigdagにバンドルされている日付操作用のMoment.jsを使用しています。

```
+disp_current_date:
  echo>: ${moment(session_time).utc().format('YYYY-MM-DD HH:mm:ss Z')}

[INFO] (0016@[0:default]+mydag+disp_current_date): echo>: 2019-09-26 00:00:00 +00:00
2019-09-26 00:00:00 +00:00
```

- 並列で配列のデータを表示する

order, animalという2つの配列に対してfor文を実行しています。
この場合は3×2=6回実行されることになります。
_parallel: true を指定すると、並列実行になります。


```
+repeat:
  for_each>:
    order: [first, second, third]
    animal: [dog, cat]
  _do:
    echo>: ${order} ${animal}
  _parallel: true

[INFO] (0016@[0:default]+mydag+repeat): for_each>: {order=[first, second, third], animal=[dog, cat]}
2019-09-26 14:54:07 +0200 [INFO] (0016@[0:default]+mydag+repeat^sub+for-0=order=0=first&1=animal=0=dog): echo>: first dog
first dog
～省略～
```

digdag checkコマンドでは、ワークフローの定義とスケジュールを表示します。

```
# digdag check
2019-09-27 13:12:28 +0200: Digdag v0.9.39
2019-09-27 13:12:30 +0200 [INFO] (main): Database migration started
2019-09-27 13:12:30 +0200 [INFO] (main): Applying database migration:20151204221156
～省略～
2019-09-27 13:12:30 +0200 [INFO] (main): Database migration successfully finished.
  System default timezone: Europe/Vienna

  Definitions (1 workflows):
    mydag (5 tasks)

  Parameters:
    {}

  Schedules (0 entries):
```

# スケジュール実行

次はスケジュール実行を試してみます。
先ほどのmydag.digファイルのトップレベルに以下の2行を追加します。
これは1分インターバルで実行する意味になります。

```yaml
schedule:
  minutes_interval>: 1
```

スケジュール実行するため、digdag schedulerコマンドを使用します。
なお、mydag.digを変更すると自動で読み込み直すので再起動は必要ありません。
実行すると、以下のように1分ごとにメッセージが出力されるのを確認できます。

```
# digdag scheduler -b 0.0.0.0

2019-09-27 15:14:02 +0200 [INFO] (0033@[0:default]+mydag+setup): echo>: start 2019-09-27T13:14:00+00:00
start 2019-09-27T13:14:00+00:00
2019-09-27 15:15:00 +0200 [INFO] (0037@[0:default]+mydag+setup): echo>: start 2019-09-27T13:15:00+00:00
start 2019-09-27T13:15:00+00:00
2019-09-27 15:16:00 +0200 [INFO] (0038@[0:default]+mydag+setup): echo>: start 2019-09-27T13:16:00+00:00
start 2019-09-27T13:16:00+00:00
```