dangerをCircleCI上で使ってPull Requestを精査する

# Dangerとは

Dangerとは、ざっくり言うと、PRのレビューをするときに、"You Forgot To...(...するのを忘れてませんか？）"と指摘するのを自動化するツールらしいです。

似たようなツールとして、以前から [packsaddle/ruby-saddler](https://github.com/packsaddle/ruby-saddler) を使っていたのは、 [Androidのコードを自動で解析し、GitHubのpull requestにコメントする - Qiita](http://qiita.com/noboru_i/items/2f30296db1c8a6dfbd9b) にも書いていました。

[Android開発のコードレビューbotを乗り換えた話 - クックパッド開発者ブログ](http://techlife.cookpad.com/entry/2017/06/28/190000) を読むと、クックパッドさんもDokumiから乗り換えたということで、使ってみました。（ミーハー）
（ミーハーついでに、fastlaneとか作ってる Felix Krauseさんが絡んでる？というのも、やってみた要因の一つ）

上記のブログにもDokumi時代の問題点が書かれていましたが、私がSaddlerを使っていて感じている問題点は下記の通りです。
（Saddler自体の問題点じゃない気もします。）

- シェルスクリプトで実行しているので、メンテしづらい。（シェル力が足りない）
- プラグイン機構が（たぶん）無いため、シェルのパイプで繋げていく必要がある（シェル力が足りない）
- checkstyle formatで出力できないものは、自分で変換しなければならない（無いものが多かったので、必要なものは作った https://rubygems.org/profiles/noboru_i ）

このあたりが、Dangerを使うことで楽になれば、本格的に乗り換えていこうかと思います。

# 試してみる

個人のAndroidプロジェクトに適用してみました。
https://github.com/noboru-i/SlideViewer

状況としては、下記のような感じ。

- アプリはすでに一通り出来ている
- CircleCIでのビルドもやってる
- Rubyのツールとかは使ってない

最終的な差分としては、 https://github.com/noboru-i/SlideViewer/pull/62/files の通りです。

## Ruby関連の設定、Danger gemの追加

まずは、 `bundle init` することで、 `Gemfile` の雛形を作成します。
作成された `Gemfile` に、 `gem 'danger'` を追加します。
`bundle install --path vendor/bundle` を実行し、
`.gitignore`に `/.bundle/` と `/vendor/bundle` を追加しました。

## CircleCIでの実行の設定

`circle.yml` を下記のようなイメージで編集します。

```yaml
machine:
  ruby:
    version: ruby-2.4.1
test:
  override:
    - bundle exec danger
```

## Dangerfileの追加

[クックパッド開発者ブログ](http://techlife.cookpad.com/entry/2017/06/28/190000)を参考に、とりあえずすぐにチェックが終わりそうなチェックを追加してみます。

```rb
# 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?
```

## 動かしてみる

まずは、そのままPUSHしてみました。
https://circleci.com/gh/noboru-i/SlideViewer/137

![image.png](https://qiita-image-store.s3.amazonaws.com/0/8708/80bdaddf-ad23-06d9-5712-12e84925bbc3.png)

Pull Requestが作成されていないと動かないようです。

次に、Pull Requestを作成し、Rebuildしてみます。
（昔はrebuildしても、 CI_PULL_REQUEST などが設定されて無かった気がしますが、今は設定されてるようですね。）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/8708/97167ee8-809d-bf4a-6753-c0b68c8376f4.png)

まずはmilestoneとassigneesが無いと怒られます。

で、assigneesを設定しただけだと、もちろんこのまま。（CircleCIが動かないので、dangerは動かないですね。）

次に、CircleCI上でRebuildしてみました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/8708/33f41d02-ee42-85d8-b32a-dfa8afd65d4e.png)

コメントは1つのままで、コメントの内容が修正されてますね。

# 感想

導入自体は簡単にできました。

また、他の記事を見ていても、Rubyのコードで書かれているので、プラグインなどもかんたんに追加できそうです。
GitHub上の情報もかんたんに扱えそうなので、そこのチェックもいろいろできそうですね。
（特定のファイルパスの差分があったときに、スクリーンショットが貼られているかをチェックする、など）

社内への周知とか、それぞれの案件の都合もあるので、案件単位で順次、という感じかなぁと。
比較的軽そうな、「WIP付いたまま」とか「変更差分大きすぎ」とかだけ入れて様子を見る、ってのも良さそうかな。

# 参考リンク

[Android開発のコードレビューbotを乗り換えた話 - クックパッド開発者ブログ](http://techlife.cookpad.com/entry/2017/06/28/190000)
[Dangerで効率よくPR駆動開発 | Recruit Jobs TECHBLOG](https://techblog.recruitjobs.net/development/danger_driven_development)
[Dangerで始めるPull Requestチェック自動化 - コネヒト開発者ブログ](http://tech.connehito.com/entry/danger)
[Dangerでpull requestレビューの指摘事項を減らす](https://www.slideshare.net/ShunsukeMaeda/dangerpull-request)