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