肉球でキーボード

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

digdagのタスク間で変数を受け渡す方法

やりたいこと

digdag ではタスク内部で使用する変数を _export を用いて定義します。あるタスクで設定した変数を、次のタスクに受け渡すやり方の実現方法に困ったので書き留めておきます。
具体的に実現したいことを説明するために、_exportで定義した変数をタスク内で定義し直して、次のタスクで変数の中身がどうなるか確認した例です。

timezone: Asia/Tokyo

_export:
  workflow_name: sample-digdag-workflow

+run_my_workflow:
  _export:
    my_var: Before  # 親タスクで変数を定義

  +step1:
    _export:
      my_var: After # 子タスクの step1 で変数を再定義
    sh>: echo "my_var -> ${my_var}"  # 実行結果: my_var -> After

  +step2:
    sh>: echo "my_var -> ${my_var}" # 実行結果: my_var -> Before

親タスク内で After という値に定義した my_var を、子タスクのstep1 で Before という値で再定義しています。
この時、変数を再定義した step1 での my_var の中身は After となりますが、次のタスクのstep2 での my_var の中身は Before となり、中身が変わっていません。

直前のタスクの結果を次のタスクへ受け渡すような、タスク間に依存関係を持たせたい場合、_export では定義した変数ではタスク間の受け渡しができません。
そこで、上記の例なら step1 で書き換えた my_var の中身を、そのまま次のタスクであるstep2 に渡す方法を紹介したいと思います。

タスク間で変数を受け渡す方法

こちらの方が公開してくださっている、シェルの出力を変数に代入する Didag プラグインを使用します。
処理結果でfor_eachするために、シェルの出力を変数に代入するDigdagプラグイン作ってみた | takemikami's note

このプラグインを使用して、強引ではありますが変数の中身を上書きすることができます。
以下の例では、親タスクで定義した変数 my_var の中身を step2 で上書きして、上書きした内容を step3 へ受け渡しています。
json 形式で変数の中身を書き換えているため、変数の中身を参照する際は要素へアクセスする形になるのに注意が必要です。

timezone: Asia/Tokyo

_export:
  workflow_name: sample-digdag-workflow

  plugin: # 必要なプラグインを読み込み
    repositories:
      - https://jitpack.io
    dependencies:
      - com.github.takemikami:digdag-plugin-shresult:0.0.1


+run_my_workflow:
  _export:
    my_var: Before  # 親タスクで変数を定義

 
  +step1:
    sh>: echo "my_var -> ${my_var}" # 実行結果: my_var -> Before 

  +step2:
    sh_result>: echo "[{\"value\":\"After\"}]" 
    destination_variable: my_var # 変数 my_var の中身を書き換え 
    stdout_format: json-list-map

  +step3:
    sh>: echo "my_var -> ${my_var[0].value}" # 実行結果: my_var -> After

以上、Digdag のタスク間で変数を受け渡す方法を紹介しました。