Android の開発環境へ Danger を導入するメモ [GitHub x Bitrise 編]

これは GitHub のプルリクエスト時に CI（[Bitrise](https://www.bitrise.io)）上で [Danger](https://danger.systems/ruby/) を動かし結果をプルリクエストへ書き込む、という仕組みを Android の開発環境へ導入する手順のメモです。

#### 動作イメージ

![スクリーンショット_2019-01-07_18_23_22.png](https://qiita-image-store.s3.amazonaws.com/0/35733/12c9f010-7c2d-d84a-4735-5c301c214177.png)

# Dangerfile の作成

## A. Bundler で Danger を管理しない場合

#### 1. 作業用の Mac に Danger をインストール

`$ sudo -s gem danger`

#### 2. Dangerfile の作成

Android プロジェクトのルートへ移動して、

`$ danger init`

[ENTER] キー連打で `Dangerfile` ファイルが生成される。

> 作業用 Mac で Danger を動かさないなら手動で `Dangerfile` ファイルを作成しても良さそう..

## B. Bundler で Danger を管理する場合

#### 1. 作業用の Mac に Bundler をインストール

`$ sudo -s gem install bundler`

#### 2. 作業用の Mac に Danger をインストール

Android プロジェクトのルートへ移動して、

`$ bundle init`

`Gemfile` ファイルが生成されるので、Danger gem を追記

```diff:Gemfile
# frozen_string_literal: true

source "https://rubygems.org"

git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }

# gem "rails"
+ gem "danger"
```

追記したら、

`$ bundle install --path vendor/bundle`

> `vender/bundle` は Git 管理下に置きたくないので .gitignore に追記しておく。`.bundle/config` と `GemFile.lock` も生成されるが、それらはそのまま Git 管理下に置いておく。

#### 3. Dangerfile の作成

`$ bundle exec danger init`

[ENTER] キー連打で `Dangerfile` ファイルが生成される。

## 動作確認用に Dangerfile を修正

上記 A または B の手順で `Dangerfile` を作成したら、動作確認用に `message "Hello World!"` と追記する。（既存の他の行はコメントアウト。）

```ruby:Dangerfile
# Sometimes it's a README fix, or something like that - which isn't relevant for
# including in a project's CHANGELOG for example
# declared_trivial = github.pr_title.include? "#trivial"

# Make it more obvious that a PR is a work in progress and shouldn't be merged yet
# warn("PR is classed as Work in Progress") if github.pr_title.include? "[WIP]"

# Warn when there is a big PR
# warn("Big PR") if git.lines_of_code > 500

# Don't let testing shortcuts get into master by accident
# fail("fdescribe left in tests") if `grep -r fdescribe specs/ `.length > 1
# fail("fit left in tests") if `grep -r fit specs/ `.length > 1

message "Hello World!"
```

ここまで出来たら、追加したファイル類と共に `Dangerfile` ファイルをリモートの GitHub へプッシュしておく。（プルリク先のブランチに `Dangerfile` ファイルが存在している必要がある。）

# GitHub で Personal access tokens を発行

GitHub の個人アカウントの設定画面で、

![スクリーンショット_2019-01-07_17_29_23.png](https://qiita-image-store.s3.amazonaws.com/0/35733/b6c731e3-4069-9312-cc84-b4e6a627fa28.png)

作成したトークンの文字列は、後で利用するので控えておく。（この時点で控えておかないと後からは参照できないので、忘れた場合はトークンを再生成する。）

> 個人アカウントで Danger のコメントがプルリクに書き込まれるのが嫌な場合は、ボット用の GitHub アカウントを用意してトークンを作成する。

# Bitrise 側の設定

ワークフローの画面で環境変数 `DANGER_GITHUB_API_TOKEN` を定義する。値は控えておいたトークンを記載。

![スクリーンショット_2019-01-07_17_51_39.png](https://qiita-image-store.s3.amazonaws.com/0/35733/aaeb3553-1796-f3d5-0125-7efda07af382.png)

適当なワークフローを作成し（下記が Danger を動かす最低限のワークフロー）、

![スクリーンショット_2019-01-07_18_01_55.png](https://qiita-image-store.s3.amazonaws.com/0/35733/e75242d9-2509-8876-d22f-d9e2ff78c7be.png)

スクリプトの箇所（上記の赤枠）に次のように記載する。

```sh:Bundlerを利用していない場合
gem install danger
danger
```

```sh:Bundlerを利用している場合
bundle install --path vendor/bundle
bundle exec danger
```

以上で準備は完了。作成したワークフローをプルリクをトリガーにして起動するように設定し、次のようにコメントが書き込まれればOK。

![スクリーンショット_2019-01-07_18_23_22.png](https://qiita-image-store.s3.amazonaws.com/0/35733/12c9f010-7c2d-d84a-4735-5c301c214177.png)

# Android Lint でレビューする例

これだけだと恩恵がよく分からないと思うので、プルリクエストを Android Lint でチェックして結果をレビューとして書き込む例を紹介します。[danger-android_lint](https://github.com/loadsmart/danger-android_lint) プラグインを利用します。（説明の簡易化の為に Bundler を使わない方の例を載せます。）

## Dangerfile

```ruby:Dangerfile
android_lint.gradle_task = "app:lint"
android_lint.report_file = "app/build/reports/lint-results.xml"
android_lint.filtering = true
android_lint.lint(inline_mode: true)
```

各オプションの説明はプラグインのページを参照ください。

## Bitrise 側

```sh:
gem install danger
gem install danger-android_lint
danger
```

これを動かすと、修正したコードが Android Lint にひっかかると次のように指摘してくれるようになります。

![スクリーンショット_2019-01-16_16_31_40.png](https://qiita-image-store.s3.amazonaws.com/0/35733/ecd8ab99-d93c-e928-e3f1-cd2f4d8a8892.png)

# 参考にさせて頂いた記事

- [Danger⚡️をBitriseCIで導入してGithubのコードレビューを自動化する方法](https://qiita.com/toshihirooya/items/2d2a3c28071892d909e5)
- [コードレビューの機械的な指摘はDangerに任せる](https://techblog.lclco.com/entry/2017/12/29/211627)
- [Dangerで効率よくPR駆動開発](https://techblog.recruitjobs.net/development/danger_driven_development)
- [Android開発のコードレビューbotを乗り換えた話](https://techlife.cookpad.com/entry/2017/06/28/190000)