MENU

[Github Actions]Branch protection「status check」用のJobを作ってみる

目次

概要

Github のBranch protection 「Require status checks to pass before merging」に設定するstatus check用のjobを作成すると良さそう という話。

動機

Github のBranch protection には、「Require status checks to pass before merging」というruleがある。

公式:ステータスチェックについて

If status checks are required for a repository, the required status checks must pass before you can merge your branch into the protected branch.

引用元:ステータスチェックについて

という記載の通り、 Branch protection ruleにstatus checkを設定すれば、 status check を通過しない限り、保護対象のブランチに対して作業ブランチがマージできないように保護することができる。

status checkの設定方法は以下の通り。

  1. Repository > Setting > Branches > Add rule or 既存ruleのedit をクリック。rule 設定ページに遷移
  2. Protect matching branches > Require status checks to pass before merging にチェックを入れて、 「Search for status checks in the last week for this repository」のフォームから、status check に使用するjob を指定する

上記の通り、

status-check は、workflowのjob単位で指定する必要がある。

例えば、以下のようなGithub Actoinsのworkflowファイルを作成済みの場合、

name: status-check
on:
  workflow_dispatch:
  pull_request:

jobs:
  eslint:
    name: eslint
    runs-on: ubuntu-latest
    permissions:
      contents: read
      pull-requests: write
    steps:
      - uses: actions/checkout@v4
      # see https://github.com/reviewdog/action-eslint
      - uses: reviewdog/action-eslint@v1
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }}
          workdir: './src/'
          eslint_flags: 'resources/**/*.{js,ts}'
          fail_on_error: true

jobs > eslintを指定したい場合、以下の通り設定する必要がある。

これを設定すると、 保護対象のブランチ向けに作成されたpull requestは、

jobs > eslint がpassしない限り、マージできなくなる。

例えば、以下のような感じ。

「Require status checks to pass before merging」のProtection Ruleの使い方は上記の通りだが、

このRuleは、記載した通り

status-check は、workflowのjob単位で指定する必要がある。

そのため、status-check にステータスチェック対象を追加したくなった場合、
「Require status checks to pass before merging」のProtection Ruleに、チェック対象のjobを追加する必要がある。

例えば、ステータスチェック用のjob「php-cs-fixer」を追加する場合を考える。

まずは、jobを作成。

jobs:
  php-cs-fixer:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4
      - name: Set up PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: '8.2'
      - name: Install dependencies
        run: |
          cd src
          composer install
      - name: Run PHP CS Fixer
        run: |
          cd src
          composer run cs-fixer-dry-run

で、以下の通り、チェック対象のjobを

Protect matching branches > 「Require status checks to pass before merging」 から追加する必要がある。

これが面倒だなと思っていました。

ソースだけで完結できればと思っていましたが、以下記事を見つけまして。

GitHub Actions による Renovate の安全自動マージ _5. status check 用の GitHub Actions job を用意する

まさに、これを解決する記事でした。

(元々、Renovateをいい感じに使う方法を探していて見つけた記事です)

上記の記事を読めば事足りる内容ではありますが、 実際に動きを確認してみたので、今回記事にしました。

(前置きが長い)

成果物

以下を設定していきます。

  • worflowファイルの作成
  • Branch protection の設定

1. workflow

name: status-check

on:
  workflow_dispatch:
  pull_request:

jobs:
  eslint:
    name: eslint
    runs-on: ubuntu-latest
    permissions:
      contents: read
      pull-requests: write
    steps:
      - uses: actions/checkout@v4
      # see https://github.com/reviewdog/action-eslint
      - uses: reviewdog/action-eslint@v1
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }}
          workdir: './src/'
          eslint_flags: 'resources/**/*.{js,ts}'
          fail_on_error: true

  php-cs-fixer:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4
      - name: Set up PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: '8.2'
      - name: Install dependencies
        run: |
          cd src
          composer install
      - name: Run PHP CS Fixer
        run: |
          cd src
          composer run cs-fixer-dry-run

  # needsに指定したjobが一つでも失敗した場合、exit 1(失敗する)
  status-check:
    runs-on: ubuntu-latest
    needs:
      - eslint
      - php-cs-fixer
    if: failure()
    steps:
      - run: exit 1

ポイントはstatus-check のjobです。

このjobは、

「needsで設定したjob(eslintphp-cs-fixer)が失敗したら、status-checkのjob自体を失敗として処理する」というものです

仮に、status-checkしたいjobをが増えた場合には、以下手順になります。

1)workflowファイル内に、jobを新規で追加

2)status-check のneedsに「1)」のjobを追加する。

Branch protection側の変更が不要なのが嬉しい。

2. Branch protection の設定

「1. workflow」で作成したworkflowファイルのstatus-check のjobを指定します。

必要な設定は以上。


上記の通り設定後、保護対象ブランチ向けにpull requestを作成すると…

上記の通り、

php-cs-fixer のjobが失敗したために、

status-check のjobが失敗して、マージができなくなっていることが確認できました。

(蛇足ですが)

ついでに、

Repository > Github Actionsのstatus-check のworkflowを確認してみると

以下キャプチャのようになっています。

この表示、時々見かけたけどやっと意味が分かりました。

workflow内の主従関係?を表している図なんですね。

今回の場合で言うと、php-cs-fixer のjobが失敗してることに引っ張られて、status-check のjobも失敗しています。

と言う意味ですね。

副次的に勉強になりました。

感想

また一つ新しいことを知ることができた。

楽しい。嬉しい。

参考

https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/collaborating-on-repositories-with-code-quality-features/about-status-checks

https://zenn.dev/shunsuke_suzuki/articles/renovate-auto-merge-github-actions#5.-status-check-用の-github-actions-job-を用意する

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

目次