みなさんこんにちは!
Railsエンジニアをやっとります、高久田(たかくだ)です。
今回は機械的なレビューを自動で行ってくれるDangerというgemを最近弊社でも導入したので、その時のお話をさせてください…
Dangerってそもそも何?
DangerのGithubには以下のことが書かれています
Stop saying "you forgot to …" in code review Formalize your Pull Request etiquette.
「あなたは〜をやることを忘れているよ。」ということをやめる。
プルリクエストの礼儀作法を形式化
つまり
「プルリクエストの礼儀作法を形式化し、指摘を自動化する」ための便利なgemです
導入背景
チーム開発をしていると、そのチームごとにプルリクエストの書き方の決まりやルールなどができてくると思います。例えば
- テストは必ず書きましょう
- レビューしてもらいたい時はWIPを外しましょう
- labelを必ずつけましょう
- 変更が多い場合はプルリクエストを分けましょう
…などなど
もちろん弊社でも上記のようなルールがあったのですが、
- テストを書いていなかったり
- WIPつけっぱなしのままレビュー依頼出しちゃったり
- labelつけ忘れてたり
- 1つのプルリクエストでの変更が多すぎたり
…などなどが発生しており、そのようなプルリクエストが上がるたびに同じ指摘を繰り返していました。
しかし、上記で上げたような指摘って誰にでもできるものですよね? いちいち同じ指摘する工数も工数なので自動化しよう!!というのがきっかけです
Danger導入
Circle CiでDangerを実行し、プルリクエストに自動でコメントします
Gemfileの設定
source "https://rubygems.org" gem 'danger'
Gemfile編集後に'bundle install'コマンドを実行します
Dangerfile設定
'bundle exec danger init'コマンドを実行します
'danger init'を実行すると初期セットアップ実行され、'Dangerfile'が作成されます。
'Dangerfile'としてはクックパッド開発者ブログを参考に以下のように編集しました。
# ===== PR title ===== warn('PR is classed as Work in Progress') if github.pr_title.include? '[WIP]' # ===== diff size ===== warn('PRの変更量が多すぎます。PRを分割しましょう!') if git.lines_of_code > 500 # ===== Test ===== raise('テストが書かれていません!') if `grep -r fdescribe specs/ `.length > 1 raise('テストが書かれていません!') if `grep -r fit specs/ `.length > 1 # ===== Label ==== labels = github.pr_labels warn('labelを選択してください!') if labels.empty?
- WIPがつけっぱなしのとき
- プルリクエストの変更差分が多すぎるとき
- テストが書かれていないとき
- labelをつけていないとき
に自動でレビューを行ってくれる設定です。
'Dangerfile'を作成すると長文の説明文が流れてくるので、読みつつ、設定しつつenterで進めていきます
- Step1 'Dangerfile'を作成しましたというメッセージ
- Step2 bot用のGithubアカウントの作成を促されます。
'Danger'からプルリクエストに対してコメントの書き込みが行われるので、そのためのアカウントを作成しておくと良いです。
- Step3 botアカウントでアクセストークンを作るように、と言われます。
リポジトリにアクセス可能なアカウントでAPI トークンを作成します。
個人のアカウントでも問題はないのですが、bot用のアカウントだと機械的に指摘されたコメントというように区別できてわかりやすいです
- Step4 Ciの設定を行います。
詳しい案内はないのでGetting Set Upを参照します
Ciのsettingsで対象のリポジトリのAPI permissionsにトークンを登録します。
'.circleci/config.yml'に以下のように追記します
- run: name: Run Danger file command: bundle exec danger --verbose
最後に!
Circle Ciでdangerを使う場合は 'Only Build pull requests'を有効にし、プルリクエスト作成時のスキップを回避してください
これで設定は終了です。
プルリクエストをWIPつけっぱなしで作成するとちゃんと指摘してくれてますね!
まとめ
このような感じで誰でもできるようなレビューはdangerにまかせて、本当にレビューする必要がある箇所に意識が集中できるようにどんどんしていきたいですね!