SonarQubeでgoのテスト結果を集約する

2018/10/03

Categories: sonarqube

おおよそ以下の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パッケージ

環境

>> Home