LoginSignup
14
4

More than 3 years have passed since last update.

GitHub Workflow の実行順や制御を試してみる

Last updated at Posted at 2020-03-29

GitHub Workflow を色々扱ってみているのでそのまとめを残しておきます。時々更新するかもです
Actions も初めてやってるので両方の内容が混ざってます

コード: https://github.com/kakkunpakkun/workflow-test

step は順に、 job は並行

step は順番に実行されますが、job は並行して実行されます。
なので、以下の様な場合に job_A が終わる前に job_B が開始されます。

on: push

jobs:
  job_A:
    name: job A
    runs-on: ubuntu-latest
    steps:
      - name: job A step 1
        run: |
          echo "job A step 1"

      - name: job A step 2
        run: |
          echo "job A step 2"

  job_B:
    name: job B
    runs-on: ubuntu-latest
    steps:
      - name: job B step 1
        run: |
          echo "job B step 1"

job の順番は needs で制御する

needs を設定することで job の順番を指定することが出来ます。
例えば needs: job_A としておけば job_A が成功するまで待って、job_A が成功しないと実行されない。

あと、job 内では同じファイルを同じマシン上のものとして扱えるけど、job が違うと別の仮想マシンとなっているみたいで共有は artifact などを使うことになります。
artifact はまだ試していないので分かりません

on: push

jobs:
  job_A:
    name: job A
    runs-on: ubuntu-latest
    steps:
      - name: job A step 1
        run: |
          echo "job A step 1"

      - name: job A step 2
        run: |
          echo "job A step 2"

  job_B:
    name: job B
    runs-on: ubuntu-latest
    steps:
      - name: job B step 1
        run: |
          echo "job B step 1"
          echo "job B" >> job_b.txt
          cat job_b.txt

  job_C:
    name: job C
    needs: job_A
    runs-on: ubuntu-latest
    steps:
      - name: job C step 1
        run: |
          echo "job C step 1"
          cat job_b.txt #ここでファイルがなくて fail する

実行結果:
スクリーンショット 2020-03-28 21.59.53.png

needs は便利かもしれないけどあんまり多いと読みにくくなりそうだし、制御のしやすさを考えると別の Workflow を作った方が良いかもしれないです

failure() や always()

job の途中で失敗した時、以降の step は実行されませんが、 if: failure() となっている step は実行されます。
if: always() もあるので後処理をしたい時に便利かもしれないです。
が、job としては失敗の状態になるのであまり if: failure() に頼らずに job が成功するように作ったほうが良さそう

# ...省略...

jobs:
  job_A:
    name: job A
    runs-on: ubuntu-latest
    steps:
      - name: job A step 1
        run: |
          echo "job A step 1"

      - name: job A step 2
        run: |
          echo "job A step 2"
          false

      - name: job A step 3
        if: failure()
        run: |
          echo "job A step 3"

      - name: job A step 4
        run: |
          echo "job A step 4"

      - name: job A step 5
        if: always()
        run: |
          echo "job A step 5"

# ...省略...

  job_C:
    name: job C
    needs: job_A
    runs-on: ubuntu-latest
    steps:
      - name: job C step 1
        run: |
          echo "job C step 1"

実行結果:
スクリーンショット 2020-03-29 22.11.25.png

job A が失敗したので job C が実行されずに実行結果に現れません。
step は実行されなかった場合も表示されるのですが job も Workflow も実行されなかったら表示されないです。

14
4
0

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
14
4