C#でもDangerしたかったので、出来るようにした話
TL;DR
- KotlinとかJSとかJavaの主要なLinterが吐き出すレポートファイルを食えるDangerプラグインはいろいろある
- だけど、C#はねえ!
- 仕方ないので作った github.com
- ついでにDanger本体のAppVeyor(Windows環境が使えるCIサービス)対応化をした github.com
これがしたい
やり方
LinterをCI環境に導入する
C#のコードを読めるLinterはいろいろありますが、VSの拡張だったりでコマンドを叩いてレポートファイルを吐き出させるという用途には使いづらいものが多かったので、今回はJetBrains社が提供しているReSharper Command Line Toolsを使用しました。
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を書き換えてあげたほうが良いと思います。