はじめに
公式ドキュメントを読んでいたところ、以下のような記述を見つけました。
同じジョブ、ワークフローを同時に実行しないようにできるそうです。
今回は以下のワークフローを同時に実行しないようにしてみます。
name: GitHub_Actions
on:
workflow_dispatch:
schedule:
- cron: '*/30 * * * *'
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Hello World
run: |
echo 'Hello'
sleep 10
echo 'World'
同時に実行した場合↓
1.ワークフローレベル
1-1.保留にしたい場合
concurrency: <任意の文字列>
を追加します。
concurrency: <任意の文字列>
が含まれるワークフローは同時に実行されません。
name: GitHub_Actions
on:
workflow_dispatch:
schedule:
- cron: '*/30 * * * *'
concurrency: test
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Hello World
run: |
echo 'Hello'
sleep 10
echo 'World'
実行結果↓
後から始まったワークフローが保留状態になっています。
先に始まったワークフローが終了すると、後から始まったワークフローが実行されます。
また、他のワークフローにもconcurrency: <任意の文字列>
を追加することで同時に実行しないようにできます。
name: GitHub_Actions(2)
on:
workflow_dispatch:
schedule:
- cron: '*/30 * * * *'
concurrency: test
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: hoge fuga
run: |
echo 'hoge'
sleep 10
echo 'fuga'
実行結果↓
name: GitHub_Actions(2)
on:
workflow_dispatch:
schedule:
- cron: '*/30 * * * *'
concurrency: test2
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: hoge fuga
run: |
echo 'hoge'
sleep 10
echo 'fuga'
1-2.キャンセルしたい場合
cancel-in-progress: true
を追加し、concurrency: <任意の文字列>
を以下にように修正することでできます。
name: GitHub_Actions
on:
workflow_dispatch:
schedule:
- cron: '*/30 * * * *'
concurrency:
group: test
cancel-in-progress: true
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Hello World
run: |
echo 'Hello'
sleep 10
echo 'World'
先に始まったワークフローがキャンセルされます。
先程同様、別のワークフローにもcancel-in-progress: true
を追加してもキャンセルできます。
2.ジョブレベル
2-1.保留にしたい場合
concurrency
をジョブレベルで設定することもできます。
name: GitHub_Actions
on:
workflow_dispatch:
schedule:
- cron: '*/30 * * * *'
jobs:
job1:
runs-on: ubuntu-latest
concurrency: test
steps:
- name: Hello World
run: |
echo 'Hello'
sleep 10
echo 'World'
job2:
runs-on: ubuntu-latest
concurrency: test
steps:
- name: hoge fuga
run: |
echo 'hoge'
sleep 10
echo 'fuga'
実行結果↓
同じワークフローを2回実行した場合、なぜか両方ともjob1がキャンセルされました。
もう1回試してみたところ、片方はjob1がキャンセルされ、もう片方はjob2がキャンセルされました。
挙動が謎。
2-2.キャンセルしたい場合
cancel-in-progress: true
を追加するだけです。
name: GitHub_Actions
on:
workflow_dispatch:
schedule:
- cron: '*/30 * * * *'
jobs:
job1:
runs-on: ubuntu-latest
concurrency:
group: test
cancel-in-progress: true
steps:
- name: Hello World
run: |
echo 'Hello'
sleep 10
echo 'World'
job2:
runs-on: ubuntu-latest
concurrency:
group: test
cancel-in-progress: true
steps:
- name: hoge fuga
run: |
echo 'hoge'
sleep 10
echo 'fuga'
実行結果↓