GitHub Actionsのconcurrencyを触ってみる
これ。同時実行を制御できるようになった
GitHub Actions: Limit workflow run or job concurrency - GitHub Changelog
on:
workflow_dispatch
concurrency:
this_is_concurrency_workflow
jobs:
concurrency_workflow:
runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v2
- run: sleep 60
ref: https://github.com/korosuke613/playground/blob/main/.github/workflows/concurrency-workflow.yaml
トップレベルでconcurrency
を設定することで同じ名前のconcurrency
ワークフローは同時実行されない
ちょうどgh
コマンドでworkflow_dispatch
を叩けるようになったので使ってみた
❯ gh workflow run .github/workflows/concurrency-workflow.yaml
✓ Created workflow_dispatch event for concurrency-workflow.yaml at main
To see runs for this workflow, try: gh run list --workflow=concurrency-workflow.yaml
.github/workflows/concurrency-workflow.yaml
は実行後60秒はワークフローが終わらないのですぐさま2回実行するとconcurrencyを確かめられる。
下みたいになった。確かに待ってる!
今度はジョブのconcurrencyを実験。下のようなworkflowを流してみる。
on:
workflow_dispatch
jobs:
normal-job:
runs-on: ubuntu-20.04
steps:
- run: sleep 5
concurrency-job:
runs-on: ubuntu-20.04
concurrency:
this_is_concurrency_job
steps:
- run: sleep 60
dependent-job:
runs-on: ubuntu-20.04
needs:
- normal-job
concurrency:
this_is_concurrency_job_2
steps:
- run: sleep 20
after-job:
runs-on: ubuntu-20.04
needs:
- dependent-job
concurrency:
this_is_concurrency_job
steps:
- run: sleep 5
実行
おっ。concurrency-job
とafter-job
は同じ名前のconcurrencyが設定されているからちゃんと待ったぞ
(まあこのワークフローの場合普通にneeds
を使えば同時実行は防げるけど)
ジョブのconcurrencyはワークフローをまたいでも同時実行を防げるのか!?
というわけで.github/workflows/concurrency-job.yaml
をすかさず二回実行。
❯ gh workflow run .github/workflows/concurrency-job.yaml
✓ Created workflow_dispatch event for concurrency-job.yaml at main
To see runs for this workflow, try: gh run list --workflow=concurrency-job.yaml
❯ gh workflow run .github/workflows/concurrency-job.yaml
✓ Created workflow_dispatch event for concurrency-job.yaml at main
To see runs for this workflow, try: gh run list --workflow=concurrency-job.yaml
実行...
↑ 最初に実行したワークフロー
↓ その後実行したワークフロー
同じ名前のconcurrencyならワークフローをまたいでも同時実行は防げるようですね
ちなみにIntelliJで参照できるJSONスキーマはまだconcurrencyに未対応な模様
おおっと。さっき実行したワークフローをもっかい見に行ったらキャンセルされてた。
Canceling since a higher priority waiting request for 'this_is_concurrency_job' exists
(DeepL翻訳くん) this_is_concurrency_job' に対するより優先度の高い待機中のリクエストが存在するため、キャンセルします。
workflowをまたぐと後続のジョブはキャンセルされる??不思議なのはdependent-job
だ。こっちもwaitになってたのにしっかり実行されたみたい。
cancel-in-progress: true
を使ってみた。
on:
workflow_dispatch
jobs:
normal-job:
runs-on: ubuntu-20.04
steps:
- run: sleep 5
concurrency-job:
runs-on: ubuntu-20.04
concurrency:
group: this_is_concurrency_job
cancel-in-progress: true
steps:
- run: sleep 60
dependent-job:
runs-on: ubuntu-20.04
needs:
- normal-job
concurrency:
group: this_is_concurrency_job2
cancel-in-progress: true
steps:
- run: sleep 20
after-job:
runs-on: ubuntu-20.04
needs:
- dependent-job
concurrency:
this_is_concurrency_job
steps:
- run: sleep 5
うーんいまいち挙動がわからん。
先に実行されたジョブがキャンセルされるのもあれば後に実行されたジョブがキャンセルされることもある。両方キャンセルされるのもある。謎
もしかしてcancel-in-progress: true
がデフォルトなのかと思ってcancel-in-progress: false
にしてみた。
on:
workflow_dispatch
jobs:
normal-job:
runs-on: ubuntu-20.04
steps:
- run: sleep 5
concurrency-job:
runs-on: ubuntu-20.04
concurrency:
group: this_is_concurrency_job
cancel-in-progress: false
steps:
- run: sleep 60
dependent-job:
runs-on: ubuntu-20.04
needs:
- normal-job
concurrency:
group: this_is_concurrency_job2
cancel-in-progress: false
steps:
- run: sleep 20
after-job:
runs-on: ubuntu-20.04
needs:
- dependent-job
concurrency:
this_is_concurrency_job
steps:
- run: sleep 5
やはりキャンセルされる...
一体どういう条件でキャンセルされるんだ?
やっぱり困惑してる人いるな。まだまだベータ版だからしょうがないか
Concurrency: cancel-in-progress at top level doesn't seem to cancel running workflows? - Code to Cloud / GitHub Actions - GitHub Support Community
ベータ版だからかちょっと同時実行のキャンセル周りの挙動が謎なので本番利用するのはまだちょっと厳しいかも?
正式リリースを待ちたいぜ
concurrency記事で取り上げてもらってました(今見つけた)
良いgroup名の付け方をしてて参考になります