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

# はじめに

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

https://docs.github.com/en/actions/using-jobs/using-concurrency

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

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

```yaml: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](https://raw.githubusercontent.com/SoniPana/Qiita-Content/main/images/23/02/20/none.png)

# 1.ワークフローレベル

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

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

```yaml: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](https://raw.githubusercontent.com/SoniPana/Qiita-Content/main/images/23/02/20/concurrency.png)

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

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

```yaml: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](https://raw.githubusercontent.com/SoniPana/Qiita-Content/main/images/23/02/20/concurrencies1.png)

```yaml: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](https://raw.githubusercontent.com/SoniPana/Qiita-Content/main/images/23/02/20/concurrencies2.png)

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

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


```yaml: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](https://raw.githubusercontent.com/SoniPana/Qiita-Content/main/images/23/02/20/true.png)

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

# 2.ジョブレベル

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

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

![none2](https://raw.githubusercontent.com/SoniPana/Qiita-Content/main/images/23/02/20/job_none.png)

```yaml: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](https://raw.githubusercontent.com/SoniPana/Qiita-Content/main/images/23/02/20/job_result1.png)

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

![result2-1](https://raw.githubusercontent.com/SoniPana/Qiita-Content/main/images/23/02/20/job_result2-1.png)

![result2-2](https://raw.githubusercontent.com/SoniPana/Qiita-Content/main/images/23/02/20/job_result2-2.png)

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

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

```yaml: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](https://raw.githubusercontent.com/SoniPana/Qiita-Content/main/images/23/02/20/job_cancel.png)