Posted at

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

これは GitHub のプルリクエスト時に CI(Bitrise)上で Danger を動かし結果をプルリクエストへ書き込む、という仕組みを Android の開発環境へ導入する手順のメモです。


動作イメージ

スクリーンショット_2019-01-07_18_23_22.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 を追記


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/configGemFile.lock も生成されるが、それらはそのまま Git 管理下に置いておく。



3. Dangerfile の作成

$ bundle exec danger init

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


動作確認用に Dangerfile を修正

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


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

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


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



Bitrise 側の設定

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

スクリーンショット_2019-01-07_17_51_39.png

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

スクリーンショット_2019-01-07_18_01_55.png

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


Bundlerを利用していない場合

gem install danger

danger


Bundlerを利用している場合

bundle install --path vendor/bundle

bundle exec danger

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

スクリーンショット_2019-01-07_18_23_22.png


Android Lint でレビューする例

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


Dangerfile


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 側

gem install danger

gem install danger-android_lint
danger

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

スクリーンショット_2019-01-16_16_31_40.png


参考にさせて頂いた記事