モバイル開発で利用しているコードレビューbotを最近乗り換えた話をします。
コードレビューbotとは
コードレビューbotはPull Request(以下PR)に対して、静的解析した結果などをコメントする機能を持つプログラムの事を指します。 コードレビューbotを導入すると、些末な内容はbotが勝手に指摘してくれるため、レビューワーがより重要な内容のレビューに時間を使うことが期待できます。 有名なサービスにHoundやSideCIなどがあります。
Android開発でのレビューbotの役割
CookpadのAndroid開発では、下記の項目をPR毎に実行しています。
- PRのマイルストーンチェック
- FindBugsを利用した静的解析
- AndroidLintを利用した静的解析
- license-tools-pluginを利用したOSSライセンス情報のチェック
- アプリのビルド
- deploygateへの配信
今まではこれら全てをDokumiと呼ばれるツールで行っていました。(上記の通りDokumiではコードレビューだけではなくdeploygateへのアップロードなども受け持っていたため、 コードレビューツールと呼ぶのが適切かもしれません)
Dokumi時代
CookpadのiOS/Android開発では、自社製のDokumiというレビューbot(レビューツール)を長年愛用してきました。詳しくは下記のエントリに紹介されています。
Dokumi (日本語)
長い間お世話になってきたDokumiも、利用していく間にいくつか問題点が生まれました。
- 依存関係が難しい
- OSSであるdokumiと社内で利用しているdokumi-cookpad-customというmoduleの関係性が複雑だった
- セットアップが難しい
- デプロイ手順が煩雑(gemifyされていない)
- Dokumi以外の仕組みで動かしてる機能もあり、それらを統合したい
- Dokumiはプラグイン機構がなく機能追加が容易ではない
- dokumiの設定がAndroidの開発レポジトリと別で扱いづらかった
- dokumi-cookpad-customレポジトリ内に設定が管理されていた
このような理由で、iOSの開発チームが@giginetを中心にDangerへの乗り換えを進めていました。 それに続くようにAndroid開発の環境もDangerに移行する運びになりました。 Android版Cookpadのアプリの開発環境をDokumiからDangerに移行する作業は@_litmon_が対応してくれました。
Dangerの特徴
Danger - Stop Saying "You Forgot To…" in Code Review
- Ruby製
- 多くのCIシステムをサポートしている
- 多くのコードホスティングサービスをサポートしている
- 設定を
Dangerfile
としてレポジトリに含める
コアは小さく、様々な機能はプラグインによって提供されています。 Dangerのプラグインは充実しているとはいえませんが、iOS環境は比較的揃っている印象です。Android関連ではFindBugs,AndroidLint,JUnitのプラグインがあります。
pluginの作成
DokumiからDangerへ移行するに当たりfindbugsプラグインがDanger側に無かったため、findbugs-dangerを作成しました。 Dangerはpluginのテンプレートをコマンドラインで作成できるなどサポートが手厚く、下記の記事を読み進めていくとrubyやruby-gemsのエコシステムに詳しくなくてもハードルは高くない印象でした。
Dangerの導入
導入手順は下記のページにまとめられていますが、簡単に紹介します。
Dangerはgemとして公開されています。gem install danger
としても利用できますが、bundlerを経由した利用が推奨されているのでGemfile
をプロジェクト直下に用意しましょう。
# frozen_string_literal: true source "https://rubygems.org" gem 'danger'
danger init
を実行すると初期セットアップが行われDangerfile
が作成され、セットアップウィザードのようなものが表示されます。
bundle install
bundle exec danger init
ひたすら長文のメッセージが流れてくるので、enterで進めていきましょう。
- Step 1は
DangerFile
を作成したというメッセージが表示されます。 - Step 2はbot用のGithubアカウントを作成を促されます。クールなアイコン画像の設定をすることを忘れてはいけません。
- Step 3でbotアカウントでアクセストークンを作るように言われます。Publicなレポジトリの場合
public_repo
の権限だけで問題ないそうです。 - Step 4でCI側の設定を求められますが、詳しい案内はないので、setting-up-danger-to-run-on-your-ciを見ると良さそうです。
- 全てのセットアップが完了したら、CIから
bundle exec danger
を実行する様にセットアップしましょう。
danger init
で作成されるDangerFile
はとてもシンプルなので必要に応じてカスタマイズしましょう。導入に成功するとbotがPRに対してコメントを投げてくれるようになります。
※ FindBugsの結果からdangerが指摘した例
CookpadのDangerfile
2017/6末地点で、Android開発で利用しているDangerfile
を公開します。導入の際はぜひ参考にしてください。
#### # # github comment settings # #### github.dismiss_out_of_range_messages #### # # for PR # #### if github.pr_title.include? "[WIP]" || github.pr_labels.include?("WIP") warn("PR is classed as Work in Progress") end # Warn when there is a big PR warn("a large PR") if git.lines_of_code > 300 # Warn when PR has no milestone warn("A pull request must have a milestone set") if github.pr_json["milestone"].nil? # Warn when PR has no assignees warn("A pull request must have some assignees") if github.pr_json["assignee"].nil? #### # # Findbugs # #### findbugs.report_file = "your_module/build/reports/findbugs/findbugs.xml" findbugs.gradle_module = "your_module_name" findbugs.report(true) #### # # Android Lint # #### android_lint.gradle_task = "your_module:lint" android_lint.report_file = "your_module/build/reports/lint/lint-result.xml" android_lint.filtering = true android_lint.lint(inline_mode: true)
まとめ
Cookpadにおけるコードレビューbotの役割や、ツールを乗り換えた経緯、Dangerの特徴などを紹介などをしました。コードレビューbotをもし導入されていないのであればDangerはおすすめ出来ます。手軽にセットアップが可能なのでぜひお試しください。