読者です 読者をやめる 読者になる 読者になる

亀岡的プログラマ日記

京都のベッドタウン、亀岡よりだらだらとお送りいたします。

SonarQubeをWindows環境で使ってC#コードを解析する[追記しました]

C#

SonarQubeをWindows環境で使ってC#コードを解析する

はじめに注意

  • ココらへんの事柄は一年も経てば色々変わったりするので、古い情報はあんまり真に受けないこと。
  • 一応検証環境はWindows 8.1 Professional on VMWare Fusion 5だけれど、まぁWindows 7以降ならだいたい一緒のはず。

SonarQubeとは

SonarQubeはもともとSonar*1と呼ばれていた、オープンソースの静的解析エンジンです。もともとはJava向けですが、Jenkinsのようなプラグイン機能も充実しており、結構な数のプラグインで、解析方法どころか解析可能な言語もかなり充実しています。現在のところ、公式では以下の言語をサポートしているよう

静的解析から単体テストの実行、そしてカバレッジの測定まで一気にやってくれる上に、見やすいビューも用意されているので、Jenkinsさんあたりと連携させると、非常にやりやすいです。

C#コードに対して、どんなことが可能なのか

…といっても、イメージがあんまり沸かないと思うので、ちょっとサンプルサイトを横目に見ながら、機能を確認してみましょう。オンラインに用意されているサンプルに、ORMのひとつ、MyBatis.netを解析したものがあります。

では、これを題材にどんなことが出きるのか見てみましょう。

コードルールの順守度を見る

コーディングルールの順守度を見ることができます。C#の場合、設定できるルールは以下のとおり。

  • 組み込みルール
  • FxCop
  • StyleCop
  • Gendarme*2
  • NDepsによる参照関係禁止ルール
    • あるプロジェクトはあるプロジェクトとの参照を禁止する、とかできる

とりあえず、上記のルールに関してはデフォルトでいい感じの強弱がついてますし、もし気に入らなければ、「品質プロファイル」から変更は可能です。

こんな感じで見れます。ビューとしては、

  • 順守違反が多いルール
  • 順守違反が多いプロジェクト・フォルダ・ファイル

などが見れます。

メソッドの複雑度を見る

いわゆるサイクロマチック複雑度を出してくれて、多いファイル順に並び替える、などができます。メソッド・クラス・ファイルごとに出力可能。

コードクローン(重複度)を見る

ダブっているコードの判定をしてくれます。これも、重複度が高いファイルから順番に出したり、ということが可能です。

コードカバレッジを見る

これだけは厳密に言うと動的解析ですね。まぁテストを動かした際のコードカバレッジを取得するものです。網羅していない行数の%順表示なんかもできます。

どうでしょうか?とにかくサンプルページみたいなデータを定常的に見えるようにするツール、ということになります。ぱっと入れてみて眺めていると、ニヤニヤ出きると思いますです。

今回は、タイトルのとおり、Windows環境への導入と、C#の解析までをやってみたいと思います。

動作イメージはこんな感じ。

f:id:posaunehm:20131204084655p:plain

f:id:posaunehm:20131204084649p:plain

SonarQubeと必要なライブラリのセットアップ

必要な物をダウンロード

まずは、SonarQube本体をホームページから落としてきます。SonarQubeとSonarRunner両方必要ですので、2つとも落としておきましょう。

あとは、JVM上で動くものですので、最新版のJREを落としてきておいてください。

それからもうひとつ、SQLデータベースも必要です。SQL Serverでも良かったのですが、あんまりサポートが厚くなさそうなので今回はMySQLにしてみます。(Postgresでもよかったのですが、Windowsだと辛いという噂を聞いたので・・・)

ちなみに、JREMySQLchocolateyでもセットアップ可能です。

cinst javaruntime
cinst mysql

DBのセットアップ

次は、DBのセットアップです。 基本的にやることは、

  • SonarQube用のDBを作ること(create database)
  • SonarQube用のユーザを作ること(create user) 、DBのCRUDを許可すること(grant)

になります。

ユーザー名・DB名は設定で変えられるのであんまり気にしなくてもいいですが、設定ファイルのデフォルトは

となっていますね。

普通にやるならこんなかんじでしょうか。

create database sonar;
create user 'sonar'@'localhost' identified by 'sonar';
grant all on sonar.* to 'sonar'@'localhost';

Sonarのセットアップ

基本は、以下に書いてあるとおりです。

ですが、まぁちょっとだけ。 セットアップと言っても、Sonarはインストーラ等経由では入りません。ZIPファイルを回答して、適当なところに置くのみです。 そのあと、解凍したフォルダ直下のconfフォルダ内のsonar.propertiesを編集します。

編集するのは、以下の設定です。

  • sonar.jdbc.username
    • DBのユーザ名を指定します。デフォルトならsonarです。
  • sonar.jdbc.password
    • DBのパスワードを指定します。デフォルトならsonarです。
  • sonar.jdbc.url
    • どのDBを使うかによってかなり異なります。が、デフォルトの文字列が対応しているDB全てに書かれてコメントアウトされているので、MySQLの所のコメントアウトを外します。デフォルトDB名の"sonar"がURLに入っているので適当に編集しておきましょう。

