DangerでCheckstyleの結果を指摘する


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: