概要
わかりにくいタイトルですみません。
-
needs
でjobを順番に実行したい - 途中のjobはスキップする可能性あり
- でも一番最後のjobは必ず実行したい
- 途中のjobで失敗しなかったら最後のjobは必ず実行したい
みたいなときの設定例を書きます。
設定例1
needs
で順番に実行
jobs:
job1:
...
job2:
needs: job1
job3:
needs: job2
GitHub Actionsのjobは並列で動きます。
順番に動かしたいときはneedsを使うことで制御できます。
上記の設定だと job1 -> job2 -> job3 の順番で動きます。
(もちろん途中のjobで失敗したらそれ以降のjobは動きません)
設定例2
設定例1を変更して、job2にifを追加しました。
jobs:
job1:
...
job2:
if: ${{ 差分があったら実行みたいな条件 }}
needs: job1
job3:
needs: job2
この設定だと差分があったらjob2が動き、差分がなかったらjob2は動きません(スキップします)。
このときjob2が動かない(スキップする)と、 needs: job2
の影響でjob3は動きません。
(もちろん途中のjobで失敗したらそれ以降のjobは動きません)
設定例3
設定例2だとjob2が動かない(スキップする)とjob3が動きませんでしたが、job2がスキップしたときでもjob3が動いて欲しい時があります。
jobs:
job1:
...
job2:
if: ${{ 差分があったら実行みたいな条件 }}
needs: job1
job3:
if: always()
needs: job2
job3に if: always()
を追加することでjob2がスキップした場合もjob3が動くようになります。
ただし、always()
を設定するとその名の通り必ず動きます。job2が失敗したとしても動きます。
(参考: !cancelled()
の方が良さげ)
設定例4
設定例3だとjob2が失敗した時もjob3が動きました。
しかしjob2が失敗したときにはjob3が動いて欲しくない時があります。
要件が複雑になったので箇条書きにすると
- job2が成功したらjob3が動く
- job2をスキップしてもjob3が動く
- job2が失敗したらjob3は動かない
jobs:
job1:
...
job2:
if: ${{ 差分があったら実行みたいな条件 }}
needs: job1
job3:
if: ${{ ! failure() }}
needs: job2
if: ${{ ! failure() }}
を設定することで「失敗しなかったら」という条件になるので、「成功した場合」、「スキップした場合」それぞれでjob3が動くようになります。
(参考: !cancelled() && !failure()
の方がよさげ)
まとめ
説明が下手で伝えたいことが伝わったかわかりませんが、GitHub Actionsではneeds
と always()
や failure()
を組み合わせることでいろいろ制御できます。