[GitHub] ルールセットで指定の GitHub Actions ジョブのステータスチェックをマージ条件にする

2024.06.26

こんにちは、製造ビジネステクノロジー部の若槻です。

GitHub でブランチやタグを保護できる機能である ルールセット では、GitHub Actions などのステータスチェックのパスを必須とするルールを設定できます。

ステータスチェックを必須化させる方法は以前にこちらの DevelopersIO ブログで紹介されていましたが、現在はメニュー等に若干のアップデートがあったため、本記事で再度ご紹介をします。

ルールセットとは

しばらくの間ベータ提供だったルールセット(Rulesets)ですが、2023 年 7 月に一般提供されました。

※ちなみにルールセットは「リポジトリルール(Repository rules)」とも言うらしいが、この名称はドキュメントではあまり使われていない。

今までも「ブランチ保護(Protected branch)」機能はありましたが、ルールセットではより柔軟な設定により様々なユースケースに対応するルールを作成可能となっています。

ルールセットでステータスチェックを必須化する

ルールセットは[Settings > Rules > Rulesets]から管理できます。

作成されたルールセットです。ルールをバイパスする条件やターゲットなるブランチを柔軟に設定できます。

そしてブランチ保護用のルールをいくつかの選択肢からオプションでルールセットに適用でき、このうち[Require status checks to pass]を設定することによりステータスチェックを必須化できます。

まずは下記のような check1 および check2 という名前のジョブを持つ GitHub Actions ワークフローでステータスチェックを設定してみます。check1 は必ず失敗するようにしています。

.github/workflows/pull-request-status-check.yml

name: Pull Request Status Check
on:
  pull_request:
    types:
      - opened
      - synchronize
      - reopened

jobs:
  check1:
    runs-on: ubuntu-latest

    steps:
      - name: something test1
        run: exit 1

  check2:
    runs-on: ubuntu-latest

    steps:
      - name: something test2
        run: exit 0

さてルールセットの[Require status checks to pass]メニューを設定する際には過去のチェック実行履歴を検索して、その中から必要なステータスチェックを選択できます。現状は上記のワークフローが未実行なので check1 および check2 は選択できません。

Pull Request を作成してワークフローを実行させます。この時点ではステータスチェックを必須化していないので、一部のステータスチェックが失敗していいてもマージは可能です。

再度[Require status checks to pass]メニューからチェック履歴を検索すると、今度は check1 および check2 が選択可能になっています。

check1 および check2を必須のステータスチェックとして設定しました。ルールセットを忘れずに保存します。

Pull Request に戻ると、ステータスチェックに Required マークが表示され、またマージボタンが無効化されており、GitHub Actions ジョブのステータスチェックがパスしていることがマージ条件として必須化されていることが確認できました。

その他

ステータスチェックのソースが不安定な場合がある

[Require status checks to pass]メニューで、GitHub Actions のジョブをステータスチェックに指定した場合はソースとして GitHub Actions と表示されますが、たまに一部もしくは全部が Any source と表示されることがありました。

ブランチ保護の挙動自体には影響はないようですが、メニュー上での表示が不安定となる場合があるようです。

実行履歴に無いステータスチェックも追加は可能

先ほどの例では、check1 および check2 というステータスチェックが実行履歴に存在しているため、それらを選択することができました。しかし実行履歴に無いステータスチェックも条件として追加することは可能です。

[Require status checks to pass]メニューで check3 というステータスチェックを検索するとヒットはしませんが Any source として追加することは可能です。

この時点で check3 というステータスチェックは条件ではあるが実際には存在しないため、他の必須のステータスチェックがパスした場合でもマージができなくなります。

実際にワークフローにジョブとして実際に check3 を追加します。

.github/workflows/pull-request-status-check.yml

jobs:
  check1:
    runs-on: ubuntu-latest

    steps:
      - name: something test1
        run: exit 0

  check2:
    runs-on: ubuntu-latest

    steps:
      - name: something test2
        run: exit 0

  check3:
    runs-on: ubuntu-latest

    steps:
      - name: something test3
        run: exit 0

Pull Request を改めて作成すると、check3 が追加されたことでマージが可能となりました。

おわりに

GitHub のルールセットで指定の GitHub Actions ジョブのステータスチェックをマージ条件にする方法をご紹介しました。

チームで開発をする際には、コードの品質を保つためにステータスチェックを必須化することは非常に重要です。ぜひご活用ください。

以上