これは GitHub のプルリクエスト時に CI(Bitrise)上で Danger を動かし結果をプルリクエストへ書き込む、という仕組みを Android の開発環境へ導入する手順のメモです。
動作イメージ
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 を追記
# 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!"
と追記する。(既存の他の行はコメントアウト。)
# 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 の個人アカウントの設定画面で、
作成したトークンの文字列は、後で利用するので控えておく。(この時点で控えておかないと後からは参照できないので、忘れた場合はトークンを再生成する。)
個人アカウントで Danger のコメントがプルリクに書き込まれるのが嫌な場合は、ボット用の GitHub アカウントを用意してトークンを作成する。
Bitrise 側の設定
ワークフローの画面で環境変数 DANGER_GITHUB_API_TOKEN
を定義する。値は控えておいたトークンを記載。
適当なワークフローを作成し(下記が Danger を動かす最低限のワークフロー)、
スクリプトの箇所(上記の赤枠)に次のように記載する。
gem install danger
danger
bundle install --path vendor/bundle
bundle exec danger
以上で準備は完了。作成したワークフローをプルリクをトリガーにして起動するように設定し、次のようにコメントが書き込まれればOK。
Android Lint でレビューする例
これだけだと恩恵がよく分からないと思うので、プルリクエストを Android Lint でチェックして結果をレビューとして書き込む例を紹介します。danger-android_lint プラグインを利用します。(説明の簡易化の為に Bundler を使わない方の例を載せます。)
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 にひっかかると次のように指摘してくれるようになります。