おおよそ以下のURLで説明されているとおり。
https://docs.sonarqube.org/display/PLUG/SonarGo
自分の環境ではsonar-scannerを使わずにgradle + sonarqube pluginを用いている。
gradle wrapperをリポジトリに含めておけば、java以外の事前準備なしで実行できる(ネットにつながる前提で)。
先にgo test
してカバレッジ/テスト結果をファイル出力しておき、SonarQubeに吸い上げる。
build.gradle
plugins {
id "org.sonarqube" version "2.6.2"
}
sonarqube {
properties {
property "sonar.projectName", "PROJECT-NAME"
property "sonar.projectVersion", "1.0.0"
property "sonar.go.coverage.reportPaths", "reports/coverage.out"
property "sonar.go.tests.reportPaths", "reports/test.json"
property "sonar.sources", "."
// Exclude code generated by stringer.
property "sonar.exclusions", "**/*_test.go,**/*_string.go,**/vendor/**"
property "sonar.tests", "."
property "sonar.test.inclusions", "**/*_test.go"
property "sonar.test.exclusions", "**/vendor/**"
}
}
SonarQubeがgradleタスクを実行するlinuxと同じ環境(http://localhost:9000
)で動いている前提。
stringer生成コードを無視する想定でsonar.exclusionsに「*_string.go」指定している。
Makefile(抜粋)
test:
go test -coverprofile=reports/coverage.out -json > reports/test.json
カバレッジ/テスト結果の出力形式は以下のページを参照。
https://docs.sonarqube.org/display/PLUG/Go+Coverage+Results+Import
https://docs.sonarqube.org/display/PLUG/Unit+Tests+Results+Import
テストとsonarqubeタスク実行
$ make test
$ ./gradlew sonar
ルートパッケージにテストコードがあると以下のエラーが出て上手く拾ってくれない。デフォルトGOPATHの場合でも環境変数GOPATH=~/go
を明示設定しておくと拾ってくれる。
Failed to find test file for package github.com/tckz/go-split and test TestDecorateReaderNoCompression
ディレクトリ階層(抜粋)
~/go <-- $GOPATH
src/
github.com/
tckz/
go-split/
Makefile
build.gradle
gradlew
gradle/
wrapper/ <-- Gradle wrapper実体
...省略
split_test.go <-- 非mainパッケージ
環境
- CentOS 7.5 x64
- go 1.11.1
- openjdk version 1.8.0_181
- SonarQube Community Edition 7.3.0.15553
- SonarGo 1.1.0 (build 1612)
- SonarQube Community Edition 7.3.0.15553
- GNU Make 3.82