GitHubのブランチ保護の設定

Arata Kurokawa
nextbeat-engineering
9 min readOct 12, 2021

はじめまして

ネクストビートでWebエンジニアとして働いている黒川と申します。
ネクストビートは今年6月入社で、6月下旬からキズナコネクトというサービスの開発を担当しています。

今回はGitHubブランチ保護の下記の機能について紹介したいと思います。

  1. ステータスチェック
    lintが成功しているかのチェック
    baseブランチの最新が取り込まれているかのチェック
  2. レビュー必須

1. ステータスチェック

この機能はマージする前にいくつかのステータスをチェックをして、
全て合格しないとマージできないようにする設定です。

例えば

  • lintが成功していないとマージできない
  • testコードが成功していないとマージできない

ということができます。

全て合格しないと下記のように赤くなりマージできないようになります。

チェック項目が複数あり一部失敗している場合は下記のようになります。

● lintが成功しているかのチェック

PCのローカル環境でチェックしているとチェック漏れが発生しますし、
手間なので自動でチェックすることで、漏れをなくし作業効率を上げることができます。

今回は例としてGitHub Actionsでeslintを実行をします。
eslintが成功しないとdevelopへマージできないようにしていきます。

ⅰ. GitHub Actionsの実行

はじめに.github/workflows/eslint.yamlを作成します。

name: eslinton:
pull_request:
types: [opened, synchronize, reopened]
branches: [ develop ]
jobs:
eslint:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [12.16.3]
steps:
# 対象のブランチをチェックアウト
- name: Checkout target branch
uses: actions/checkout@v2
# nodejsのセットアップ
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v1
with:
node-version: ${{ matrix.node-version }}

# ライブラリのインストール
- name: npm install
run: npm install
# lintの実行
# package.jsonのscriptにlintを定義しておく
- name: npm run lint
run: npm run lint

developがbaseブランチであるPRの作成、再開、pushされた場合にGitHub Actionsが実行されます。

onでどのタイミングでGitHub Actionsを実行するか定義できます。

on:
pull_request:
types: [opened, synchronize, reopened]
branches: [ develop ]

yamlファイルをpushしてPRを作成するとGitHub Actionsが実行されます。

ⅱ. ステータスチェックの設定

上記でGitHub Actionsを実行できるようにしたので、lintが失敗していたらマージできないよう設定をします。

ブランチ保護の設定は下記の「Settings -> Branches」から設定できます。
Settingsはリポジトリのオーナーのみ閲覧・編集が可能です。

はじめにAdd ruleから作成画面に遷移しBranch name patternにdevelopと入力してルールを作成します。

次にスターテスチェックの設定を行います。
Require status checks to pass before merging」という項目があるのでチェックします。
GitHub Actionsが1度実行されていれば、下記のようにリストが表示されるので該当のものにチェックをします。

上記の設定をするとeslintが成功しないとマージできないようになっています。

● baseブランチの最新が取り込まれているかのチェック

下記のような場合にマージできないようにします。

最新を取り込むことが必須なので、最新のコードで動作確認することができます。
テストコードを実行している場合は、必ず最新のコードでテストすることができます。

Require branches to be up to date before merging」という項目があるのでチェックすると設定できます。

2. レビュー必須

この機能は特定の人数に承認されないとマージできないようにできます。

承認はFile changed -> Review changesからできます。

設定は「Require pull request reviews before merging」という項目があるのでチェックすればよいです。

Required approving reviews」 ドロップダウンメニューから承認人数を設定できます。

以上、GitHubブランチ保護の機能紹介でした。

コラム

先程紹介したlintチェックですが、lintをより効率的に実行するようにします。

改善点

  • 毎回npm installでライブラリをダウンロードしていますが、cacheすることでnpm installの時間が短縮できます。
jobs:
eslint:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [12.16.3]
steps:
# 対象のブランチをチェックアウト
- name: Checkout target branch
uses: actions/checkout@v2
# nodejsのセットアップ
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v1
with:
node-version: ${{ matrix.node-version }}
# キャッシュ
- name: cache node_modules
uses: actions/cache@v2
id: node-modules-cache
with:
path: node_modules
key: ${{ runner.os }}-npm-${{ hashFiles('package-lock.json') }}
restore-keys: |
${{ runner.os }}-npm-
# ライブラリのインストール
- name: npm install
run: npm install
# lintの実行
# package.jsonのscriptにlintを定義しておく
- name: npm run lint
run: npm run lint

「cache node_modules」をstepsに追加しました。
キャッシュはkeyで管理していて次回実行するときにキャッシュを取得します。
もしキャッシュがなければrestore-keysに設定しているものと前方一致した最新のキャッシュを取得します。

ここまで読んでいただきありがとうございました!

We are Hiring!

株式会社ネクストビートでは

「人口減少社会において必要とされるインターネット事業を創造し、ニッポンを元気にする。」
を理念に掲げ一緒に働く仲間を募集しております。

バックエンドにはPlay Framework(言語はScala)、フロントエンドの開発には主にAngularを用いています。フルスタックに開発したい!という方のご応募をお待ちしております。

--

--