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:

