LoginSignup
36
12

More than 1 year has passed since last update.

GitHub Actions: jobのskipとneedsとalwaysとfailure。2021-04-19

Last updated at Posted at 2021-04-19

概要

わかりにくいタイトルですみません。

  • 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ではneedsalways()failure() を組み合わせることでいろいろ制御できます。

cancelled() もあります。

36
12
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
36
12