SonarQube を使用すると、静的解析により、コードに対するさまざまな指摘を受けることができます。この指摘を、コードレビューにも転用できたら、レビューコストもグッと下がって、いろいろ捗りそう。
というわけで実際にやってみました。
環境
- SonarQube 5.2
- SonarQube GitHub Plugin 1.1
- GitHub (2016-02-09 現在)
- Travis CI (2016-02-09 現在)
- Maven 3.2.5
- ORACLE Java 1.8.0_31
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=192m; support was removed in 8.0
Apache Maven 3.2.5 (12a6b3acb947671f09b81f49094c53f426d8cea1; 2014-12-14T17:29:23+00:00)
Maven home: /usr/local/maven
Java version: 1.8.0_31, vendor: Oracle Corporation
Java home: /usr/lib/jvm/java-8-oracle/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.13.0-40-generic", arch: "amd64", family: "unix"
事前準備
まず、SonarQube へ、GitHub Plugin がインストールされている必要があります。また、必要な情報として、Github のアクセストークン、SonarQube サーバーのログイン情報を準備します。
それぞれ、以下のように取得します。
GitHub Plugin のインストール
すでにインストールが完了している場合は、この手順をスキップしてください。
SonarQube へログインし、[Administration] > [System] > [Update Center] > [Available] と進めると、"GitHub" が見つかるので、[Install] します。インストールが完了したら、SonarQube を再起動します。
Github アクセストークン
プロフィールアイコンから、[Settings] へ進みます。
サイドメニューから、[Personal access tokens] へ進みます。
[Generate new token] ボタンから、トークンを新規作成します。
[Token description] にトークンの説明を記入し、[Select scopes] では、[repo] にチェックを入れ、[Generate token] ボタンをクリックして、トークンを生成します。
生成されたトークンが表示されるので、これを控えておきます。
SonarQube ログイン情報
SonarQube サーバーの URL と、ログインに使用する、[Login] と [Password] を控えておきます。
TravisCI 環境変数
ここまでで以下の値が揃ったはずです。
- Github アクセストークン
- SonarQube URL
- SonarQube ログイン ユーザー名
- SonarQube ログイン パスワード
これらの値を TravisCI に、環境変数として設定していきます。
プロジェクトのトップで、画面右上の [Settings] > [Settings] と進んでいきます。
先ほどの値を使用して、それぞれ以下のように設定していきます。
Name | Value |
---|---|
GITHUB_OAUTH | Github アクセストークン |
SONAR_HOST | SonarQube URL |
SONAR_USERNAME | SonarQube ログイン ユーザー名 |
SONAR_PASSWORD | SonarQube ログイン パスワード |
ビルド構成
事前準備を終えたら、ビルド構成を作成していきます。
.travis.yml
TravisCI を使用するので、プロジェクトルートに .travis.yml
を作成、配置します。
以下のようなファイルを作成します。
language: java
jdk:
- oraclejdk8
after_success: './sonar.sh ${TRAVIS_PULL_REQUEST} ${SONAR_HOST} ${SONAR_USERNAME} ${SONAR_PASSWORD} ${GITHUB_OAUTH}'
注目すべきポイントは after_success
です。
after_success
にはビルド成功時に呼び出されるスクリプトを記述できます。
ここでは、同階層に用意された sonar.sh
を実行し、引数に ${TRAVIS_PULL_REQUEST}
、${SONAR_HOST}
、${SONAR_USERNAME}
、${SONAR_PASSWORD}
、${GITHUB_OAUTH}
を渡しています。
TravisCI では、事前に環境変数で定義された値を、スクリプト内で参照できるため、先ほど設定した、Github アクセストークンや、SonarQube ログイン情報などがここで使用されているわけです。
ただ、先ほど設定しなかった、${TRAVIS_PULL_REQUEST}
については、事前設定した環境変数たちとは少々異なるもので、TravisCI 側で用意してくれるものになります。
値には、プルリクエスト番号が入ります。
なお、ビルドしているブランチがプルリクエストの対象でない場合には、false
が設定されます。
sonar.sh
引き続き、マニュアルも読みつつ、解析をおこなうためのスクリプトを作成していきます。
http://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner+for+Maven
#!/bin/bash
PULLS_NUMBER=$1
SONAR_HOST=$2
SONAR_USERNAME=$3
SONAR_PASSWORD=$4
GITHUB_OAUTH=$5
if [ $PULLS_NUMBER = 'false' ]; then
exit
fi
mvn org.sonarsource.scanner.maven:sonar-maven-plugin:3.0.1:sonar -Dmaven.test.skip=true -Dclirr=true -Dsonar.host.url=${SONAR_HOST} -Dsonar.login=${SONAR_USERNAME} -Dsonar.password=${SONAR_PASSWORD} -Dsonar.sourceEncoding=UTF-8 -Dsonar.analysis.mode=issues -Dsonar.github.pullRequest=${PULLS_NUMBER} -Dsonar.github.oauth=${GITHUB_OAUTH} -Dsonar.github.repository=yo1000/fizzbuzz -B -e -V
内容としては、プルリクエスト番号が false ではなかった場合、sonar-maven-plugin を使用して、SonarQube サーバーに解析リクエストを投入し、受け取った解析結果を Github の対象プルリクエストにコメントさせる、というものになります。
TravisCI では、プルリクエストの発生や、対象ブランチの更新もビルドトリガとなるため、プルリクエストが上がってきたら、自動的にコードの静的解析と、結果のコメントまでがおこなわれるようになります。
動作確認
最終的なプロジェクトは以下のようになりました。
https://github.com/yo1000/fizzbuzz/tree/sonar-test-2
実際にひどいコード変更を入れて、プルリクエストを投げてみます。
https://github.com/yo1000/fizzbuzz/pull/2
TravisCI が動き始めます。
レビュー結果がコメントされましたね!!
コメントをつけているユーザーは、Github アクセストークンに基づくので、自動レビュー用に別途ユーザーを用意してもいいかもしれません。
ここまでで連携は完了です。
SonarQube にコードレビューしてもらうことで、レビュー負荷が軽減されるだけでなく、よりレビューが必要なポイントにもっと時間を割けるようになっていき、レビュー精度も上がっていくことでしょう。
引き続き、もっと SonarQube を使い倒していきたいですね!