ちょっと思い立ってJavaでコードを書いていて、 さらに思い立ってカバレッジのバッジをREADMEに付けようとしたら、 思いの外ハマったので「GradleプロジェクトのSpockのテストをCircleCIで実行してJaCoCoでカバレッジを取りつつCoverallsで表示する」ための手順を残しておきます。
やりたいこと
- GradleプロジェクトのREADMEにCircleCIとCoverallsのバッジを表示したい
- JavaコードのテストをSpockで書きたい
- JavaコードのカバレッジはJaCoCoで集計したい
- GitHub/CIrcleCI/Coverallsの結果をSlackに通知する(ブログでは言及しない)
つまりこういう感じのことをしたいわけです。
ではやっていきます。
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
CircleCIでのビルド状態を示すバッチは、以下の2通りで表示することができます。
→ https://circleci.com/gh/seriwb/utsusemi.svg?style=svg
→ https://circleci.com/gh/seriwb/utsusemi.svg?style=shiled
Coveralls
感想:結構大変だった
READMEに表示されているバッジの仕組みについて、気にはなっていましたが、今までスルーしていたので、その知識が補えて良かったです。 今回は結構苦戦してしまいましたが、わかっていれば10分もあれば終わりそうでした。(今回は4時間ぐらいかけたんですけど。。)
ともあれ、これでいつでもどこからでもテストとカバレッジの状態が見えるようになったので、 後は頑張ってコードを書いていこうと思います。