LoginSignup
26
32

More than 5 years have passed since last update.

Docker ComposeでSonarQubeの環境を作る

Posted at

概要

プログラム品質管理ツールSonarQubeが良さそうなので調べはじめています。
まずは動かしてみるとこからということで、Docker環境でさくっと試してみましょう。

環境

Windows10の場合はDocker for Windows、Windows7,8であればDocker Toolboxをインストールするとよいでしょう。

セットアップ

Docker Hubのイメージをそのまま使います。
データベースはPostgreSQLで。

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

ビルド・起動

$ docker-compose build
$ docker-compose up -d

ログイン・設定

  • http://{docker-host}:9000/ を表示し右上の[Log in]からログインします。
    • admin / admin sonarqube.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"
    }
}

実行

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

$ ./gradlew sonarqube -x test

結果確認

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

  • 問題点の一覧。左ペインのフィルタで条件に応じた絞り込みが可能 issues-01.png
  • 保守性。評価Aでした measures-01.png
  • ダッシュボードには指標のサマリや過去の解析結果からの推移が表示されます dashboard-01.png
  • 重複コード(Duplications)も検出してくれます。ざっと確認したところDto的なクラス群に定義された同名のアクセサ(getId()など)が引っかかってました。こういうのは除きたいところ。
  • 「Debt」は技術的負債の修正にかかる時間の目安を示しているようです。73日... home-01.png

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

今後

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

26
32
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
32