Skip to content

Commit cb16fc2

Browse files
authored
ci: publish JaCoCo coverage report to PRs (#441)
1 parent b9b6f5b commit cb16fc2

2 files changed

Lines changed: 67 additions & 1 deletion

File tree

‎.github/workflows/gradle-build.yml‎

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ jobs:
5151
if: ${{ needs.check-changes.outputs.build-changes == 'true' || needs.check-changes.outputs.source-changes == 'true' }}
5252
runs-on: ubuntu-latest
5353
permissions:
54+
contents: read
5455
pull-requests: write
5556
outputs:
5657
build-artifacts: ${{ steps.upload-build-artifacts.outputs.artifact-id }}
@@ -75,6 +76,19 @@ jobs:
7576
env:
7677
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
7778
run: ./gradlew check --configuration-cache --parallel
79+
- name: Publish JaCoCo Report to PR
80+
id: jacoco
81+
uses: madrapps/jacoco-report@v1.8.0
82+
if: always() && github.event_name == 'pull_request'
83+
with:
84+
paths: ${{ github.workspace }}/build/reports/jacoco/testCodeCoverageReport/testCodeCoverageReport.xml
85+
token: ${{ secrets.GITHUB_TOKEN }}
86+
min-coverage-overall: 80
87+
min-coverage-changed-lines: 80
88+
title: 'JaCoCo Code Coverage'
89+
update-comment: true
90+
pass-emoji: '✨'
91+
fail-emoji: '🤦🏽'
7892
- name: Upload build artifacts
7993
uses: actions/upload-artifact@v7
8094
id: upload-build-artifacts

‎build.gradle.kts‎

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,58 @@ subprojects {
3939
}
4040
}
4141

42+
tasks.named<JacocoReport>("testCodeCoverageReport") {
43+
val objectFactory = project.objects
44+
val exclusions = listOf(
45+
// Spring Boot @SpringBootApplication entry points and inner classes
46+
"**/*Application.class",
47+
"**/*Application$*.class",
48+
49+
// Spring Boot AOT / GraalVM generated classes (if AOT is run)
50+
"**/*__BeanDefinitions*.class",
51+
"**/*__Autowiring*.class",
52+
"**/*__ApplicationContextInitializer*.class",
53+
54+
// jOOQ generated catalog, schema, keys, and table records in :jooq
55+
"zin/rashidi/boot/jooq/DefaultCatalog.class",
56+
"zin/rashidi/boot/jooq/DefaultSchema.class",
57+
"zin/rashidi/boot/jooq/Indexes.class",
58+
"zin/rashidi/boot/jooq/Keys.class",
59+
"zin/rashidi/boot/jooq/Tables.class",
60+
"zin/rashidi/boot/jooq/tables/**"
61+
)
62+
val defaultClassDirs = objectFactory.fileCollection().from(classDirectories.from.toList())
63+
64+
classDirectories.setFrom(
65+
defaultClassDirs.elements.map { locations ->
66+
locations.map { location ->
67+
objectFactory.fileTree().from(location.asFile).matching {
68+
exclude(exclusions)
69+
}
70+
}
71+
}
72+
)
73+
}
74+
75+
tasks.register<JacocoCoverageVerification>("testCodeCoverageVerification") {
76+
val reportTask = tasks.named<JacocoReport>("testCodeCoverageReport").get()
77+
dependsOn(reportTask)
78+
79+
executionData.setFrom(reportTask.executionData)
80+
classDirectories.setFrom(reportTask.classDirectories)
81+
sourceDirectories.setFrom(reportTask.sourceDirectories)
82+
83+
violationRules {
84+
rule {
85+
limit {
86+
counter = "INSTRUCTION"
87+
minimum = "0.80".toBigDecimal()
88+
}
89+
}
90+
}
91+
}
92+
4293
tasks.check {
4394
dependsOn(tasks.named<JacocoReport>("testCodeCoverageReport"))
44-
}
95+
dependsOn(tasks.named<JacocoCoverageVerification>("testCodeCoverageVerification"))
96+
}

0 commit comments

Comments
 (0)