五 月
12
金曜日

お一人様SonarQube

Javaアプリケーションを個人開発する際にSonarQubeを使ってみる。
お一人様SonarQubeというと一見仰々しく感じるが、

  • Dockerコンテナを利用
  • 常時稼働させない

という方針のためサーバというよりはツールの感覚で利用する。


SonarQubeサーバ

SonarQubeサーバには大きく以下3つの役割がある。

  • 品質チェックルールの定義と保管
  • 品質チェック結果の保管
  • 品質レポートの表示

SonarQubeを常時稼働させず以下のタイミングでのみにローカル開発PC上でDockerコンテナとして稼働させる。

  1. 品質チェックルールの登録、編集時(SonarQuebeサーバ上でルールを一元管理するため)
  2. SonarLintのセットアップ時(品質チェックルールのフェッチが必要となるため)
  3. SonarQube Scanner for Gradleの実行時(品質チェック&結果をサーバ側に保存が行われるため)
  4. 品質レポートを閲覧時(SonarQuebeのWEB UIが必要となるため)

基本的に開発時はIDE上から「ローカルで変更したファイルに対してSonarLintを実施 -> 指摘箇所を修正」の繰り返しになる。 SonarLintは品質チェックの結果をSonarQubeサーバに送信せずにIDE上に表示されるだけであるためこの間はSonarQuebeサーバは稼働している必要が無い。

なお今回はSonarQube Scannerはmasterに対してのみ実施。Pull Requestがマージされたタイミングで手動で実施する。

インストール

Docker StoreからSonarSource謹製のSonarQubeコンテナを立ち上げる。

docker run -d --name sonarqube -p 9000:9000 -p 9092:9092 sonarqube:alpine

デフォルトではデータベースにH2が利用される。
ポート番号は9000がhttp、9092がH2の接続ポートとなっている。

H2はSonarQube評価用に同梱されたデータベースという位置付けであり通常実運用時にはMySQLやPostgreSQL等のデータベースの利用が推奨されているが、 今回は利用者が自分だけという事もあり不都合が起きない限りはH2のまま利用することにした。

なおSonarSourceからDBにPostgreSQLを利用したdocker-compose.ymlの例が公開されているので 別途DBを立てる場合はこちらを参考にすると良い。

WEBからSonarQubeへログイン

ブラウザから http://localhost:9000/ へアクセス。
デフォルトの管理ユーザとパスワード admin/admin でログインできる。

SonarQube Scanner for Gradle

対象となるプロジェクトのbuild.gradleにSonarQube Scanner for Gradleプラグインを組み込む。

plugins {
  id 'org.sonarqube' version '2.4'
}

プラグインを登録したらSonarQuebeコンテナが上がっている状態で初回の品質チェックを実施する。

./gradlew sonarqube -Dsonar.host.url=http://localhost:9000

http://localhost:9000/projects へアクセスすると当該Gradleプロジェクトの品質レポートを閲覧できる。

IntelliJ IDEA SonarLint

SonarSourceよりIntelliJ IDEA用のSonarLitが提供されている。
またIntelliJ版以外にもEclipseVisual Studio、 そしてgitのpre-commitなどに使えるであろうCommand Line版が提供されている。

インストール

IntelliJを立ち上げメニューから IntelliJ IDEA -> Preferences… -> Plugins -> Browse Repositories… でリポジトリ閲覧画面からSonarLintで検索し、 Install を実施。

SonarLint一般設定

IntelliJのメニューから IntelliJ IDEA -> Preferences… -> Other Settings -> SonarLint General Settings

SonarQubeサーバの登録を行う。

Name
Private SonarQube
Server URL
http://localhost:9000
Authentication type
Password
本当は Tokenを使うべきだが、今回はお一人様用なので管理者ユーザのID、パスでアクセス。
Login
admin
Password
admin

Test connection で接続できる事を確認。

SonarLintプロジェクト固有設定

IntelliJのメニューから IntelliJ IDEA -> Preferences… -> Other Settings -> SonarLint Project Settings

Enable bindings to remote SonarQube server

チェックをつけてIntelliJプロジェクトとSonarQubeプロジェクトを紐付ける。
チェックをつけない場合、SonarQubeサーバから品質チェックルールのフェッチは行わずSonarLintに同梱されているルールが利用される。
この場合SonarQubeサーバは不要になる反面、ルールのカスタマズはできなくなる。
Bind to server
Private SonarQube
SonarQube project
IntelliJプロジェクトと紐付けるSonarQuebeプロジェクトを選択する。
この選択一覧にプロジェクトを表示させるためには最低一度はSonarQube ScannerでSonarQuebeサーバへ品質チェック結果を送信する必要がある。

OK で完了。

ちなみにIntelliJのプロジェクトとSonarQuebe側のプロジェクトは1対1でしかバインドできない。またアーティファクトIDの基づいた自動バインド機能も無いようだ。
SonarQuebe Scanner側はマルチモジュールのプロジェクトをモジュール毎にSonarQuebeプロジェクトとして登録してくれるが、SonarLint側はマルチモジュールを考慮 してくれないためIntelliJ側のプロジェクトがマルチモジュール構成の場合は塩梅が悪い。
その場合は修正対象モジュールに応じて都度 SonarLint Project Settings から適当するSonarQuebeプロジェクトを選択するしかない。

IntelliJからチェックする

メニューから View -> Tool Windows -> Sonar Lint でSonar Lintビューを表示。

Current file または Project files タブを選んで緑三角アイコン押下でSonar解析が実施される。

Project filesタブでVCS Changed filesにしておくとローカルで変更したファイルに対してのみ解析が掛かるため、開発時はこれにしておくと良い。