From 18402a9af8fc08555334a78573df40ae345e900c Mon Sep 17 00:00:00 2001 From: bQUARKz Date: Tue, 7 Apr 2026 06:17:51 +0100 Subject: [PATCH] jacoco report consolidation --- build.gradle.kts | 32 +++++++++++++++++++ .../gradle.java-common-conventions.gradle.kts | 9 ++++++ discussion/index.ndjson | 3 +- .../LSN-0038-jacoco-reports-consolidation.md | 16 ++++++++++ 4 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 build.gradle.kts create mode 100644 discussion/lessons/DSC-0024-jacoco-reports-consolidation/LSN-0038-jacoco-reports-consolidation.md diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 00000000..1984650c --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,32 @@ +plugins { + base + jacoco +} + +repositories { + mavenCentral() +} + +dependencies { +} + +val jacocoTestReport = tasks.register("jacocoTestReport") { + group = "Verification" + description = "Generates a consolidated JaCoCo report for all subprojects." + + val javaSubprojects = subprojects.filter { subproject -> + subproject.subprojects.isEmpty() && subproject.plugins.hasPlugin("java") + } + + dependsOn(javaSubprojects.map { it.tasks.withType() }) + + additionalSourceDirs.setFrom(javaSubprojects.map { it.layout.projectDirectory.dir("src/main/java") }) + sourceDirectories.setFrom(javaSubprojects.map { it.layout.projectDirectory.dir("src/main/java") }) + classDirectories.setFrom(javaSubprojects.map { it.layout.buildDirectory.dir("classes/java/main") }) + executionData.setFrom(fileTree(projectDir).include("**/build/jacoco/*.exec")) + + reports { + xml.required.set(true) + html.required.set(true) + } +} diff --git a/buildSrc/src/main/kotlin/gradle.java-common-conventions.gradle.kts b/buildSrc/src/main/kotlin/gradle.java-common-conventions.gradle.kts index 1d4df0d5..e481000a 100644 --- a/buildSrc/src/main/kotlin/gradle.java-common-conventions.gradle.kts +++ b/buildSrc/src/main/kotlin/gradle.java-common-conventions.gradle.kts @@ -1,5 +1,6 @@ plugins { java + jacoco } repositories { @@ -34,4 +35,12 @@ java { tasks.named("test") { useJUnitPlatform() + finalizedBy("jacocoTestReport") +} + +tasks.withType { + reports { + xml.required.set(true) + html.required.set(true) + } } diff --git a/discussion/index.ndjson b/discussion/index.ndjson index 85c6e4a0..e34032c3 100644 --- a/discussion/index.ndjson +++ b/discussion/index.ndjson @@ -1,4 +1,5 @@ -{"type":"meta","next_id":{"DSC":23,"AGD":25,"DEC":23,"PLN":46,"LSN":37,"CLSN":1}} +{"type":"meta","next_id":{"DSC":24,"AGD":26,"DEC":24,"PLN":47,"LSN":38,"CLSN":1}} +{"type":"discussion","id":"DSC-0024","status":"done","ticket":"jacoco-reports-consolidation","title":"JaCoCo Reports Consolidation in Gradle","created_at":"2026-04-07","updated_at":"2026-04-07","tags":["infra","gradle","jacoco","coverage","jenkins"],"agendas":[],"decisions":[],"plans":[],"lessons":[{"id":"LSN-0038","file":"discussion/lessons/DSC-0024-jacoco-reports-consolidation/LSN-0038-jacoco-reports-consolidation.md","status":"done","created_at":"2026-04-07","updated_at":"2026-04-07"}]} {"type":"discussion","id":"DSC-0001","status":"done","ticket":"studio-docs-import","title":"Import docs/studio into discussion-framework artifacts","created_at":"2026-03-26","updated_at":"2026-03-26","tags":["studio","migration","discussion-framework","docs-import"],"agendas":[],"decisions":[],"plans":[],"lessons":[{"id":"LSN-0001","file":"discussion/lessons/DSC-0001-studio-docs-import/LSN-0001-assets-workspace-execution-wave-legacy.md","status":"done","created_at":"2026-03-26","updated_at":"2026-03-26"},{"id":"LSN-0002","file":"discussion/lessons/DSC-0001-studio-docs-import/LSN-0002-bank-composition-editor-legacy.md","status":"done","created_at":"2026-03-26","updated_at":"2026-03-26"},{"id":"LSN-0003","file":"discussion/lessons/DSC-0001-studio-docs-import/LSN-0003-mental-model-asset-mutations-legacy.md","status":"done","created_at":"2026-03-26","updated_at":"2026-03-26"},{"id":"LSN-0004","file":"discussion/lessons/DSC-0001-studio-docs-import/LSN-0004-mental-model-assets-workspace-legacy.md","status":"done","created_at":"2026-03-26","updated_at":"2026-03-26"},{"id":"LSN-0005","file":"discussion/lessons/DSC-0001-studio-docs-import/LSN-0005-mental-model-studio-events-and-components-legacy.md","status":"done","created_at":"2026-03-26","updated_at":"2026-03-26"},{"id":"LSN-0006","file":"discussion/lessons/DSC-0001-studio-docs-import/LSN-0006-mental-model-studio-shell-legacy.md","status":"done","created_at":"2026-03-26","updated_at":"2026-03-26"},{"id":"LSN-0007","file":"discussion/lessons/DSC-0001-studio-docs-import/LSN-0007-pack-wizard-shell-legacy.md","status":"done","created_at":"2026-03-26","updated_at":"2026-03-26"},{"id":"LSN-0008","file":"discussion/lessons/DSC-0001-studio-docs-import/LSN-0008-project-scoped-state-and-activity-legacy.md","status":"done","created_at":"2026-03-26","updated_at":"2026-03-26"},{"id":"LSN-0016","file":"discussion/lessons/DSC-0001-studio-docs-import/LSN-0016-studio-docs-import-pattern.md","status":"done","created_at":"2026-03-26","updated_at":"2026-03-26"}]} {"type":"discussion","id":"DSC-0002","status":"open","ticket":"palette-management-in-studio","title":"Palette Management in Studio","created_at":"2026-03-26","updated_at":"2026-03-26","tags":["studio","legacy-import","palette-management","tile-bank","packer-boundary"],"agendas":[{"id":"AGD-0002","file":"AGD-0002-palette-management-in-studio.md","status":"open","created_at":"2026-03-26","updated_at":"2026-03-26"}],"decisions":[],"plans":[],"lessons":[]} {"type":"discussion","id":"DSC-0003","status":"done","ticket":"packer-docs-import","title":"Import docs/packer into discussion-framework artifacts","created_at":"2026-03-26","updated_at":"2026-03-26","tags":["packer","migration","discussion-framework","docs-import"],"agendas":[],"decisions":[],"plans":[],"lessons":[{"id":"LSN-0009","file":"discussion/lessons/DSC-0003-packer-docs-import/LSN-0009-mental-model-packer-legacy.md","status":"done","created_at":"2026-03-26","updated_at":"2026-03-26"},{"id":"LSN-0010","file":"discussion/lessons/DSC-0003-packer-docs-import/LSN-0010-asset-identity-and-runtime-contract-legacy.md","status":"done","created_at":"2026-03-26","updated_at":"2026-03-26"},{"id":"LSN-0011","file":"discussion/lessons/DSC-0003-packer-docs-import/LSN-0011-foundations-workspace-runtime-and-build-legacy.md","status":"done","created_at":"2026-03-26","updated_at":"2026-03-26"},{"id":"LSN-0012","file":"discussion/lessons/DSC-0003-packer-docs-import/LSN-0012-runtime-ownership-and-studio-boundary-legacy.md","status":"done","created_at":"2026-03-26","updated_at":"2026-03-26"},{"id":"LSN-0013","file":"discussion/lessons/DSC-0003-packer-docs-import/LSN-0013-metadata-convergence-and-runtime-sink-legacy.md","status":"done","created_at":"2026-03-26","updated_at":"2026-03-26"},{"id":"LSN-0014","file":"discussion/lessons/DSC-0003-packer-docs-import/LSN-0014-pack-wizard-summary-validation-and-pack-execution-legacy.md","status":"done","created_at":"2026-03-26","updated_at":"2026-03-26"},{"id":"LSN-0015","file":"discussion/lessons/DSC-0003-packer-docs-import/LSN-0015-tile-bank-packing-contract-legacy.md","status":"done","created_at":"2026-03-26","updated_at":"2026-03-26"},{"id":"LSN-0017","file":"discussion/lessons/DSC-0003-packer-docs-import/LSN-0017-packer-docs-import-pattern.md","status":"done","created_at":"2026-03-26","updated_at":"2026-03-26"}]} diff --git a/discussion/lessons/DSC-0024-jacoco-reports-consolidation/LSN-0038-jacoco-reports-consolidation.md b/discussion/lessons/DSC-0024-jacoco-reports-consolidation/LSN-0038-jacoco-reports-consolidation.md new file mode 100644 index 00000000..3caeb987 --- /dev/null +++ b/discussion/lessons/DSC-0024-jacoco-reports-consolidation/LSN-0038-jacoco-reports-consolidation.md @@ -0,0 +1,16 @@ +# LSN-0038: JaCoCo Reports Consolidation in Gradle + +- **Problem:** Múltiplos módulos Gradle gerando reports individuais de cobertura de código, dificultando a visão consolidada para o Jenkins. +- **Decision:** Implementar o plugin JaCoCo via `buildSrc` para todos os subprojetos e criar uma task de agregação customizada no root project. +- **Implementation:** + - `buildSrc/src/main/kotlin/gradle.java-common-conventions.gradle.kts`: Aplicado o plugin `jacoco` e configurado o `jacocoTestReport` para rodar após o `test`. + - `build.gradle.kts` (Root): Criada a task `jacocoTestReport` que agrega `executionData`, `sourceDirectories` e `classDirectories` de todos os subprojetos Java folha. +- **Example:** + - Rodar `./gradlew test jacocoTestReport` gera: + - Reports individuais: `/build/reports/jacoco/test/html/index.html` + - Report consolidado: `build/reports/jacoco/jacocoTestReport/html/index.html` +- **Pitfalls:** + - O plugin `jacoco-report-aggregation` nativo do Gradle pode ter problemas com estruturas de subprojetos aninhados que não possuem o plugin Java aplicado. A task customizada no root é mais robusta para este layout. + - É importante filtrar apenas subprojetos "folha" (sem subprojetos próprios) que aplicam o plugin `java` para evitar erros de diretórios inexistentes. +- **References:** + - `DSC-0024`, `DEC-0024`, `PLN-0047`.