DangerとGitHub ActionsでPull Request時に最低限のレビューを自動化する


概要

チーム開発において Pull Request 時のコードレビューは必要不可欠です。
コードレビューにはもちろん、レビューワーの工数がかかります。
そこで、レビューワーの負担を少なくするために、
GitHub ActionsDanger で必要最低限のレビューを自動化し、本質的な部分のみ
レビューワーがチェックするようにしたいと思います。

実装

ディレクトリ構造例

tree
danger-github-actions
├── .eslintrc.js
├── .github
|  └── workflows
|    └── actions.yml
├── src
|  ├── greeting.js
|  └── greeting.test.js
├── dangerfile.js
├── package.json
└── yarn.lock

Danger

dangerfile.js をルートディレクトリ配下に作成します。
DangerTypeScript にも対応しているため、 dangerfile.ts としても問題ありません。

danger.js
let isAllCheckPassed = true;

if (danger.github.pr.title.includes('[WIP]')) {
  fail("Should NOT inclued 'WIP' in your PR title");
}

if (!danger.github.pr.assignee) {
  warn("Should select PR reviewer");
  isAllCheckPassed = false;
}

const hasIssuesNumber = /#[0-9]/.test(danger.github.pr.title);
if (!hasIssuesNumber) {
  warn("Should include issues number in your PR title");
  isAllCheckPassed = false;
}

const diffSize = Math.max(danger.github.pr.additions, danger.github.pr.deletions);
if (diffSize > 500) {
  warn("Should reduce diffs less than 500");
  isAllCheckPassed = false;
}

if (danger.github.pr.changed_files > 10 ) {
  warn("Should reduce change files less than 10");
  isAllCheckPassed = false;
}

if (isAllCheckPassed) markdown('## All checkes have passed :tada:')

チェック項目

  • PR タイトルに'[WIP]'が含まれていないか
  • レビューワー(assignree)が選択されているか
  • PR タイトルにIssues番号(ex. #123)が含まれているか
  • 追加行と削除行の合計が500行以下か
  • 編集ファイル数が10ファイル以下か

fail() を呼び出すと ci は失敗し、マージできないようになります。
warn() の場合は警告を表示しますが、マージは可能です。

今回は使用していませんが message() でメッセージ表示ができます。
markdown() とすることで markdown にも対応できます。

package.json

GitHub Actions で実行したいコマンドを package.json に登録しておくと良いでしょう。

package.json
{
  "scripts": {
    "lint": "eslint --ext .js ./src",
    "test": "jest",
    "danger": "danger ci"
  }
}

actions.yml

GitHub Actions で実行したい workflow を記述します。

.github/workflows/actions.yml
name: actions
on: [pull_request]

jobs:
  actions-ci:
    runs-on: ubuntu-latest

    steps:
    - name: Checkout Repository
      uses: actions/checkout@v2

    - name: Prepare Node Env
      uses: actions/setup-node@v1
      with:
        node-version: '12.x'

    - name: Install yarn
      run: npm i -g yarn

    - name: Install Dependencies
      run: yarn

    - name: Run ESLint
      run: yarn lint

    - name: Run Jest
      run: yarn test

    - name: Run Danger
      run: yarn danger:ci
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

実行結果

Pull Request を作成すると GitHub Actions が実行され、
下記のように結果がコメントとして投稿されます。

最後に

ESLint のように設定をカスタマイズすることができます。
Pull Request 作成時にもチームとしてルールを設けて見てはいかがでしょうか ☺️

refs