では、起動させてみましょう。java -jar で実行することもできますが、とりあえずはサービスとして起動してみましょう。解凍したフォルダのbinフォルダにwindows-x86-32とwindows-x86-64という2つのフォルダがあるので、自分の環境に合わせたフォルダを開いて(まさか64bitで32の方のフォルダを開く人はいないよね・・・?)、InstallNTService.bat, StartNTService.batを叩いてやります。

起動できたでしょうか?できませんね?OKです。

LocalサービスのTempフォルダが通常は存在しないのが原因のようです*3。以下のフォルダを作成すると正常に起動します。

C:\Windows\system32\config\systemprofile\AppData\Local\Temp

また、ローカルシステムアカウントでログインせず、通常のユーザでログインする設定にしてもOKです。以下を参考にしてください。

どのみち、ちょっとWindows上でのテストが不安にはなりますね・・・

では、もう一度サービスを起動すると、localhost:9000にSonarが立ち上がってくれるはずです。

SonarRunnerをセットアップ

次に、実際に解析をキックできるようにセットアップを行います。Antと連動する方法もあるのですが、今回はSonnarRunnerを使用します。すでにダウンロードは終わっているはずなので、解答して適当なところに配置します。 Sonnar本体と同じようにconfフォルダの下にプロパティファイルが有ります。sonnar-runner.propertiesを編集します。

基本的には上記で設定したものと同じです。host.urlが追記されているものですね。

  • sonar.jdbc.username
    • DBのユーザ名を指定します。デフォルトならsonarです。
  • sonar.jdbc.password
    • DBのパスワードを指定します。デフォルトならsonarです。
  • sonar.jdbc.url
    • どのDBを使うかによってかなり異なります。が、デフォルトの文字列が対応しているDB全てに書かれてコメントアウトされているので、MySQLの所のコメントアウトを外します。デフォルトDB名の"sonar"がURLに入っているので適当に編集しておきましょう。
  • sonar.host.url
    • Sonar本体のアドレスです。デフォルトなら http://localhost:9000 です。特に設定をいじってなければそのままでOKのはず。

C#プラグイン用のライブラリをセットアップ

C#プラグインを導入するだけで、デフォルトで幾つかのコード解析は実行できるのですが、もうちょい使えるものにするために、以下のプラグインもダウンロードしておきます。

FXCop

ご存知公式コーディングルール。Windows SDK 7.1に入っています。詳しいインストールは@biacさんの解説を参考に。

Gallio

マルチプラットフォーム対応の単体テスト実行環境。MSTest/NUnit/xUnit.net/MbUnitをすべてカバーします。さらにカバレッジ解析ソフトと連動してカバレッジの取得までやってくれます。ダウンロードは公式ページから。

OpenCover

オープンソースカバレッジ取得ツール。.netでアクティブなカバレッジツールはこれだけでは?ダウンロードは公式Githubから。Gallioと連携します。

C#プラグインのセットアップ

こっから先はSonar側での作業となります。 まず、立ち上がったSonarのWebページでLoginをクリックしログインします。デフォルトでadmin/adminが管理者パスワードになっていますので、ログインしましょう。

ログインするとConfigurationへのリンクが出現するので、設定画面へ向かい、UpdateCenterに行きます。そこから

  • C# プラグイン
  • .NETプラグイン

を導入します。(Sonarの再起動が多分ベター)

その後、再び設定ページに行くと.net系のツールを設定できるようになっているはず。FxCopのページではパスを、GallioのページではGallioのパスを設定し、使用するコードカバレッジツールをOpenCoverにしOpenCoverのパスも設定しておきます。

日本語化

ついでに日本語化もやっときましょう。UpdateCenterのLocalizationの場所に、"Japanse Pack"がありますので、それをダウンロードしておきます。大体の項目は日本語になってくれるはずです。

プロジェクトファイルの作成

最後に、Sonarが見るプロジェクトの設定ファイルを作成します。とりあえずは、ソリューションファイルと同一のディレクトリに作成する方法でいきましょう。 この設定は、SonarのC#サンプルページを参考にすると簡単のはず。

まず、最初の3つは表示設定なのでご自由に。

  • sonar.projectKey
    • プロジェクトを示す一意なKey。名前空間などをつけておきましょう。
  • sonar.projectVersion
    • プロジェクトのバージョン番号、
  • sonar.projectName
    • プロジェクト名。

次からが割と大切です。とはいえ、殆どの場合はデフォルト(サンプルのママ)で問題ないはず。

  • sonar.sources=
    • ソースファイルの位置。ソリューションと同じフォルダに置く場合は、"."と書いてカレントがソリューションのルートだということを伝えておきましょう。
  • sonar.language
    • 解析する言語。当然"cs"です。
  • sonar.dotnet.key.generation.strategy
    • これは"safe"が推奨とのこと。(解析が動かないバグがあったらしい)
  • sonar.sourceEncoding

解析実行

では、解析を実行してみましょう。sln以下のようにします。(パスを通してないならsonar-runner/bin_sonar-runner.batを叩きましょう)

sonar-runner

解析が実行され、Sonnerのページに結果が出力されたでしょうか?

さて、導入まではこれにて終了です。次はJenkinsとの連携を考えてみましょう。動かない、分からない的な事があればTwitterなりコメントなりMessageLeafなり、連絡ください〜。

*1:ソースの欠陥を探知するソナー、的な意味らしい

*2:monoProjectで開発されているコード規約エンジン。標準でC#プラグインに入っている

*3: Frequently Asked Questions - SonarQube - Codehaus