kakakakakku blog

Weekly Tech Blog: Keep on Learning!

GitHub Actions でワークフローの同時実行を防ぐ concurrency 設定

GitHub Actions ではデフォルトの挙動として同じワークフローの複数のジョブを同時実行できる.無駄に待つ必要がないという意味ではメリットがあるけど,ワークフローによっては同時実行したくないこともあると思う.

GitHub Actions でワークフローが複数トリガーされてしまって慌てて止めたという経験もあったりする😅例えばワークフローの実行時間が長く,完了する前に次のコミットをプッシュしてしまったり,ワークフローの実行が完了する前にプルリクエストをマージしてしまったり💨

concurrency 設定

GitHub Actions ではコンカレンシー (concurrency) という設定があって,ワークフローの同時実行を制御できる.今回はワークフローレベルで試すけど,ジョブレベルで細かく制御することもできる❗️個人的にはとりあえず設定しておいても良さそうかなと思う.

docs.github.com

concurrency サンプル1(待機)

以下の例では GitHub ドキュメントを参考に concurrency.group${{ github.workflow }}-${{ github.ref }} を設定したため concurrency-refs/pull/1/merge のような名前になり「プルリクエストレベルで」同時実行を制御することになる💡そして concurrency.cancel-in-progressfalse を設定しているため,後続のトリガーはキャンセルにならず実行待機になってから実行される🛑

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-progresstrue を設定すると,実行中のワークフローをキャンセルして最新のワークフローを実行できる🙆‍♂ 例えばデプロイ関連のワークフローであれば最終的に後に実行されたワークフローでデプロイされるため,ワークフローの無駄な実行を回避できて良いと思う👌

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