digdag

digdagの変数はoverrideできる

digdagで変数を_exportで定義した時、局所的に変数を上書きしたい場合があると思います。
上書きするときの変数のスコープについて軽く調べたので共有します。

変数を上書きするdigdagの例

variable_override_test.dig
timezone: Asia/Tokyo

_export:
  var1: hoge

+setup:
  echo>: start ${session_time}

+test1:
  echo>: var is ${var1}

+test2:
  _export:
    var1: fuga
  echo>: overrided var is ${var1}

+test3:
  echo>: var is ${var1}

+test4:
  _export:
    var1: fuga
  +sub4:
    echo>: overrided var(in subtask) is ${var1}

+teardown:
  echo>: finish ${session_time}

実行結果は以下の通り

$ digdag run variable_override_test.dig
2018-01-25 19:26:51 +0900: Digdag v0.9.20
2018-01-25 19:26:52 +0900 [WARN] (main): Using a new session time 2018-01-25T00:00:00+09:00.
2018-01-25 19:26:52 +0900 [INFO] (main): Using session /Users/200291/playground/digdag_test/variable_override_test/.digdag/status/20180125T000000+0900.
2018-01-25 19:26:52 +0900 [INFO] (main): Starting a new session project id=1 workflow name=variable_override_test session_time=2018-01-25T00:00:00+09:00
2018-01-25 19:26:53 +0900 [INFO] (0018@[0:default]+variable_override_test+setup): echo>: start 2018-01-25T00:00:00+09:00
start 2018-01-25T00:00:00+09:00
2018-01-25 19:26:53 +0900 [INFO] (0018@[0:default]+variable_override_test+test1): echo>: var is hoge
var is hoge
2018-01-25 19:26:54 +0900 [INFO] (0018@[0:default]+variable_override_test+test2): echo>: overrided var is fuga
overrided var is fuga
2018-01-25 19:26:54 +0900 [INFO] (0018@[0:default]+variable_override_test+test3): echo>: var is hoge
var is hoge
2018-01-25 19:26:54 +0900 [INFO] (0018@[0:default]+variable_override_test+test4+sub4): echo>: overrided var(in subtask) is fuga
overrided var(in subtask) is fuga
2018-01-25 19:26:54 +0900 [INFO] (0018@[0:default]+variable_override_test+teardown): echo>: finish 2018-01-25T00:00:00+09:00
finish 2018-01-25T00:00:00+09:00
Success. Task state is saved at /Users/200291/playground/digdag_test/variable_override_test/.digdag/status/20180125T000000+0900 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.

まとめ

上記実行結果を表にまとめました

test名 テストしたいこと 結果
test1 グローバルに定義したvar1の確認 hoge (そのまま)
test2 タスク内で定義しなおしたvar1の確認 fuga (overrideされている)
test3 var1をoverrideしたタスクの後の別タスクでの確認 hoge (そのまま)
test4 タスクでvar1を定義し直した時、そのサブタスク内での確認 fuga (overrideされている)
  • digdag では変数をoverrideできる
  • また、スコープは当該タスクとそのサブタスク内

細かいことですがスコープを理解していることでワークフローをより簡潔にかくことができそうです。