How to: GitLab test coverage with JaCoCo and Gradle
It's pretty cool if you have informative badges in your README file about your project's "health", and fortunately GitLab has built-in support for two types of CI/CD badges (pipeline status and test coverage). However, it's far from clear how you can make the latter work with JaCoCo and Gradle.
Gradle and JaCoCo
JaCoCo can generate coverage reports in multiple formats, we will use CSV in this case. The generation of CSV reports is disabled by default, so first you have to enable it in your build.gradle
(or build.gradle.kts
if you are using Kotlin DSL):
jacocoTestReport {
reports {
csv.enabled true
csv.destination file("${buildDir}/jacocoCsv")
}
// ... Additional configuration for JaCoCo
}
test {
finalizedBy("jacocoTestReport")
}
Please note that we've also specified where this CSV should be generated to, and told Gradle that it should finalize the test task by running JaCoCo.
.gitlab-ci.yml
In your .gitlab-ci.yml
you have to parse and print the summary of your coverage report, because GitLab can get this information from nowhere, but your job logs. The only magic here is the awk
command, which makes a summary from the CSV and prints it to the log:
# ...
variables:
JACOCO_CSV_LOCATION: '$CI_PROJECT_DIR/build/jacocoCsv'
# ...
stages:
- test
# ...
test:
stage: test
script:
# Any task that runs your tests
- ./gradlew check
- awk -F"," '{ instructions += $4 + $5; covered += $5 } END { print covered, "/", instructions, " instructions covered"; print 100*covered/instructions, "% covered" }' $JACOCO_CSV_LOCATION
Pay attention to the JACOCO_CSV_LOCATION
variable's value, and how it relates to the destination we set in build.gradle
.
GitLab settings
The last step is to provide a regular expression that has a capturing group for our test coverage. You can set this is at Settings -> CI/CD -> General pipelines -> Test coverage parsing .
The expression is the following: ([0-9]{1,3}.[0-9]*).%.covered
Basically that's all. If you set up everything correctly, then right after a new, successful build you should see something like this on this page at the "Coverage report" section: