肉球でキーボード

MLエンジニアの技術ブログです

Digdag の条件式に変数を使用する場合の注意点

やりたいこと

Digdag では条件式を用いて、タスクを分岐させることができます。
if>: Conditional execution — Digdag 0.10.4 documentation

公式ドキュメントでは, if>: {boolean} として条件分義を行うように指示があります。

+run_if_param_is_false:
  if>: ${param}
  _do:
    echo>: ${param} == true
  _else_do:
    echo>: ${param} == false

以下のように、複数の変数の値から条件判定を行う際に気を付けるべき点をご紹介します。

+run_multiple_param_:
  if>: ${param1 || param2}
  _do:
    echo>: 'success'
  _else_do:
    echo>: 'faile'

注意点

何らかの判定を行った flag を複数の変数に格納して、タスクを実行するかの判定に使いたい場合を考えます。
このような判定処理では、Digdag は${...} を使うことで、JavaScript として展開され簡単な処理ができます。
Workflow definition — Digdag 0.10.4 documentation

変数に直接 boolean を格納した場合と、JavaScript で展開した boolean を格納した場合で Digdag の条件式を使用すると、これらは異なる挙動を示します。

timezone: Asia/Tokyo

_export:
  workflow_name: sample-variable-behaviour

+run_my_workflow:
  +step1:
    _export:
      param: false
      param2: true
    if>: ${param && param2}
    _do:
      echo>: 'success' 
    _else_do:
      echo>: 'fail' # 出力

  +step2:
    _export:
      param: ${1+1 == 1} # false
      param2: ${1+1 == 2} # true
    if>: ${param && param2}
    _do:
      echo>: 'success' 
    _else_do:
      echo>: 'fail' # 出力

この現象が起こる理由は、Digdagでは JavaScript で展開した boolean を、変数として _export すると string と暗黙的に型変換されるためです。
ECS task を扱うプラグインなど、有名な digdag plugin のコミッターである civitaspo さんが検証してくださっています。log · GitHub
細かい条件式の挙動については、こちらの方のブログで非常にわかりやすくまとめてくださっています。 DigDag ifメモ(Hishidama's DigDag if Memo)

では、string 型に型変換された変数を複数扱うには、以下のように文字列で true か false の判定を条件式中で行えば実現することができます。

timezone: Asia/Tokyo

_export:
  workflow_name: sample-variable-behaviour

+run_my_workflow:
  +step1:
    _export:
      param: ${1+1 == 1}
      param2: ${1+1 == 2}
    if>: ${param=='true' && param2=='true'}
    _do:
      echo>: 'success'
    _else_do:
      echo>: 'fail' # 出力

  +step2:
    _export:
      param: ${1+1 == 1}
      param2: ${1+1 == 2}
    if>: ${param=='true' || param2=='true'}
    _do:
      echo>: 'success' # 出力
    _else_do:
      echo>: 'fail'

以上、Digdag の条件式中で変数を使用する場合の注意点をまとめました。
_export して変数に格納した値は全て文字列に型変換されるという Digdag の挙動に注意が必要なので、ハマった方の助けになれば幸いです。

参考

log · GitHub

DigDag ifメモ(Hishidama's DigDag if Memo)