概要
プログラム品質管理ツールSonarQubeが良さそうなので調べはじめています。
まずは動かしてみるとこからということで、Docker環境でさくっと試してみましょう。
環境
- OSX El Capitan
-
Docker for Mac
- 1.12.0-rc3-beta18
Windows10の場合はDocker for Windows、Windows7,8であればDocker Toolboxをインストールするとよいでしょう。
セットアップ
Docker Hubのイメージをそのまま使います。
データベースはPostgreSQLで。
sonarqube:
image: sonarqube
ports:
- '9000:9000'
environment:
- SONARQUBE_JDBC_USERNAME=sonar
- SONARQUBE_JDBC_PASSWORD=sonar
- SONARQUBE_JDBC_URL=jdbc:postgresql://sonarqube_db:5432/sonar
links:
- sonarqube_db
volumes_from:
- sonarqube_datastore
sonarqube_db:
image: postgres
environment:
- POSTGRES_USER=sonar
- POSTGRES_PASSWORD=sonar
volumes_from:
- sonarqube_datastore
sonarqube_datastore:
build: containers/datastore
FROM busybox:latest
MAINTAINER ot-aoyagi <foo@example.com>
# sonarqube
VOLUME /opt/sonarqube/conf
VOLUME /opt/sonarqube/data
VOLUME /opt/sonarqube/extensions
VOLUME /opt/sonarqube/lib/bundled-plugins
# postgresql
VOLUME /var/lib/postgresql
VOLUME /var/lib/postgresql/data
CMD /bin/sh
ビルド・起動
$ docker-compose build
$ docker-compose up -d
ログイン・設定
- http://{docker-host}:9000/ を表示し右上の[Log in]からログインします。
Language Pack for Japaneseをインストールすると日本語化できるようです。(未確認)
解析
今回は私の手元にある、とあるJavaのWebアプリケーションを解析してみます。
技術要素などのプロフィールはおよそ以下のようなものです。
- ライブラリ・フレームワーク等
- Java8
- JSF 2.3
- Spring Framekwork 4.3
- MyBatis 3
- 元々 Java6 + JSF1.2 + Spring Framework 2.5 で実装したアプリケーションをマイグレーション
- 30画面程度
- 数年前にリリース、その後継続的に機能拡張
- 構成管理ツールとしてGradleを使用
設定
build.gradle
にSonarQubeプラグインを設定します。
buildscript {
repositories {
maven {
url "http://repo1.maven.org/maven2/"
}
maven {
url "https://plugins.gradle.org/m2/"
}
mavenLocal()
}
dependencies {
classpath 'org.sonarqube.gradle:gradle-sonarqube-plugin:1.0'
}
}
// 中略...
apply plugin: 'java'
apply plugin: "org.sonarqube"
// 中略...
// 解析対象外としたいプロジェクトには skipProject = true を設定
project(":xxx-test") {
sonarqube {
skipProject = true
}
}
// 中略...
sonarqube {
properties {
// Dockerで起動したSonarQubeのURL
property "sonar.host.url", "http://{docker-host}::9000/"
// 解析対象外とするファイル
property "sonar.exclusions", "*(Test|Mock)\\.java"
}
}
実行
手っ取り早く結果を見たいので、ひとまず今はテストをスキップして解析です。
$ ./gradlew sonarqube -x test
結果確認
http://{docker-host}:9000/
にアクセスし、結果を確認してみましょう。
- 問題点の一覧。左ペインのフィルタで条件に応じた絞り込みが可能
- 保守性。評価Aでした
- ダッシュボードには指標のサマリや過去の解析結果からの推移が表示されます
- 重複コード(Duplications)も検出してくれます。ざっと確認したところDto的なクラス群に定義された同名のアクセサ(getId()など)が引っかかってました。こういうのは除きたいところ。
- 「Debt」は技術的負債の修正にかかる時間の目安を示しているようです。73日...
ある一定の基準に沿ってコード品質が数値化されるのは、やっぱりいいですね。CIツールと絡めたりしてプロジェクト内でうまく運用できれば継続的な改善に向けたモチベーションにも繋がってきます。
今後
各指標の意味やプロジェクト毎ローカルルールの指定方法、CIツールとの連携などをもう少し調べてみたいと思います。
また今回はJavaプロジェクトを対象としましたが、他言語のアプリケーションでも試したいです。