LoginSignup
2
0

【GitHub Actions】Workflowを同時に実行しないようにする

Last updated at Posted at 2023-02-20

はじめに

公式ドキュメントを読んでいたところ、以下のような記述を見つけました。

同じジョブ、ワークフローを同時に実行しないようにできるそうです。

今回は以下のワークフローを同時に実行しないようにしてみます。

main.yml
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'

同時に実行した場合↓

none

1.ワークフローレベル

1-1.保留にしたい場合

concurrency: <任意の文字列>を追加します。
concurrency: <任意の文字列>が含まれるワークフローは同時に実行されません。

main.yml
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'

実行結果↓

result

後から始まったワークフローが保留状態になっています。
先に始まったワークフローが終了すると、後から始まったワークフローが実行されます。

また、他のワークフローにもconcurrency: <任意の文字列>を追加することで同時に実行しないようにできます。

main2.yml
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'

実行結果↓

result1

main2.yml
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'

result2

1-2.キャンセルしたい場合

cancel-in-progress: trueを追加し、concurrency: <任意の文字列>を以下にように修正することでできます。

main.yml
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'

先に始まったワークフローがキャンセルされます。

result

先程同様、別のワークフローにもcancel-in-progress: trueを追加してもキャンセルできます。

2.ジョブレベル

2-1.保留にしたい場合

concurrencyをジョブレベルで設定することもできます。

none2

main.yml
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'

実行結果↓

result1

同じワークフローを2回実行した場合、なぜか両方ともjob1がキャンセルされました。
もう1回試してみたところ、片方はjob1がキャンセルされ、もう片方はjob2がキャンセルされました。
挙動が謎。

result2-1

result2-2

2-2.キャンセルしたい場合

cancel-in-progress: trueを追加するだけです。

main.yml
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'

実行結果↓

result

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0