CircleCI 2.0でAndroidのアプリをビルドしつつ、コードレビューBOTも動かす - Qiita で、Androidアプリの自動レビューでRubyが使えるようになりました。
その最後で書いてましたが、gradleのタスクを実行しないDangerプラグインを自分で作ったので、それの利用方法などを紹介しようと思います。
主にAndroidのアプリを想定していますが、Checkstyle formatのXMLが用意できれば、同じように自動レビューさせることが出来ると思います。
作ったもの
RubyGems : danger-checkstyle_format
GitHub : danger-checkstyle_format
出来ること
Checkstyle formatのXMLファイルを用意して、Danger経由で danger-checkstyle_format
を実行すると、差分に対してwarningをコメントしてくれる。
イメージとしては、こんな感じ。
導入手順
基本的には、 CircleCI 2.0でAndroidのアプリをビルドしつつ、コードレビューBOTも動かす - Qiita で記載した内容のうち、Saddlerに関する部分を、Dangerに書き換えるイメージ。
利用するGemのインストール
Gemfileに、下記の依存関係を追加します。
gem 'danger'
gem 'danger-checkstyle_format', '~> 0.0.1'
bundle install
を実行し、Gemfile.lockを更新しておきます。
Dangerfileを作成する
https://github.com/noboru-i/SlideViewer/blob/0680f790273785adfea8c3d5184f59a96b3a8e42/Dangerfile こんな感じのDangerfileを作成する。
最低限必要なのは、下記の3行です。
github.dismiss_out_of_range_messages
checkstyle_format.base_path = Dir.pwd
checkstyle_format.report 'app/build/reports/checkstyle/checkstyle.xml'
github.dismiss_out_of_range_messages
については、 https://techblog.recruitjobs.net/development/danger_driven_development を参照してください。
checkstyle_format.report
の引数は、利用するCheckstyle formatのXMLファイルです。
ただ、基本的にはfileタグのname属性は絶対パスになるようです。
inlineでレビューするときには、リポジトリルートからの相対パスが必要になるため、それを打ち消すために base_path
の指定が必要となります。
( https://github.com/noboru-i/danger-checkstyle_format/blob/03de2616687fe7e8c8d93afbb2f72e087e2f1fc3/lib/checkstyle_format/plugin.rb#L36 こんな感じで、置換しています。)
CircleCIの設定を行う
.circleci/config.yml
を下記のように修正します。
参考: https://github.com/noboru-i/SlideViewer/pull/75/files#diff-1d37e48f9ceff6d8030570cd36286a61
jobs:
build:
<<: *defaults
steps:
- run:
name: Check lint
command: ./gradlew :app:check -x test
- persist_to_workspace:
root: ~/code
paths:
- .
check:
working_directory: ~/code
docker:
- image: circleci/ruby:2.4.1
steps:
- attach_workspace:
at: ~/code
... 略
- run:
name: Run danger
command: bundle exec danger
いろいろ書いてありますが、メインはRubyのコンテナで bundle exec danger
をやっている点です。
あとは、その前で ./gradlew :app:check
をすることで、 app/build/reports/checkstyle/checkstyle.xml
が出力しておき、それを attache_workspace
などを利用して引き継いでいます。
最後に
初めてのDangerプラグインでした。
もし、使ってバグなど発見されましたら、issueやPRしていただけるとうれしいです。 :bowing_man: