Javaアプリケーションを個人開発する際にSonarQubeを使ってみる。
お一人様SonarQubeというと一見仰々しく感じるが、
- Dockerコンテナを利用
- 常時稼働させない
という方針のためサーバというよりはツールの感覚で利用する。
SonarQubeサーバ
SonarQubeサーバには大きく以下3つの役割がある。
- 品質チェックルールの定義と保管
- 品質チェック結果の保管
- 品質レポートの表示
SonarQubeを常時稼働させず以下のタイミングでのみにローカル開発PC上でDockerコンテナとして稼働させる。
- 品質チェックルールの登録、編集時(SonarQuebeサーバ上でルールを一元管理するため)
- SonarLintのセットアップ時(品質チェックルールのフェッチが必要となるため)
- SonarQube Scanner for Gradleの実行時(品質チェック&結果をサーバ側に保存が行われるため)
- 品質レポートを閲覧時(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版以外にもEclipse、Visual 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
にしておくとローカルで変更したファイルに対してのみ解析が掛かるため、開発時はこれにしておくと良い。