もやし日誌

日記のようなもの

C#でもDangerしたかったので、出来るようにした話

TL;DR

  • KotlinとかJSとかJavaの主要なLinterが吐き出すレポートファイルを食えるDangerプラグインはいろいろある
  • だけど、C#はねえ!
  • 仕方ないので作った github.com
  • ついでにDanger本体のAppVeyor(Windows環境が使えるCIサービス)対応化をした github.com

これがしたい

f:id:kazuki09:20181107090935p:plain

やり方

LinterをCI環境に導入する

C#のコードを読めるLinterはいろいろありますが、VSの拡張だったりでコマンドを叩いてレポートファイルを吐き出させるという用途には使いづらいものが多かったので、今回はJetBrains社が提供しているReSharper Command Line Toolsを使用しました。

www.jetbrains.com

ReShaper自体は有償ですが、Command Line Toolsは無償ですのでこいつをうまくCI環境に入れてあげれば良いのです。

と言っても、自分のレポジトリにReSharper CLTのバイナリを入れるのはライセンス的にもNGですし、気持ち悪いのでここは上手く工夫しましょう。

if(![System.IO.Directory]::Exists((pwd).Path + "\ReSharperCLT2018.2.3")){
    Invoke-WebRequest -Uri https://download.jetbrains.com/resharper/ReSharperUltimate.2018.2.3/JetBrains.ReSharper.CommandLineTools.2018.2.3.zip -OutFile JetBrains.ReSharper.CommandLineTools.2018.2.3.zip
    Expand-Archive JetBrains.ReSharper.CommandLineTools.2018.2.3.zip -DestinationPath ReSharperCLT2018.2.3/
}

CIの設定で、インストールスクリプトに上記PowerShellスクリプトを入れてあげましょう。

それで、あとはReSharperCLT2018.2.3をキャッシュするように指定してあげるといい感じに初回だけダウンロードと展開が走るようになり、次回以降はキャッシュから展開されるようになります。

Dangerを入れる

まずはGemFileを用意しましょう。

source "https://rubygems.org"

gem 'danger'
gem 'danger-resharper_inspectcode'

次にDangerfileを用意します。

# Ignore inline messages which lay outside a diff's range of PR
github.dismiss_out_of_range_messages

# PR
if github.pr_title.include? "[WIP]" || github.pr_labels.include?("WIP")
  warn("PR is classed as Work in Progress") 
end

# Warn when there is a big PR
warn("a large PR") if git.lines_of_code > 500

# Warn when PR has no assignees
warn("A pull request must have some assignees") if github.pr_json["assignee"].nil?

resharper_inspectcode.base_path = Dir.pwd
resharper_inspectcode.report "report.xml"

ReSharper CLTが吐き出したreport.xmlを食わせる設定です。

ビルド or テストが走ったらReSharper CLTとDangerを走らせるように設定する

./ReSharperCLT2018.2.3/InspectCode.exe -o="report.xml" ./YOUR_PROJECT.sln
bundle exec danger

CIの設定で上記PowerShellスクリプトがビルド後に走るように設定すればおkです。

AppVeyorでの設定例

NowPlayingV2/appveyor.yml at develop · tumugin/NowPlayingV2 · GitHub

長ったらしい説明よりも使用例を見てもらった方が早いと思うので...

ちなみに、AppVeyorのデフォルトのRubyはちょっと古いので、PATHを書き換えてあげたほうが良いと思います。