はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【Actions】ステータスチェックジョブを作成してBranch Protectionで指定したjobが通らないとマージできないようにする

はじめに

今回は指定したジョブが成功したかを監視するステータスチェックジョブを作成してBranch Protectionに指定する方法を紹介したいと思います。

複数のジョブがあったときに、一つでも失敗してしまうとマージができなくなるようにしていきます。

ワークフローの作成

今回は例として .NET用のテスト と TypeScript用のテスト を用意し、それらが成功するかを調べるジョブを作成します。

name: test
on: 
  workflow_dispatch:
  pull_request:

jobs:
  # .NETのテストを実行するジョブ
  test-dotnet:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Set up .NET8
        uses: actions/setup-dotnet@v4
        with:
          dotnet-version: '8.x'
      - name: restore
        run: dotnet restore
      - name: build
        run: dotnet build --no-restore
      - name: test
        run: dotnet test --no-build
        
  # TypeScriptのテストを実行するジョブ
  test-typescript:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Set up Node
        uses: actions/setup-node@v4
        with:
          node-version: 18
      - name: Install dependencies
        working-directory: ./TypeScriptTest
        run: npm ci
      - name: Run tests
        working-directory: ./TypeScriptTest
        run: npm test
  
  # needsに指定したjobが一つでも失敗した場合は失敗し、全て成功したときはスキップされる
  # requiredは 成功 or スキップ ならOK
  status-check:
      runs-on: ubuntu-latest
      needs:
        - test-dotnet
        - test-typescript
      if: failure()
      steps:
        - run: exit 1

テストを実行しているジョブは見なくてOKでして、以下のコードが今回注目したいジョブです。

# needsに指定したjobが一つでも失敗した場合は失敗し、全て成功したときはスキップされる
# requiredは 成功 or スキップ ならOK
status-check:
    runs-on: ubuntu-latest
    needs:
      - test-dotnet
      - test-typescript
    if: failure()
    steps:
      - run: exit 1

needsに監視対象のジョブ列挙します。あとはどれか一つでも失敗するとexit 1が呼ばれ、全て成功するとスキップされます。

Branch Protectionを作成する

static-checkジョブが成功したときのみマージできるようにBranch Protectionを設定してみたいと思います。

ブラウザのGitHubからSettings -> Code and automation -> BranchesよりAdd branch rulesetを選択します。

Add branch ruleset

Require status checks to passを有効にして、Status checks that are requiredAdd checksからジョブを選択します。

requiredに設定するジョブを選択

実験

プルリクエストを作成して、わざとテストを失敗させてみたり成功させたりしてみます。

成功した場合と失敗した場合