Docker ComposeでSonarQubeの環境を作る

## 概要
プログラム品質管理ツール[SonarQube](http://www.sonarqube.org/)が良さそうなので調べはじめています。
まずは動かしてみるとこからということで、Docker環境でさくっと試してみましょう。

## 環境
* OSX El Capitan
* [Docker for Mac](https://www.docker.com/products/docker#/mac)
    * 1.12.0-rc3-beta18

Windows10の場合は[Docker for Windows](https://www.docker.com/products/docker#/windows)、Windows7,8であれば[Docker Toolbox](https://www.docker.com/products/docker-toolbox)をインストールするとよいでしょう。

## セットアップ
Docker Hubのイメージをそのまま使います。
データベースはPostgreSQLで。

```yaml:docker-compose.yml
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
```

```:containers/datastore/Dockerfile
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
```

## ビルド・起動

```shell-session
$ docker-compose build
$ docker-compose up -d
```

## ログイン・設定

* http://{docker-host}:9000/ を表示し右上の[Log in]からログインします。
  * admin / admin
![sonarqube.png](https://qiita-image-store.s3.amazonaws.com/0/131679/b4236b27-d87e-3ed9-5d52-a4de7a399196.png)
    * [Administration]を選択
    * [System] -> [Update Center]を選択
    * [Available]を選択し`java`で検索し、Javaプラグインをインストール
    * インストール後、再起動

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プラグインを設定します。

```build.gradle
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"
    }
}
```

### 実行

手っ取り早く結果を見たいので、ひとまず今はテストをスキップして解析です。

```shell-session
$ ./gradlew sonarqube -x test
```

### 結果確認

`http://{docker-host}:9000/`にアクセスし、結果を確認してみましょう。

* 問題点の一覧。左ペインのフィルタで条件に応じた絞り込みが可能
![issues-01.png](https://qiita-image-store.s3.amazonaws.com/0/131679/4c58c4b8-570b-7034-6f30-5292e6ef9e00.png)
* 保守性。評価Aでした
![measures-01.png](https://qiita-image-store.s3.amazonaws.com/0/131679/bac2fd0f-6e00-140e-31b9-093f84434621.png)
* ダッシュボードには指標のサマリや過去の解析結果からの推移が表示されます
![dashboard-01.png](https://qiita-image-store.s3.amazonaws.com/0/131679/a24648b3-7636-1ea5-bcab-f9d77b8a030c.png)
* 重複コード(Duplications)も検出してくれます。ざっと確認したところDto的なクラス群に定義された同名のアクセサ(getId()など)が引っかかってました。こういうのは除きたいところ。
* 「Debt」は技術的負債の修正にかかる時間の目安を示しているようです。73日...
![home-01.png](https://qiita-image-store.s3.amazonaws.com/0/131679/e3985e58-2f82-abce-c77d-6b3d2c9fecc1.png)

ある一定の基準に沿ってコード品質が数値化されるのは、やっぱりいいですね。CIツールと絡めたりしてプロジェクト内でうまく運用できれば継続的な改善に向けたモチベーションにも繋がってきます。

## 今後
各指標の意味やプロジェクト毎ローカルルールの指定方法、CIツールとの連携などをもう少し調べてみたいと思います。
また今回はJavaプロジェクトを対象としましたが、他言語のアプリケーションでも試したいです。