White Box技術部

WEB開発のあれこれ(と何か)

GradleプロジェクトのSpockのテストをCircleCIで実行してJaCoCoでカバレッジを取りつつCoverallsで表示する

ちょっと思い立ってJavaでコードを書いていて、 さらに思い立ってカバレッジのバッジをREADMEに付けようとしたら、 思いの外ハマったので「GradleプロジェクトのSpockのテストをCircleCIで実行してJaCoCoでカバレッジを取りつつCoverallsで表示する」ための手順を残しておきます。

やりたいこと

  • GradleプロジェクトのREADMEにCircleCICoverallsのバッジを表示したい
  • JavaコードのテストをSpockで書きたい
  • JavaコードのカバレッジJaCoCoで集計したい
  • GitHub/CIrcleCI/Coverallsの結果をSlackに通知する(ブログでは言及しない)

つまりこういう感じのことをしたいわけです。

f:id:seri_wb:20170320005901p:plain

ではやっていきます。


build.gradleにJaCoCoとCoverallsの設定を追加

Spockでテストを書くJavaのGradleプロジェクトは以下のコマンドで作成していました。

$ gradle init --type java-library --test-framework spock

このプロジェクトでCoverallsを使うため、以下のGradleプラグインを導入します。

build.gradleにpluginsとjacocoTestReportを追加すると使えるようになります。

plugins {
    id 'jacoco'
    id 'com.github.kt3k.coveralls' version '2.8.1'
}

apply plugin: 'java-library'
apply plugin: 'groovy'

省略

jacocoTestReport {
    reports {
        xml.enabled true // coveralls plugin depends on xml format report
        html.enabled true
        html.destination "${buildDir}/jacocoHtml"
    }
}

Coverallsで観るだけならhtml関連の設定は不要なのですが、ローカルでテストしたときにもカバレッジ結果を見たかったので入れてます。
The JaCoCo Plugin - Gradle User Guide Version 3.5

※実際に適用した場合はこのようになります。

CircleCIでテストする

CircleCIでテストを動作させるためには、まずCircleCIにアカウントを作成して、メニューのPROJECTSからテストしたいプロジェクトをBuild projectにします。

その前後でテスト対象のプロジェクトにcircle.ymlファイルを作成して、GitHubにプッシュします。
例えば、Javaのプロジェクトをテストするcircle.ymlの内容は、以下のようになります。

machine:
  timezone: Asia/Tokyo
  java:
    version: oraclejdk8

test: 
  override:
    - ./gradlew test jacocoTestReport coveralls

ここが失敗ポイントだった

作業していたときに上手くいかなかった原因を話してしまうと、ここで実行しているgradlewのコマンドを coveralls-gradle-pluginのREADMEに書いてある通り./gradlew jacocoTestReport coverallsとしていたためでした。

というのも、testを書いていないとtestタスクがSKIPされ、結果カバレッジも取得されないという状態になっていたようです。

つまり以下のような一文をbuild.gradleに足して、jacocoTestReportタスクがtestタスクに依存することを示しておけば、 testを書き忘れてもちゃんとカバレッジが取れるようになります。

jacocoTestReport.dependsOn test

CircleCIとCoverallsを連携させる

CircleCIでカバレッジが取れるようになったら、次はCoverallsの設定をします。

CircleCIと同様に、Coverallsもアカウントを作成し、メニューのADD REPOから対象のプロジェクトをONにします。
その後、SETTINGSの画面に表示されるREPO TOKENの値をメモします。

次はCircleCIの方に移り、プロジェクトの設定メニューからBUILD SETTINGSのEnvironment Variablesを選択し、以下の変数を追加します。

  • COVERALLS_REPO_TOKEN : CoverallsのREPO TOKENの値

この設定まで終わった状態で、CircleCIでビルドを行うと、Coverallsの方にカバレッジの結果が表示されるようになります。

READMEにバッジを表示

最後にREADME.mdにCircleCIとCoverallsのバッジを表示させます。

CircleCI、Coveralls共に、バッジをREADMEに表示するためのテキストを生成してくれています。
それぞれコピーして、対象プロジェクトのREADME.mdに貼り付ければバッジの表示は完了です。

CircleCI

f:id:seri_wb:20170320035858p:plain

CircleCIでのビルド状態を示すバッチは、以下の2通りで表示することができます。

CircleCIhttps://circleci.com/gh/seriwb/utsusemi.svg?style=svg

CircleCIhttps://circleci.com/gh/seriwb/utsusemi.svg?style=shiled

Coveralls

f:id:seri_wb:20170320040009p:plain

感想:結構大変だった

READMEに表示されているバッジの仕組みについて、気にはなっていましたが、今までスルーしていたので、その知識が補えて良かったです。 今回は結構苦戦してしまいましたが、わかっていれば10分もあれば終わりそうでした。(今回は4時間ぐらいかけたんですけど。。)

ともあれ、これでいつでもどこからでもテストとカバレッジの状態が見えるようになったので、 後は頑張ってコードを書いていこうと思います。