dag.tasks.depends
例えば、「Aが成功したら、Bを実行する」みたいなことを言いたい
例
code:yaml
dag:
tasks:
- name: A
template: echo
arguments:
- name: B
template: echo
depends: "A" # A の後に B
arguments:
- name: C
template: echo
depends: "A" # A の後に C (B と C は並列)
- name: D
template: echo
depends: "B && C" # B と C が両方 Succeeded になったら D
何も書かないと Succeeded を意味する
code:yaml
depends: "A" # A.Succeeded と同じ
depends: "A.Succeeded" # 明示形
depends: "A.Failed" # A が失敗したら走る
depends: "A.Succeeded || A.Failed" # A が終わったら必ず走る
depends: "A.Succeeded && B.Succeeded" # 両方の成功を待つ
使えるステータス
withParam でファンアウトしたタスクには集約系のキーワードが使える。
code:yaml
depends: "fanout.AnySucceeded" # 並列展開のうち1つでも成功
depends: "fanout.AllFailed" # 全部失敗
旧 dependencies との関係
code:yaml
dependencies: A, B # 旧形式。A.Succeeded && B.Succeeded と等価 新規は depends: を使う。両方は併用できない。
A が失敗でも進めたいなら明示する。
code:yaml
depends: "(A.Succeeded || A.Failed || A.Errored) && B.Succeeded"
withParam: '{{tasks.X.outputs.parameters.items}}' で配列を展開してファンアウトするタスクがあるとき、配列が空 [] だとそのタスクは展開対象ゼロ → Skipped 扱いになる。
code:yaml
- name: fanout
withParam: "{{tasks.list.outputs.parameters.items}}"
template: do-one
# items=[] のとき fanout は Skipped
このとき、下流が
code:yaml
- name: aggregate
depends: "fanout.Succeeded || fanout.Failed || fanout.Errored"
と書かれていると、Skipped はどれにも当てはまらず、aggregate も実行されないまま伝播 Omittedになる。
Workflow 全体は緑(成功)で終わっているのに、肝心の処理が一度も走っていない、という見落としやすい事故が起きる。
推奨パターン
1. Skipped を明示的に拾う
「親が成功・失敗・スキップのどれでも次に進めたい」なら全部書く。
code:yaml
depends: >-
(parent.Succeeded || parent.Failed ||
parent.Errored || parent.Skipped)
2. 中間タスクを飛ばして上位タスクに依存する
ファンアウト用の中間タスクは Skipped になりやすい。
ファンアウトの「元データを作ったタスク」に依存させると安定する。
code:_
list ──> fanout(withParam) ──> aggregate
^空配列でSkipped
↑
これに依存すると死ぬ
list ──> fanout ──> aggregate
└────────────────────^ ここに依存させる
3. when: と組み合わせる
Skipped を許容しつつ、本当に走ったときだけ処理したい場合は、子側に when: を置いて意図を明示する。
code:yaml
- name: aggregate
depends: "fanout"
when: "{{tasks.fanout.status}} != Skipped"
デバッグの観点
「Workflow は緑なのに何かが起きてない」とき疑うべきもの:
1. 空配列の withParam で Skipped していないか
argo get <wf> でタスク状態を見て Skipped を探す。
2. depends 句にステータスが書いてあるか
何も書かない depends: "A" は Succeeded のみ。
3. Omitted の連鎖
Skipped タスクに依存する後続は Omitted になる。これも「成功でも失敗でもない」ので警報が鳴らない。
4. status 出力を後続から覗く
{{tasks.X.status}} で文字列として参照できるので、ログに出すだけでも調査が楽になる。