GitHub Actions ではデフォルトの挙動として同じワークフローの複数のジョブを同時実行できる.無駄に待つ必要がないという意味ではメリットがあるけど,ワークフローによっては同時実行したくないこともあると思う.
GitHub Actions でワークフローが複数トリガーされてしまって慌てて止めたという経験もあったりする😅例えばワークフローの実行時間が長く,完了する前に次のコミットをプッシュしてしまったり,ワークフローの実行が完了する前にプルリクエストをマージしてしまったり💨
concurrency 設定
GitHub Actions ではコンカレンシー (concurrency) という設定があって,ワークフローの同時実行を制御できる.今回はワークフローレベルで試すけど,ジョブレベルで細かく制御することもできる❗️個人的にはとりあえず設定しておいても良さそうかなと思う.
concurrency サンプル1(待機)
以下の例では GitHub ドキュメントを参考に concurrency.group
に ${{ github.workflow }}-${{ github.ref }}
を設定したため concurrency-refs/pull/1/merge
のような名前になり「プルリクエストレベルで」同時実行を制御することになる💡そして concurrency.cancel-in-progress
に false
を設定しているため,後続のトリガーはキャンセルにならず実行待機になってから実行される🛑
name: concurrency on: workflow_dispatch: push: branches: - develop pull_request: branches: - develop concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: false jobs: sleep: runs-on: ubuntu-latest steps: - name: Sleep run: sleep 60
concurrency サンプル2(キャンセル)
concurrency.cancel-in-progress
に true
を設定すると,実行中のワークフローをキャンセルして最新のワークフローを実行できる🙆♂ 例えばデプロイ関連のワークフローであれば最終的に後に実行されたワークフローでデプロイされるため,ワークフローの無駄な実行を回避できて良いと思う👌
name: concurrency on: workflow_dispatch: push: branches: - develop pull_request: branches: - develop concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true jobs: sleep: runs-on: ubuntu-latest steps: - name: Sleep run: sleep 60