GitHubで複数種類のCI/CDサービスと連携時の必須ステータスチェックの動作を確認してみた

2020.06.04

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、CX事業本部の若槻です。

GitHubにはrequired status checks(必須ステータスチェック)という、指定のCI/CDにPassした時にのみブランチに変更を加えられるようにするブランチ保護の設定があります。

Required status checks ensure that all required CI tests are passing before collaborators can make changes to a protected branch.

今回は、GitHubで複数種類のCI/CDサービスと連携したRepositoryのPull Requestではこの必須ステータスチェックがちゃんと動作するのか?を確認してみました。

確認してみた

以下の3種類のCI/CDサービスに連携済みのRepositoryで確認を行ってみます。BranchへのPushによりそれぞれのサービス上でCIが実行されるように連携設定済みとなります。

  • GitHub Actions
  • CircleCI
  • Travis CI

参考までに、今回利用した各CI/CDサービスのコンフィグファイルは以下のようになります。

.circleci/config.yml

version: 2.1

orbs:
  python: circleci/python@0.2.1

jobs:
  build-and-test:
    executor: python/default
    steps:
      - checkout
      - run:
          name: build and test
          command: |
            pip install pipenv
            pipenv sync
            make lint test-unit
workflows:
  ci:
    jobs:
      - build-and-test

.github/workflows/config.yml

name: Workflow

on:
  push:

jobs:
  cicd:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v2

    - name: Set up Python
      uses: actions/setup-python@v2
      with:
        python-version: 3.7

    - name: Install dependencies
      run: |
        pip install pipenv
        pipenv sync
    - name: Lint and Test
      run: |
        make lint test-unit
    - name: Deploy to AWS
      if: github.ref == 'refs/heads/master'
      env:
        AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
        AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        AWS_DEFAULT_REGION: ap-northeast-1
      run: |
        make deploy

.travis.yml

language: python
python:
  - "3.7"
install:
  - pip install pipenv
  - pipenv sync
script:
  - make lint test-unit

Branchの必須ステータスチェックを有効化

事前の設定として、Branchの必須ステータスチェックを有効化して、すべてのCI/CDサービスでのCI/CDがPassした時のみPull RequestからmasterBranchへのMergeが可能となるようにするブランチ保護ルールを作成します。

Repositoryの[Settings]タブ - [Branches] - [Branch protection rules]で[Add rule]をクリックします。 5afaaf88-a634-4dd6-9e90-6773905375a5.png

[Branch name patter]でmasterを入力します。 [Require status checks to pass before merging]および[Require branches to be up to date before merging]にチェックを入れ、必須条件とさせたいCI/CDの実行にチェック入れます。[Save changes]をクリックします。 75f5db46-7d00-4f87-a876-6a47e879f0f9.png

masterBranchに対するブランチ保護ルールを作成できました。 a946827d-ed24-4c6a-a5ff-2a19aab973c6.png

必須ステータスチェックの動作の確認

必須ステータスチェックの動作を確認していきます。

まず、いずれかのCI/CDが失敗するCommitの場合です。

作業用BranchでのCommitをPushしたら、masterBranchへのMergeを行うPull Requestでの各CI/CDサービスのステータスが実行中となります。 c592048a-7496-4b1b-990b-b9af95c989b1.png

実行が完了し、GitHub ActionsとTravis CIがPass、CircleCIがFailという結果となりました。この状態だと[Merge pull request]をクリックしても、 07157cdb-4cab-4a26-814c-dc67b49f0999.png

一部のCI/CDがFailしているためmasterRepositoryへのMergeができず、[Confirm merge]ボタンも押せません。 ddda0c7b-4670-44fe-a431-7765d3187d8a.png

次に、すべてのCI/CDがPassするCommitの場合です。

CommitをPushすると同Pull RequestですべてのCI/CDが実行中のステータスとなった後に、 82a09e81-d9b7-44c6-a8f8-f70adb7673ba.png

すべてのCI/CDがPassしてAll checks have passedとなり[Merge pull request]がクリック可能となりました。クリックしてみます。 f9629d60-79f6-4bb0-964e-134f420d5a56.png

Merge可能となったので[Confirm merge]もクリック可能となっています。 3b29f83c-543d-4dcd-a431-dc94f54745d8.png

おわりに

GitHubで複数種類のCI/CDサービスと連携したRepositoryのPull Requestでの必須ステータスチェックの動作を確認してみました。

複数種類のCI/CDサービスと連携した場合でも、必須ステータスチェックの機能は1種類の場合と同じように使用できることが分かりました。

必須ステータスチェックやブランチ保護の設定は既定では無効となっているので今後は積極的に有効化して活用していきたいです。

参考

以上