From f8cf4fa2ad8fdb4b881e9b143ccfd3810743d418 Mon Sep 17 00:00:00 2001 From: James Daugherty Date: Thu, 28 May 2026 12:28:57 -0400 Subject: [PATCH 1/9] Add grails-jacoco convention plugin and Codecov coverage workflow Adds a grails-jacoco convention plugin that configures JaCoCo per subproject and registers a root jacocoAggregateReport task producing a single XML report for Codecov, handling the hibernate5/hibernate7 duplicate-class case. Applies grails-jacoco to 96 subprojects and adds the Coverage workflow that uploads to the existing codecov.yml configuration. Layers on top of PR-G (grails-code-analysis / grails-violation-aggregation), which provides the build-logic test infrastructure and plugin registration scaffold. Folds in the standalone coverage work from #15668. Extracted from the Hibernate 7 staging branch (PR #15654) per review feedback that JaCoCo should be introduced as its own focused PR for the project to review independently. Assisted-by: claude-code:claude-4.7-opus --- .github/workflows/coverage.yml | 117 ++++++++++++ build-logic/plugins/build.gradle | 4 + .../grails/buildsrc/GrailsJacocoPlugin.groovy | 118 ++++++++++++ .../buildsrc/GrailsJacocoPluginSpec.groovy | 178 ++++++++++++++++++ grails-async/core/build.gradle | 1 + grails-async/gpars/build.gradle | 1 + grails-async/plugin/build.gradle | 1 + grails-async/rxjava/build.gradle | 1 + grails-async/rxjava2/build.gradle | 1 + grails-async/rxjava3/build.gradle | 1 + grails-bootstrap/build.gradle | 1 + grails-cache/build.gradle | 1 + grails-codecs-core/build.gradle | 1 + grails-codecs/build.gradle | 1 + grails-common/build.gradle | 1 + grails-console/build.gradle | 1 + grails-controllers/build.gradle | 1 + grails-converters/build.gradle | 1 + grails-core/build.gradle | 1 + .../boot-plugin/build.gradle | 1 + grails-data-hibernate5/core/build.gradle | 1 + .../dbmigration/build.gradle | 1 + .../grails-plugin/build.gradle | 1 + .../spring-orm/build.gradle | 1 + grails-data-mongodb/boot-plugin/build.gradle | 1 + grails-data-mongodb/bson/build.gradle | 1 + grails-data-mongodb/core/build.gradle | 1 + grails-data-mongodb/ext/build.gradle | 1 + .../grails-plugin/build.gradle | 1 + .../gson-templates/build.gradle | 1 + grails-data-simple/build.gradle | 1 + grails-databinding-core/build.gradle | 1 + grails-databinding/build.gradle | 1 + grails-datamapping-async/build.gradle | 1 + grails-datamapping-core/build.gradle | 1 + grails-datamapping-rx/build.gradle | 1 + grails-datamapping-support/build.gradle | 1 + grails-datamapping-tck/build.gradle | 1 + grails-datamapping-validation/build.gradle | 1 + grails-datasource/build.gradle | 1 + grails-datastore-async/build.gradle | 1 + grails-datastore-core/build.gradle | 1 + grails-datastore-web/build.gradle | 1 + grails-domain-class/build.gradle | 1 + grails-encoder/build.gradle | 1 + grails-events/core/build.gradle | 1 + grails-events/gpars/build.gradle | 1 + grails-events/plugin/build.gradle | 1 + grails-events/rxjava/build.gradle | 1 + grails-events/rxjava2/build.gradle | 1 + grails-events/rxjava3/build.gradle | 1 + grails-events/spring/build.gradle | 1 + grails-events/transforms/build.gradle | 1 + grails-fields/build.gradle | 1 + grails-geb/build.gradle | 1 + grails-gradle/common/build.gradle | 1 + grails-gradle/model/build.gradle | 1 + grails-gradle/plugins/build.gradle | 1 + grails-gradle/tasks/build.gradle | 1 + grails-gsp/core/build.gradle | 1 + grails-gsp/grails-layout/build.gradle | 1 + grails-gsp/grails-sitemesh3/build.gradle | 1 + grails-gsp/grails-taglib/build.gradle | 1 + grails-gsp/grails-web-gsp-taglib/build.gradle | 1 + grails-gsp/grails-web-gsp/build.gradle | 1 + grails-gsp/grails-web-jsp/build.gradle | 1 + grails-gsp/grails-web-taglib/build.gradle | 1 + grails-gsp/plugin/build.gradle | 1 + grails-i18n/build.gradle | 1 + grails-interceptors/build.gradle | 1 + grails-logging/build.gradle | 1 + grails-mimetypes/build.gradle | 1 + grails-rest-transforms/build.gradle | 1 + grails-scaffolding/build.gradle | 1 + grails-services/build.gradle | 1 + grails-shell-cli/build.gradle | 1 + grails-spring/build.gradle | 1 + grails-test-core/build.gradle | 1 + grails-test-suite-base/build.gradle | 1 + grails-testing-support-core/build.gradle | 1 + .../build.gradle | 1 + .../build.gradle | 1 + .../build.gradle | 1 + .../build.gradle | 1 + .../build.gradle | 1 + grails-testing-support-mongodb/build.gradle | 1 + .../build.gradle | 1 + grails-testing-support-web/build.gradle | 1 + grails-url-mappings/build.gradle | 1 + grails-validation/build.gradle | 1 + grails-views-core/build.gradle | 1 + grails-views-gson/build.gradle | 1 + grails-views-markup/build.gradle | 1 + grails-web-boot/build.gradle | 1 + grails-web-common/build.gradle | 1 + grails-web-core/build.gradle | 1 + grails-web-databinding/build.gradle | 1 + grails-web-mvc/build.gradle | 1 + grails-web-url-mappings/build.gradle | 1 + grails-wrapper/build.gradle | 1 + 100 files changed, 513 insertions(+) create mode 100644 .github/workflows/coverage.yml create mode 100644 build-logic/plugins/src/main/groovy/org/apache/grails/buildsrc/GrailsJacocoPlugin.groovy create mode 100644 build-logic/plugins/src/test/groovy/org/apache/grails/buildsrc/GrailsJacocoPluginSpec.groovy diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml new file mode 100644 index 00000000000..d3aea1995f3 --- /dev/null +++ b/.github/workflows/coverage.yml @@ -0,0 +1,117 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +name: "Coverage" + +on: + push: + branches: + - '[0-9]+.[0-9]+.x' + - '8.0.x-hibernate7.*' + pull_request: + workflow_dispatch: + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: ${{ github.event_name == 'pull_request' }} + +jobs: + coverage-core: + name: "Coverage - grails-core (${{ matrix.os }})" + if: ${{ !contains(github.event.head_commit.message, '[skip tests]') }} + strategy: + fail-fast: false + matrix: + os: [ubuntu-24.04, macos-latest, windows-latest] + runs-on: ${{ matrix.os }} + steps: + - name: "📥 Checkout repository" + uses: actions/checkout@v6 + - name: "☕️ Setup JDK" + uses: actions/setup-java@v4 + with: + distribution: liberica + java-version: 21 + - name: "🐘 Setup Gradle" + uses: gradle/actions/setup-gradle@4d9f0ba0025fe599b4ebab900eb7f3a1d93ef4c2 # v5.0.0 + with: + develocity-access-key: ${{ secrets.DEVELOCITY_ACCESS_KEY }} + - name: "🌡️ Run tests with coverage" + run: > + ./gradlew jacocoAggregateReport + --continue + --stacktrace + -PskipCodeStyle + - name: "📤 Upload coverage artifact" + uses: actions/upload-artifact@v7.0.1 + with: + name: coverage-core-${{ matrix.os }} + path: build/reports/jacoco/aggregate/jacocoAggregateReport.xml + if-no-files-found: warn + + coverage-gradle: + name: "Coverage - grails-gradle (${{ matrix.os }})" + if: ${{ !contains(github.event.head_commit.message, '[skip tests]') }} + strategy: + fail-fast: false + matrix: + os: [ubuntu-24.04, macos-latest, windows-latest] + runs-on: ${{ matrix.os }} + steps: + - name: "📥 Checkout repository" + uses: actions/checkout@v6 + - name: "☕️ Setup JDK" + uses: actions/setup-java@v4 + with: + distribution: liberica + java-version: 21 + - name: "🐘 Setup Gradle" + uses: gradle/actions/setup-gradle@4d9f0ba0025fe599b4ebab900eb7f3a1d93ef4c2 # v5.0.0 + with: + develocity-access-key: ${{ secrets.DEVELOCITY_ACCESS_KEY }} + - name: "🌡️ Run tests with coverage" + working-directory: grails-gradle + run: > + ./gradlew jacocoAggregateReport + --continue + --stacktrace + -PskipCodeStyle + - name: "📤 Upload coverage artifact" + uses: actions/upload-artifact@v7.0.1 + with: + name: coverage-gradle-${{ matrix.os }} + path: grails-gradle/build/reports/jacoco/aggregate/jacocoAggregateReport.xml + if-no-files-found: warn + + upload-coverage: + name: "Upload Coverage to Codecov" + needs: [coverage-core, coverage-gradle] + # Run even if some matrix legs fail so partial coverage is still uploaded + if: always() + runs-on: ubuntu-24.04 + steps: + - name: "📥 Checkout repository" + uses: actions/checkout@v6 + - name: "📥 Download all coverage artifacts" + uses: actions/download-artifact@v7.0.0 + with: + path: coverage-reports + - name: "📊 Upload coverage to Codecov" + continue-on-error: true + uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # v6.0.0 + with: + token: ${{ secrets.CODECOV_TOKEN }} + directory: coverage-reports + verbose: true diff --git a/build-logic/plugins/build.gradle b/build-logic/plugins/build.gradle index b196ee24316..b4917a4ae61 100644 --- a/build-logic/plugins/build.gradle +++ b/build-logic/plugins/build.gradle @@ -75,6 +75,10 @@ gradlePlugin { id = 'org.apache.grails.gradle.grails-code-analysis' implementationClass = 'org.apache.grails.buildsrc.GrailsCodeAnalysisPlugin' } + register('grailsJacoco') { + id = 'org.apache.grails.gradle.grails-jacoco' + implementationClass = 'org.apache.grails.buildsrc.GrailsJacocoPlugin' + } register('grailsViolationAggregation') { id = 'org.apache.grails.gradle.grails-violation-aggregation' implementationClass = 'org.apache.grails.buildsrc.GrailsViolationAggregationPlugin' diff --git a/build-logic/plugins/src/main/groovy/org/apache/grails/buildsrc/GrailsJacocoPlugin.groovy b/build-logic/plugins/src/main/groovy/org/apache/grails/buildsrc/GrailsJacocoPlugin.groovy new file mode 100644 index 00000000000..0071fa61e9f --- /dev/null +++ b/build-logic/plugins/src/main/groovy/org/apache/grails/buildsrc/GrailsJacocoPlugin.groovy @@ -0,0 +1,118 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.grails.buildsrc + +import groovy.transform.CompileDynamic + +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.api.plugins.JavaPlugin +import org.gradle.api.tasks.testing.Test +import org.gradle.testing.jacoco.plugins.JacocoPlugin +import org.gradle.testing.jacoco.plugins.JacocoPluginExtension +import org.gradle.testing.jacoco.tasks.JacocoReport + +/** + * Convention plugin for JaCoCo code coverage. Apply to each subproject that compiles code. + * + * In addition to configuring per-subproject coverage, this plugin lazily registers a + * jacocoAggregateReport task on the root project the first time it is applied, then wires + * each subproject's exec data into that task. The aggregate produces a single XML report + * at build/reports/jacoco/aggregate/jacocoAggregateReport.xml suitable for Codecov upload. + */ +@CompileDynamic +class GrailsJacocoPlugin implements Plugin { + + static final String AGGREGATE_TASK_NAME = 'jacocoAggregateReport' + + @Override + void apply(Project project) { + project.logger.info("Configuring JaCoCo for project: ${project.name}") + project.pluginManager.apply(JacocoPlugin) + + project.extensions.configure(JacocoPluginExtension) { + it.toolVersion = '0.8.14' + } + + project.tasks.withType(Test).configureEach { + it.finalizedBy 'jacocoTestReport' + } + + project.tasks.withType(JacocoReport).configureEach { + it.dependsOn project.tasks.withType(Test) + it.reports { + it.xml.required = true + it.html.required = true + it.csv.required = true + } + } + + contributeToRootAggregateReport(project) + } + + private static void contributeToRootAggregateReport(Project project) { + Project root = project.rootProject + + // Ensure JacocoPlugin is on the root so its JacocoReport task has tooling available. + // pluginManager.apply is idempotent — safe to call from every subproject. + root.pluginManager.apply(JacocoPlugin) + + // Register the aggregate task once on the first apply; subsequent subprojects find it by name. + def aggregateTask + if (root.tasks.names.contains(AGGREGATE_TASK_NAME)) { + aggregateTask = root.tasks.named(AGGREGATE_TASK_NAME, JacocoReport) + } else { + aggregateTask = root.tasks.register(AGGREGATE_TASK_NAME, JacocoReport) { JacocoReport task -> + task.group = 'verification' + task.description = 'Aggregates JaCoCo coverage from all subprojects into a single XML report for Codecov.' + task.reports { + it.xml.required = true + it.xml.outputLocation = root.layout.buildDirectory.file( + 'reports/jacoco/aggregate/jacocoAggregateReport.xml' + ) + it.html.required = false + it.csv.required = false + } + task.onlyIf { JacocoReport t -> !t.executionData.files.isEmpty() } + } + } + + // Wire this subproject's test exec data into the aggregate. + aggregateTask.configure { JacocoReport task -> + task.dependsOn project.tasks.withType(Test) + task.executionData.from( + project.fileTree(project.file('build/jacoco')) { include '*.exec' } + ) + } + + // Add source and class directories once the Java plugin is confirmed present. + // Hibernate 7 variant subprojects compile identical class names to their Hibernate 5 + // counterparts; including both causes JaCoCo to throw "Can't add different class with + // same name". Exec data from H7 test runs is still included above so their coverage + // is attributed to the H5 class definitions. + if (!project.path.contains('hibernate7')) { + project.plugins.withType(JavaPlugin) { + aggregateTask.configure { JacocoReport task -> + task.sourceDirectories.from(project.sourceSets.main.allSource.srcDirs) + task.classDirectories.from(project.sourceSets.main.output.classesDirs) + } + } + } + } +} diff --git a/build-logic/plugins/src/test/groovy/org/apache/grails/buildsrc/GrailsJacocoPluginSpec.groovy b/build-logic/plugins/src/test/groovy/org/apache/grails/buildsrc/GrailsJacocoPluginSpec.groovy new file mode 100644 index 00000000000..5ee04174959 --- /dev/null +++ b/build-logic/plugins/src/test/groovy/org/apache/grails/buildsrc/GrailsJacocoPluginSpec.groovy @@ -0,0 +1,178 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.grails.buildsrc + +import org.gradle.testkit.runner.GradleRunner +import org.gradle.testkit.runner.TaskOutcome +import spock.lang.Specification +import spock.lang.TempDir + +import java.nio.file.Path + +class GrailsJacocoPluginSpec extends Specification { + + @TempDir + Path testProjectDir + + def setup() { + testProjectDir.resolve('settings.gradle').toFile().text = '' + testProjectDir.resolve('build.gradle').toFile().text = """ + plugins { + id 'groovy' + id 'org.apache.grails.gradle.grails-jacoco' + } + repositories { + mavenCentral() + } + """ + def src = testProjectDir.resolve('src/main/groovy/com/example/Foo.groovy').toFile() + src.parentFile.mkdirs() + src.text = 'package com.example\nclass Foo {}' + } + + def "jacoco plugin applies JaCoCo and registers jacocoTestReport task"() { + when: "listing verification tasks" + def result = GradleRunner.create() + .withProjectDir(testProjectDir.toFile()) + .withArguments('tasks', '--group=verification') + .withPluginClasspath() + .build() + + then: "jacocoTestReport is present" + result.output.contains('jacocoTestReport') + } + + def "jacocoTestReport generates xml html and csv reports"() { + when: "listing all tasks" + def result = GradleRunner.create() + .withProjectDir(testProjectDir.toFile()) + .withArguments('tasks', '--all') + .withPluginClasspath() + .build() + + then: "aggregateJacocoCoverage is not registered (that task belongs to grails-violation-aggregation)" + !result.output.contains('aggregateJacocoCoverage') + } + + def "jacocoAggregateReport is registered on the root project in a multi-project build"() { + given: "a multi-project build where a subproject applies grails-jacoco" + testProjectDir.resolve('settings.gradle').toFile().text = "include 'app-module'" + testProjectDir.resolve('build.gradle').toFile().text = '' + def moduleDir = testProjectDir.resolve('app-module') + moduleDir.toFile().mkdirs() + moduleDir.resolve('build.gradle').toFile().text = """ + plugins { + id 'groovy' + id 'org.apache.grails.gradle.grails-jacoco' + } + repositories { mavenCentral() } + """ + + when: "listing verification tasks on the root" + def result = GradleRunner.create() + .withProjectDir(testProjectDir.toFile()) + .withArguments('tasks', '--group=verification') + .withPluginClasspath() + .build() + + then: "jacocoAggregateReport appears on the root" + result.output.contains('jacocoAggregateReport') + } + + def "jacocoAggregateReport includes the subproject test task as a dependency"() { + given: "a multi-project build" + testProjectDir.resolve('settings.gradle').toFile().text = "include 'app-module'" + testProjectDir.resolve('build.gradle').toFile().text = '' + def moduleDir = testProjectDir.resolve('app-module') + moduleDir.toFile().mkdirs() + moduleDir.resolve('build.gradle').toFile().text = """ + plugins { + id 'groovy' + id 'org.apache.grails.gradle.grails-jacoco' + } + repositories { mavenCentral() } + """ + + when: "doing a dry run" + def result = GradleRunner.create() + .withProjectDir(testProjectDir.toFile()) + .withArguments('jacocoAggregateReport', '--dry-run') + .withPluginClasspath() + .build() + + then: "the subproject test task is in the execution plan" + result.output.contains(':app-module:test') + } + + def "jacocoAggregateReport is skipped when no exec files exist"() { + given: "a multi-project build with tests excluded so no exec files are produced" + testProjectDir.resolve('settings.gradle').toFile().text = "include 'app-module'" + testProjectDir.resolve('build.gradle').toFile().text = '' + def moduleDir = testProjectDir.resolve('app-module') + moduleDir.toFile().mkdirs() + moduleDir.resolve('build.gradle').toFile().text = """ + plugins { + id 'groovy' + id 'org.apache.grails.gradle.grails-jacoco' + } + repositories { mavenCentral() } + """ + + when: "running jacocoAggregateReport with tests excluded" + def result = GradleRunner.create() + .withProjectDir(testProjectDir.toFile()) + .withArguments('jacocoAggregateReport', '-x', 'test', '--stacktrace') + .withPluginClasspath() + .build() + + then: "the task is skipped because executionData is empty" + result.task(':jacocoAggregateReport').outcome == TaskOutcome.SKIPPED + } + + def "each additional subproject with grails-jacoco wires itself into the same aggregate task"() { + given: "two subprojects both applying grails-jacoco" + testProjectDir.resolve('settings.gradle').toFile().text = "include 'module-a', 'module-b'" + testProjectDir.resolve('build.gradle').toFile().text = '' + ['module-a', 'module-b'].each { name -> + def dir = testProjectDir.resolve(name) + dir.toFile().mkdirs() + dir.resolve('build.gradle').toFile().text = """ + plugins { + id 'groovy' + id 'org.apache.grails.gradle.grails-jacoco' + } + repositories { mavenCentral() } + """ + } + + when: "doing a dry run" + def result = GradleRunner.create() + .withProjectDir(testProjectDir.toFile()) + .withArguments('jacocoAggregateReport', '--dry-run') + .withPluginClasspath() + .build() + + then: "both subproject test tasks appear as dependencies" + result.output.contains(':module-a:test') + result.output.contains(':module-b:test') + + and: "only one aggregate task is registered on the root" + result.output.count('jacocoAggregateReport') == 1 + } +} diff --git a/grails-async/core/build.gradle b/grails-async/core/build.gradle index b2f5f45bc13..bbb0f24d460 100644 --- a/grails-async/core/build.gradle +++ b/grails-async/core/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-async/gpars/build.gradle b/grails-async/gpars/build.gradle index e30f7d2e281..d46431ab2a4 100644 --- a/grails-async/gpars/build.gradle +++ b/grails-async/gpars/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-async/plugin/build.gradle b/grails-async/plugin/build.gradle index 73984e20e09..31a5206673e 100644 --- a/grails-async/plugin/build.gradle +++ b/grails-async/plugin/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-async/rxjava/build.gradle b/grails-async/rxjava/build.gradle index 9494becc598..3326aa8eae4 100644 --- a/grails-async/rxjava/build.gradle +++ b/grails-async/rxjava/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-async/rxjava2/build.gradle b/grails-async/rxjava2/build.gradle index aa269ef1b8d..188ae1a4079 100644 --- a/grails-async/rxjava2/build.gradle +++ b/grails-async/rxjava2/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-async/rxjava3/build.gradle b/grails-async/rxjava3/build.gradle index 25e643124b4..f138f1f6f1c 100644 --- a/grails-async/rxjava3/build.gradle +++ b/grails-async/rxjava3/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-bootstrap/build.gradle b/grails-bootstrap/build.gradle index 22b423f1494..bff4b69f1e7 100644 --- a/grails-bootstrap/build.gradle +++ b/grails-bootstrap/build.gradle @@ -30,6 +30,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-cache/build.gradle b/grails-cache/build.gradle index 45c83921c40..4bcfd27af54 100644 --- a/grails-cache/build.gradle +++ b/grails-cache/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-codecs-core/build.gradle b/grails-codecs-core/build.gradle index 8b952e765f4..a787c9deb5e 100644 --- a/grails-codecs-core/build.gradle +++ b/grails-codecs-core/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-codecs/build.gradle b/grails-codecs/build.gradle index 47fbaab85cd..6151aa6bfc1 100644 --- a/grails-codecs/build.gradle +++ b/grails-codecs/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-common/build.gradle b/grails-common/build.gradle index f6ca3c40f17..0bb4998d4cf 100644 --- a/grails-common/build.gradle +++ b/grails-common/build.gradle @@ -26,6 +26,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-console/build.gradle b/grails-console/build.gradle index 21b341638da..4b06bca58ea 100644 --- a/grails-console/build.gradle +++ b/grails-console/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-controllers/build.gradle b/grails-controllers/build.gradle index 962430281be..24fe759f905 100644 --- a/grails-controllers/build.gradle +++ b/grails-controllers/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-converters/build.gradle b/grails-converters/build.gradle index 22e3e605e1a..ccc99fd8a9f 100644 --- a/grails-converters/build.gradle +++ b/grails-converters/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-core/build.gradle b/grails-core/build.gradle index bbea195d0db..32da709a797 100644 --- a/grails-core/build.gradle +++ b/grails-core/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-data-hibernate5/boot-plugin/build.gradle b/grails-data-hibernate5/boot-plugin/build.gradle index 6dfcb4389df..448832a429c 100644 --- a/grails-data-hibernate5/boot-plugin/build.gradle +++ b/grails-data-hibernate5/boot-plugin/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-data-hibernate5/core/build.gradle b/grails-data-hibernate5/core/build.gradle index 4838afb4afd..17a66c2348f 100644 --- a/grails-data-hibernate5/core/build.gradle +++ b/grails-data-hibernate5/core/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-data-hibernate5/dbmigration/build.gradle b/grails-data-hibernate5/dbmigration/build.gradle index 342dbcfb17a..36c714199bf 100644 --- a/grails-data-hibernate5/dbmigration/build.gradle +++ b/grails-data-hibernate5/dbmigration/build.gradle @@ -26,6 +26,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-data-hibernate5/grails-plugin/build.gradle b/grails-data-hibernate5/grails-plugin/build.gradle index dd0a1a13dea..e7f272e38b8 100644 --- a/grails-data-hibernate5/grails-plugin/build.gradle +++ b/grails-data-hibernate5/grails-plugin/build.gradle @@ -26,6 +26,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-data-hibernate5/spring-orm/build.gradle b/grails-data-hibernate5/spring-orm/build.gradle index 6e65fbdc636..f5b90646679 100644 --- a/grails-data-hibernate5/spring-orm/build.gradle +++ b/grails-data-hibernate5/spring-orm/build.gradle @@ -29,6 +29,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-data-mongodb/boot-plugin/build.gradle b/grails-data-mongodb/boot-plugin/build.gradle index 31a76648f24..7fde1f36ff3 100644 --- a/grails-data-mongodb/boot-plugin/build.gradle +++ b/grails-data-mongodb/boot-plugin/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-data-mongodb/bson/build.gradle b/grails-data-mongodb/bson/build.gradle index 6c1e0243bb8..7fd2d5022c5 100644 --- a/grails-data-mongodb/bson/build.gradle +++ b/grails-data-mongodb/bson/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-data-mongodb/core/build.gradle b/grails-data-mongodb/core/build.gradle index 94c1e6d97e1..c9a48d4b664 100644 --- a/grails-data-mongodb/core/build.gradle +++ b/grails-data-mongodb/core/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-data-mongodb/ext/build.gradle b/grails-data-mongodb/ext/build.gradle index 982b44960db..16f0e30c4c5 100644 --- a/grails-data-mongodb/ext/build.gradle +++ b/grails-data-mongodb/ext/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-data-mongodb/grails-plugin/build.gradle b/grails-data-mongodb/grails-plugin/build.gradle index c22e6dca21e..553b6d5de94 100644 --- a/grails-data-mongodb/grails-plugin/build.gradle +++ b/grails-data-mongodb/grails-plugin/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-data-mongodb/gson-templates/build.gradle b/grails-data-mongodb/gson-templates/build.gradle index da0d0758faa..b9c3ac8d7da 100644 --- a/grails-data-mongodb/gson-templates/build.gradle +++ b/grails-data-mongodb/gson-templates/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-data-simple/build.gradle b/grails-data-simple/build.gradle index 1290a63ad55..6f056842b90 100644 --- a/grails-data-simple/build.gradle +++ b/grails-data-simple/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-databinding-core/build.gradle b/grails-databinding-core/build.gradle index cee4c8051b6..6acbb1d267c 100644 --- a/grails-databinding-core/build.gradle +++ b/grails-databinding-core/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-databinding/build.gradle b/grails-databinding/build.gradle index 363c0012853..dedfee2aaf7 100644 --- a/grails-databinding/build.gradle +++ b/grails-databinding/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-datamapping-async/build.gradle b/grails-datamapping-async/build.gradle index 00c2afdff4a..c300d670689 100644 --- a/grails-datamapping-async/build.gradle +++ b/grails-datamapping-async/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-datamapping-core/build.gradle b/grails-datamapping-core/build.gradle index 700db6df885..daea719e72e 100644 --- a/grails-datamapping-core/build.gradle +++ b/grails-datamapping-core/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-datamapping-rx/build.gradle b/grails-datamapping-rx/build.gradle index e0d5c9d6ea9..15e9efc507b 100644 --- a/grails-datamapping-rx/build.gradle +++ b/grails-datamapping-rx/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-datamapping-support/build.gradle b/grails-datamapping-support/build.gradle index 78a342a5c8d..e2ed2168d7e 100644 --- a/grails-datamapping-support/build.gradle +++ b/grails-datamapping-support/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-datamapping-tck/build.gradle b/grails-datamapping-tck/build.gradle index bc42a8baa44..ac1fa0ab0a8 100644 --- a/grails-datamapping-tck/build.gradle +++ b/grails-datamapping-tck/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-datamapping-validation/build.gradle b/grails-datamapping-validation/build.gradle index accbf04ac20..4483682f671 100644 --- a/grails-datamapping-validation/build.gradle +++ b/grails-datamapping-validation/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-datasource/build.gradle b/grails-datasource/build.gradle index c6cf03293e3..b2ea1a4ed66 100644 --- a/grails-datasource/build.gradle +++ b/grails-datasource/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-datastore-async/build.gradle b/grails-datastore-async/build.gradle index edb0d968a26..3afeb114b18 100644 --- a/grails-datastore-async/build.gradle +++ b/grails-datastore-async/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-datastore-core/build.gradle b/grails-datastore-core/build.gradle index 85da8ab7a1c..e387419b777 100644 --- a/grails-datastore-core/build.gradle +++ b/grails-datastore-core/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-datastore-web/build.gradle b/grails-datastore-web/build.gradle index 7589e7531e9..e0c76671d95 100644 --- a/grails-datastore-web/build.gradle +++ b/grails-datastore-web/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-domain-class/build.gradle b/grails-domain-class/build.gradle index 95103142436..4594208a055 100644 --- a/grails-domain-class/build.gradle +++ b/grails-domain-class/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-encoder/build.gradle b/grails-encoder/build.gradle index 692cf98566a..b72c18d0a0c 100644 --- a/grails-encoder/build.gradle +++ b/grails-encoder/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-events/core/build.gradle b/grails-events/core/build.gradle index fed99b5dd2d..3336a2c93fe 100644 --- a/grails-events/core/build.gradle +++ b/grails-events/core/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-events/gpars/build.gradle b/grails-events/gpars/build.gradle index 3e80b36094f..746d28260b2 100644 --- a/grails-events/gpars/build.gradle +++ b/grails-events/gpars/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-events/plugin/build.gradle b/grails-events/plugin/build.gradle index 5069cad90fe..1298082db28 100644 --- a/grails-events/plugin/build.gradle +++ b/grails-events/plugin/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-events/rxjava/build.gradle b/grails-events/rxjava/build.gradle index d53e072abcd..f5a8d14a2bf 100644 --- a/grails-events/rxjava/build.gradle +++ b/grails-events/rxjava/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-events/rxjava2/build.gradle b/grails-events/rxjava2/build.gradle index 43791ba91fb..523491abadd 100644 --- a/grails-events/rxjava2/build.gradle +++ b/grails-events/rxjava2/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-events/rxjava3/build.gradle b/grails-events/rxjava3/build.gradle index 2daa711d671..5317145cad7 100644 --- a/grails-events/rxjava3/build.gradle +++ b/grails-events/rxjava3/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-events/spring/build.gradle b/grails-events/spring/build.gradle index caefaf3ef6c..b09399742e5 100644 --- a/grails-events/spring/build.gradle +++ b/grails-events/spring/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-events/transforms/build.gradle b/grails-events/transforms/build.gradle index b8797a4699e..2492836e3b7 100644 --- a/grails-events/transforms/build.gradle +++ b/grails-events/transforms/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-fields/build.gradle b/grails-fields/build.gradle index 1b30c8c623f..f92268d3590 100644 --- a/grails-fields/build.gradle +++ b/grails-fields/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-geb/build.gradle b/grails-geb/build.gradle index db3b5b47ea5..19a20382d81 100644 --- a/grails-geb/build.gradle +++ b/grails-geb/build.gradle @@ -26,6 +26,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-gradle/common/build.gradle b/grails-gradle/common/build.gradle index 9ec66022fff..17f053b9eb0 100644 --- a/grails-gradle/common/build.gradle +++ b/grails-gradle/common/build.gradle @@ -25,6 +25,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-gradle/model/build.gradle b/grails-gradle/model/build.gradle index 2cd0762d4de..3c5a2a78517 100644 --- a/grails-gradle/model/build.gradle +++ b/grails-gradle/model/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-gradle/plugins/build.gradle b/grails-gradle/plugins/build.gradle index 78bca0abee3..61328fd8426 100644 --- a/grails-gradle/plugins/build.gradle +++ b/grails-gradle/plugins/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-gradle/tasks/build.gradle b/grails-gradle/tasks/build.gradle index 5970381fa23..080f0c3a526 100644 --- a/grails-gradle/tasks/build.gradle +++ b/grails-gradle/tasks/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-gsp/core/build.gradle b/grails-gsp/core/build.gradle index a032e6f9742..0ae5f361163 100644 --- a/grails-gsp/core/build.gradle +++ b/grails-gsp/core/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-gsp/grails-layout/build.gradle b/grails-gsp/grails-layout/build.gradle index 59e02446ec0..26bcbfe943f 100644 --- a/grails-gsp/grails-layout/build.gradle +++ b/grails-gsp/grails-layout/build.gradle @@ -26,6 +26,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-gsp/grails-sitemesh3/build.gradle b/grails-gsp/grails-sitemesh3/build.gradle index 494e1dd0c92..db052a8e440 100644 --- a/grails-gsp/grails-sitemesh3/build.gradle +++ b/grails-gsp/grails-sitemesh3/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-gsp/grails-taglib/build.gradle b/grails-gsp/grails-taglib/build.gradle index 6ddf4cdd5c5..51dd10f1ea6 100644 --- a/grails-gsp/grails-taglib/build.gradle +++ b/grails-gsp/grails-taglib/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-gsp/grails-web-gsp-taglib/build.gradle b/grails-gsp/grails-web-gsp-taglib/build.gradle index e29c66a4ae4..a0451923835 100644 --- a/grails-gsp/grails-web-gsp-taglib/build.gradle +++ b/grails-gsp/grails-web-gsp-taglib/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-gsp/grails-web-gsp/build.gradle b/grails-gsp/grails-web-gsp/build.gradle index b5c19fef864..d8c1b800cd6 100644 --- a/grails-gsp/grails-web-gsp/build.gradle +++ b/grails-gsp/grails-web-gsp/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-gsp/grails-web-jsp/build.gradle b/grails-gsp/grails-web-jsp/build.gradle index 92a20f8bcd2..161b1b7080e 100644 --- a/grails-gsp/grails-web-jsp/build.gradle +++ b/grails-gsp/grails-web-jsp/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-gsp/grails-web-taglib/build.gradle b/grails-gsp/grails-web-taglib/build.gradle index f6c5fed7d1e..01b51a7a1ab 100644 --- a/grails-gsp/grails-web-taglib/build.gradle +++ b/grails-gsp/grails-web-taglib/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-gsp/plugin/build.gradle b/grails-gsp/plugin/build.gradle index 82e924f5a12..1319cb88a14 100644 --- a/grails-gsp/plugin/build.gradle +++ b/grails-gsp/plugin/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-i18n/build.gradle b/grails-i18n/build.gradle index c08aa68d99e..fe6aabf734a 100644 --- a/grails-i18n/build.gradle +++ b/grails-i18n/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-interceptors/build.gradle b/grails-interceptors/build.gradle index a54d1af3542..0fd0309ddf6 100644 --- a/grails-interceptors/build.gradle +++ b/grails-interceptors/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-logging/build.gradle b/grails-logging/build.gradle index 40ca7b5ae21..a9a548d9d03 100644 --- a/grails-logging/build.gradle +++ b/grails-logging/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-mimetypes/build.gradle b/grails-mimetypes/build.gradle index 20cd89b716d..91f68011133 100644 --- a/grails-mimetypes/build.gradle +++ b/grails-mimetypes/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-rest-transforms/build.gradle b/grails-rest-transforms/build.gradle index ad80cb4057f..76bb9311e24 100644 --- a/grails-rest-transforms/build.gradle +++ b/grails-rest-transforms/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-scaffolding/build.gradle b/grails-scaffolding/build.gradle index 93dfa5f2a48..e6dd2c16722 100644 --- a/grails-scaffolding/build.gradle +++ b/grails-scaffolding/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-services/build.gradle b/grails-services/build.gradle index c13a91ef248..ecfb2e96cdd 100644 --- a/grails-services/build.gradle +++ b/grails-services/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-shell-cli/build.gradle b/grails-shell-cli/build.gradle index b63e2a865ce..c4f35d3a73e 100644 --- a/grails-shell-cli/build.gradle +++ b/grails-shell-cli/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-spring/build.gradle b/grails-spring/build.gradle index 45048ac9c32..ec02285899e 100644 --- a/grails-spring/build.gradle +++ b/grails-spring/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-test-core/build.gradle b/grails-test-core/build.gradle index f23de34dc12..26ceabd96b6 100644 --- a/grails-test-core/build.gradle +++ b/grails-test-core/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-test-suite-base/build.gradle b/grails-test-suite-base/build.gradle index 6e5b9a320d0..d7f6a04d322 100644 --- a/grails-test-suite-base/build.gradle +++ b/grails-test-suite-base/build.gradle @@ -26,6 +26,7 @@ plugins { id 'org.apache.grails.buildsrc.compile' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-testing-support-core/build.gradle b/grails-testing-support-core/build.gradle index 223b2a9ba9d..1a9cda1ee52 100644 --- a/grails-testing-support-core/build.gradle +++ b/grails-testing-support-core/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-testing-support-datamapping/build.gradle b/grails-testing-support-datamapping/build.gradle index 715fbe3f983..38f00d96a6a 100755 --- a/grails-testing-support-datamapping/build.gradle +++ b/grails-testing-support-datamapping/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-testing-support-dbcleanup-core/build.gradle b/grails-testing-support-dbcleanup-core/build.gradle index 70f9682077e..f4698b0eb03 100644 --- a/grails-testing-support-dbcleanup-core/build.gradle +++ b/grails-testing-support-dbcleanup-core/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } diff --git a/grails-testing-support-dbcleanup-h2/build.gradle b/grails-testing-support-dbcleanup-h2/build.gradle index 2bc1cc0adff..b3c18b7b211 100644 --- a/grails-testing-support-dbcleanup-h2/build.gradle +++ b/grails-testing-support-dbcleanup-h2/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } diff --git a/grails-testing-support-dbcleanup-postgresql/build.gradle b/grails-testing-support-dbcleanup-postgresql/build.gradle index 6ff298cbc1e..5f99ce69962 100644 --- a/grails-testing-support-dbcleanup-postgresql/build.gradle +++ b/grails-testing-support-dbcleanup-postgresql/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-testing-support-http-client/build.gradle b/grails-testing-support-http-client/build.gradle index 7d8119d07d2..feff4743f34 100644 --- a/grails-testing-support-http-client/build.gradle +++ b/grails-testing-support-http-client/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-testing-support-mongodb/build.gradle b/grails-testing-support-mongodb/build.gradle index cad012a5cb0..ab82c26ffc2 100644 --- a/grails-testing-support-mongodb/build.gradle +++ b/grails-testing-support-mongodb/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-testing-support-views-gson/build.gradle b/grails-testing-support-views-gson/build.gradle index c847e79679a..fd60e5e89e2 100644 --- a/grails-testing-support-views-gson/build.gradle +++ b/grails-testing-support-views-gson/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-testing-support-web/build.gradle b/grails-testing-support-web/build.gradle index 6b362c056de..34ecdc36876 100755 --- a/grails-testing-support-web/build.gradle +++ b/grails-testing-support-web/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-url-mappings/build.gradle b/grails-url-mappings/build.gradle index 9e548d1212b..8f4b6d8679c 100644 --- a/grails-url-mappings/build.gradle +++ b/grails-url-mappings/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-validation/build.gradle b/grails-validation/build.gradle index 38b907bf6d2..e9088f45873 100644 --- a/grails-validation/build.gradle +++ b/grails-validation/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-views-core/build.gradle b/grails-views-core/build.gradle index d30a0d560da..a6ffab62d23 100644 --- a/grails-views-core/build.gradle +++ b/grails-views-core/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-views-gson/build.gradle b/grails-views-gson/build.gradle index de8b38ed5f6..caf186cb06e 100644 --- a/grails-views-gson/build.gradle +++ b/grails-views-gson/build.gradle @@ -26,6 +26,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-views-markup/build.gradle b/grails-views-markup/build.gradle index 48de6f7f0cb..0ee258916dd 100644 --- a/grails-views-markup/build.gradle +++ b/grails-views-markup/build.gradle @@ -26,6 +26,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-web-boot/build.gradle b/grails-web-boot/build.gradle index 3dbbd9fde67..0c6722dba51 100644 --- a/grails-web-boot/build.gradle +++ b/grails-web-boot/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-web-common/build.gradle b/grails-web-common/build.gradle index ff03053790d..c626d8f81b6 100644 --- a/grails-web-common/build.gradle +++ b/grails-web-common/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-web-core/build.gradle b/grails-web-core/build.gradle index cd9b52c6580..818a27a3763 100644 --- a/grails-web-core/build.gradle +++ b/grails-web-core/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-web-databinding/build.gradle b/grails-web-databinding/build.gradle index 92b7aecc41e..91422ef184e 100644 --- a/grails-web-databinding/build.gradle +++ b/grails-web-databinding/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-web-mvc/build.gradle b/grails-web-mvc/build.gradle index d16e9f41f32..32d7bc07f67 100644 --- a/grails-web-mvc/build.gradle +++ b/grails-web-mvc/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-web-url-mappings/build.gradle b/grails-web-url-mappings/build.gradle index 06c6b87870d..5aba4697dec 100644 --- a/grails-web-url-mappings/build.gradle +++ b/grails-web-url-mappings/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-wrapper/build.gradle b/grails-wrapper/build.gradle index 71a80b3ee42..2a0373cbd36 100644 --- a/grails-wrapper/build.gradle +++ b/grails-wrapper/build.gradle @@ -25,6 +25,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion From 58a12d5c3d7040f954bb030d5724ded1011b3cc8 Mon Sep 17 00:00:00 2001 From: James Daugherty Date: Thu, 28 May 2026 12:50:02 -0400 Subject: [PATCH 2/9] Address Copilot review feedback: restrict coverage matrix to ubuntu-24.04 --- .github/workflows/coverage.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index d3aea1995f3..55478c63f32 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -34,7 +34,7 @@ jobs: strategy: fail-fast: false matrix: - os: [ubuntu-24.04, macos-latest, windows-latest] + os: [ubuntu-24.04] runs-on: ${{ matrix.os }} steps: - name: "📥 Checkout repository" @@ -67,7 +67,7 @@ jobs: strategy: fail-fast: false matrix: - os: [ubuntu-24.04, macos-latest, windows-latest] + os: [ubuntu-24.04] runs-on: ${{ matrix.os }} steps: - name: "📥 Checkout repository" From b0e6cf8486bdf82ad376cb89ca55c0a7c72ba1b2 Mon Sep 17 00:00:00 2001 From: James Fredley Date: Fri, 29 May 2026 02:05:09 -0400 Subject: [PATCH 3/9] fix(ci): pin Coverage workflow actions to ASF-approved SHAs The jacoco coverage.yml workflow used floating action tags (checkout@v6, setup-java@v4, upload-artifact@v7.0.1, download-artifact@v7.0.0) and an outdated setup-gradle pin, which the ASF org policy rejects, causing the Coverage workflow to fail at startup. Pin every action to the ASF-approved commit SHAs used elsewhere in the repo (checkout v6.0.2, setup-java v5.2.0, setup-gradle v6.1.0 with cache-provider: basic, upload-artifact v7.0.1, download-artifact v8.0.1). Assisted-by: claude-code:claude-4.8-opus --- .github/workflows/coverage.yml | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index 55478c63f32..32b4586b61c 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -38,15 +38,16 @@ jobs: runs-on: ${{ matrix.os }} steps: - name: "📥 Checkout repository" - uses: actions/checkout@v6 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: "☕️ Setup JDK" - uses: actions/setup-java@v4 + uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0 with: distribution: liberica java-version: 21 - name: "🐘 Setup Gradle" - uses: gradle/actions/setup-gradle@4d9f0ba0025fe599b4ebab900eb7f3a1d93ef4c2 # v5.0.0 + uses: gradle/actions/setup-gradle@50e97c2cd7a37755bbfafc9c5b7cafaece252f6e # v6.1.0 with: + cache-provider: basic # 'basic' uses the MIT-licensed, open-source cache provider; the default 'enhanced' provider (v6+) is proprietary (Gradle commercial Terms of Use) develocity-access-key: ${{ secrets.DEVELOCITY_ACCESS_KEY }} - name: "🌡️ Run tests with coverage" run: > @@ -55,7 +56,7 @@ jobs: --stacktrace -PskipCodeStyle - name: "📤 Upload coverage artifact" - uses: actions/upload-artifact@v7.0.1 + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: coverage-core-${{ matrix.os }} path: build/reports/jacoco/aggregate/jacocoAggregateReport.xml @@ -71,15 +72,16 @@ jobs: runs-on: ${{ matrix.os }} steps: - name: "📥 Checkout repository" - uses: actions/checkout@v6 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: "☕️ Setup JDK" - uses: actions/setup-java@v4 + uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0 with: distribution: liberica java-version: 21 - name: "🐘 Setup Gradle" - uses: gradle/actions/setup-gradle@4d9f0ba0025fe599b4ebab900eb7f3a1d93ef4c2 # v5.0.0 + uses: gradle/actions/setup-gradle@50e97c2cd7a37755bbfafc9c5b7cafaece252f6e # v6.1.0 with: + cache-provider: basic # 'basic' uses the MIT-licensed, open-source cache provider; the default 'enhanced' provider (v6+) is proprietary (Gradle commercial Terms of Use) develocity-access-key: ${{ secrets.DEVELOCITY_ACCESS_KEY }} - name: "🌡️ Run tests with coverage" working-directory: grails-gradle @@ -89,7 +91,7 @@ jobs: --stacktrace -PskipCodeStyle - name: "📤 Upload coverage artifact" - uses: actions/upload-artifact@v7.0.1 + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: coverage-gradle-${{ matrix.os }} path: grails-gradle/build/reports/jacoco/aggregate/jacocoAggregateReport.xml @@ -103,9 +105,9 @@ jobs: runs-on: ubuntu-24.04 steps: - name: "📥 Checkout repository" - uses: actions/checkout@v6 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: "📥 Download all coverage artifacts" - uses: actions/download-artifact@v7.0.0 + uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 with: path: coverage-reports - name: "📊 Upload coverage to Codecov" From 6f6f6dd63bdc78711d83226f0c847c2b110b2b05 Mon Sep 17 00:00:00 2001 From: James Daugherty Date: Thu, 28 May 2026 12:28:57 -0400 Subject: [PATCH 4/9] Add grails-jacoco convention plugin and Codecov coverage workflow Adds a grails-jacoco convention plugin that configures JaCoCo per subproject and registers a root jacocoAggregateReport task producing a single XML report for Codecov, handling the hibernate5/hibernate7 duplicate-class case. Applies grails-jacoco to 96 subprojects and adds the Coverage workflow that uploads to the existing codecov.yml configuration. Layers on top of PR-G (grails-code-analysis / grails-violation-aggregation), which provides the build-logic test infrastructure and plugin registration scaffold. Folds in the standalone coverage work from #15668. Extracted from the Hibernate 7 staging branch (PR #15654) per review feedback that JaCoCo should be introduced as its own focused PR for the project to review independently. Assisted-by: claude-code:claude-4.7-opus --- .github/workflows/coverage.yml | 117 ++++++++++++ build-logic/plugins/build.gradle | 4 + .../grails/buildsrc/GrailsJacocoPlugin.groovy | 118 ++++++++++++ .../buildsrc/GrailsJacocoPluginSpec.groovy | 178 ++++++++++++++++++ grails-async/core/build.gradle | 1 + grails-async/gpars/build.gradle | 1 + grails-async/plugin/build.gradle | 1 + grails-async/rxjava/build.gradle | 1 + grails-async/rxjava2/build.gradle | 1 + grails-async/rxjava3/build.gradle | 1 + grails-bootstrap/build.gradle | 1 + grails-cache/build.gradle | 1 + grails-codecs-core/build.gradle | 1 + grails-codecs/build.gradle | 1 + grails-common/build.gradle | 1 + grails-console/build.gradle | 1 + grails-controllers/build.gradle | 1 + grails-converters/build.gradle | 1 + grails-core/build.gradle | 1 + .../boot-plugin/build.gradle | 1 + grails-data-hibernate5/core/build.gradle | 1 + .../dbmigration/build.gradle | 1 + .../grails-plugin/build.gradle | 1 + .../spring-orm/build.gradle | 1 + grails-data-mongodb/boot-plugin/build.gradle | 1 + grails-data-mongodb/bson/build.gradle | 1 + grails-data-mongodb/core/build.gradle | 1 + grails-data-mongodb/ext/build.gradle | 1 + .../grails-plugin/build.gradle | 1 + .../gson-templates/build.gradle | 1 + grails-data-simple/build.gradle | 1 + grails-databinding-core/build.gradle | 1 + grails-databinding/build.gradle | 1 + grails-datamapping-async/build.gradle | 1 + grails-datamapping-core/build.gradle | 1 + grails-datamapping-rx/build.gradle | 1 + grails-datamapping-support/build.gradle | 1 + grails-datamapping-tck/build.gradle | 1 + grails-datamapping-validation/build.gradle | 1 + grails-datasource/build.gradle | 1 + grails-datastore-async/build.gradle | 1 + grails-datastore-core/build.gradle | 1 + grails-datastore-web/build.gradle | 1 + grails-domain-class/build.gradle | 1 + grails-encoder/build.gradle | 1 + grails-events/core/build.gradle | 1 + grails-events/gpars/build.gradle | 1 + grails-events/plugin/build.gradle | 1 + grails-events/rxjava/build.gradle | 1 + grails-events/rxjava2/build.gradle | 1 + grails-events/rxjava3/build.gradle | 1 + grails-events/spring/build.gradle | 1 + grails-events/transforms/build.gradle | 1 + grails-fields/build.gradle | 1 + grails-geb/build.gradle | 1 + grails-gradle/common/build.gradle | 1 + grails-gradle/model/build.gradle | 1 + grails-gradle/plugins/build.gradle | 1 + grails-gradle/tasks/build.gradle | 1 + grails-gsp/core/build.gradle | 1 + grails-gsp/grails-layout/build.gradle | 1 + grails-gsp/grails-sitemesh3/build.gradle | 1 + grails-gsp/grails-taglib/build.gradle | 1 + grails-gsp/grails-web-gsp-taglib/build.gradle | 1 + grails-gsp/grails-web-gsp/build.gradle | 1 + grails-gsp/grails-web-jsp/build.gradle | 1 + grails-gsp/grails-web-taglib/build.gradle | 1 + grails-gsp/plugin/build.gradle | 1 + grails-i18n/build.gradle | 1 + grails-interceptors/build.gradle | 1 + grails-logging/build.gradle | 1 + grails-mimetypes/build.gradle | 1 + grails-rest-transforms/build.gradle | 1 + grails-scaffolding/build.gradle | 1 + grails-services/build.gradle | 1 + grails-shell-cli/build.gradle | 1 + grails-spring/build.gradle | 1 + grails-test-core/build.gradle | 1 + grails-test-suite-base/build.gradle | 1 + grails-testing-support-core/build.gradle | 1 + .../build.gradle | 1 + .../build.gradle | 1 + .../build.gradle | 1 + .../build.gradle | 1 + .../build.gradle | 1 + grails-testing-support-mongodb/build.gradle | 1 + .../build.gradle | 1 + grails-testing-support-web/build.gradle | 1 + grails-url-mappings/build.gradle | 1 + grails-validation/build.gradle | 1 + grails-views-core/build.gradle | 1 + grails-views-gson/build.gradle | 1 + grails-views-markup/build.gradle | 1 + grails-web-boot/build.gradle | 1 + grails-web-common/build.gradle | 1 + grails-web-core/build.gradle | 1 + grails-web-databinding/build.gradle | 1 + grails-web-mvc/build.gradle | 1 + grails-web-url-mappings/build.gradle | 1 + grails-wrapper/build.gradle | 1 + 100 files changed, 513 insertions(+) create mode 100644 .github/workflows/coverage.yml create mode 100644 build-logic/plugins/src/main/groovy/org/apache/grails/buildsrc/GrailsJacocoPlugin.groovy create mode 100644 build-logic/plugins/src/test/groovy/org/apache/grails/buildsrc/GrailsJacocoPluginSpec.groovy diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml new file mode 100644 index 00000000000..d3aea1995f3 --- /dev/null +++ b/.github/workflows/coverage.yml @@ -0,0 +1,117 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +name: "Coverage" + +on: + push: + branches: + - '[0-9]+.[0-9]+.x' + - '8.0.x-hibernate7.*' + pull_request: + workflow_dispatch: + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: ${{ github.event_name == 'pull_request' }} + +jobs: + coverage-core: + name: "Coverage - grails-core (${{ matrix.os }})" + if: ${{ !contains(github.event.head_commit.message, '[skip tests]') }} + strategy: + fail-fast: false + matrix: + os: [ubuntu-24.04, macos-latest, windows-latest] + runs-on: ${{ matrix.os }} + steps: + - name: "📥 Checkout repository" + uses: actions/checkout@v6 + - name: "☕️ Setup JDK" + uses: actions/setup-java@v4 + with: + distribution: liberica + java-version: 21 + - name: "🐘 Setup Gradle" + uses: gradle/actions/setup-gradle@4d9f0ba0025fe599b4ebab900eb7f3a1d93ef4c2 # v5.0.0 + with: + develocity-access-key: ${{ secrets.DEVELOCITY_ACCESS_KEY }} + - name: "🌡️ Run tests with coverage" + run: > + ./gradlew jacocoAggregateReport + --continue + --stacktrace + -PskipCodeStyle + - name: "📤 Upload coverage artifact" + uses: actions/upload-artifact@v7.0.1 + with: + name: coverage-core-${{ matrix.os }} + path: build/reports/jacoco/aggregate/jacocoAggregateReport.xml + if-no-files-found: warn + + coverage-gradle: + name: "Coverage - grails-gradle (${{ matrix.os }})" + if: ${{ !contains(github.event.head_commit.message, '[skip tests]') }} + strategy: + fail-fast: false + matrix: + os: [ubuntu-24.04, macos-latest, windows-latest] + runs-on: ${{ matrix.os }} + steps: + - name: "📥 Checkout repository" + uses: actions/checkout@v6 + - name: "☕️ Setup JDK" + uses: actions/setup-java@v4 + with: + distribution: liberica + java-version: 21 + - name: "🐘 Setup Gradle" + uses: gradle/actions/setup-gradle@4d9f0ba0025fe599b4ebab900eb7f3a1d93ef4c2 # v5.0.0 + with: + develocity-access-key: ${{ secrets.DEVELOCITY_ACCESS_KEY }} + - name: "🌡️ Run tests with coverage" + working-directory: grails-gradle + run: > + ./gradlew jacocoAggregateReport + --continue + --stacktrace + -PskipCodeStyle + - name: "📤 Upload coverage artifact" + uses: actions/upload-artifact@v7.0.1 + with: + name: coverage-gradle-${{ matrix.os }} + path: grails-gradle/build/reports/jacoco/aggregate/jacocoAggregateReport.xml + if-no-files-found: warn + + upload-coverage: + name: "Upload Coverage to Codecov" + needs: [coverage-core, coverage-gradle] + # Run even if some matrix legs fail so partial coverage is still uploaded + if: always() + runs-on: ubuntu-24.04 + steps: + - name: "📥 Checkout repository" + uses: actions/checkout@v6 + - name: "📥 Download all coverage artifacts" + uses: actions/download-artifact@v7.0.0 + with: + path: coverage-reports + - name: "📊 Upload coverage to Codecov" + continue-on-error: true + uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # v6.0.0 + with: + token: ${{ secrets.CODECOV_TOKEN }} + directory: coverage-reports + verbose: true diff --git a/build-logic/plugins/build.gradle b/build-logic/plugins/build.gradle index b196ee24316..b4917a4ae61 100644 --- a/build-logic/plugins/build.gradle +++ b/build-logic/plugins/build.gradle @@ -75,6 +75,10 @@ gradlePlugin { id = 'org.apache.grails.gradle.grails-code-analysis' implementationClass = 'org.apache.grails.buildsrc.GrailsCodeAnalysisPlugin' } + register('grailsJacoco') { + id = 'org.apache.grails.gradle.grails-jacoco' + implementationClass = 'org.apache.grails.buildsrc.GrailsJacocoPlugin' + } register('grailsViolationAggregation') { id = 'org.apache.grails.gradle.grails-violation-aggregation' implementationClass = 'org.apache.grails.buildsrc.GrailsViolationAggregationPlugin' diff --git a/build-logic/plugins/src/main/groovy/org/apache/grails/buildsrc/GrailsJacocoPlugin.groovy b/build-logic/plugins/src/main/groovy/org/apache/grails/buildsrc/GrailsJacocoPlugin.groovy new file mode 100644 index 00000000000..0071fa61e9f --- /dev/null +++ b/build-logic/plugins/src/main/groovy/org/apache/grails/buildsrc/GrailsJacocoPlugin.groovy @@ -0,0 +1,118 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.grails.buildsrc + +import groovy.transform.CompileDynamic + +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.api.plugins.JavaPlugin +import org.gradle.api.tasks.testing.Test +import org.gradle.testing.jacoco.plugins.JacocoPlugin +import org.gradle.testing.jacoco.plugins.JacocoPluginExtension +import org.gradle.testing.jacoco.tasks.JacocoReport + +/** + * Convention plugin for JaCoCo code coverage. Apply to each subproject that compiles code. + * + * In addition to configuring per-subproject coverage, this plugin lazily registers a + * jacocoAggregateReport task on the root project the first time it is applied, then wires + * each subproject's exec data into that task. The aggregate produces a single XML report + * at build/reports/jacoco/aggregate/jacocoAggregateReport.xml suitable for Codecov upload. + */ +@CompileDynamic +class GrailsJacocoPlugin implements Plugin { + + static final String AGGREGATE_TASK_NAME = 'jacocoAggregateReport' + + @Override + void apply(Project project) { + project.logger.info("Configuring JaCoCo for project: ${project.name}") + project.pluginManager.apply(JacocoPlugin) + + project.extensions.configure(JacocoPluginExtension) { + it.toolVersion = '0.8.14' + } + + project.tasks.withType(Test).configureEach { + it.finalizedBy 'jacocoTestReport' + } + + project.tasks.withType(JacocoReport).configureEach { + it.dependsOn project.tasks.withType(Test) + it.reports { + it.xml.required = true + it.html.required = true + it.csv.required = true + } + } + + contributeToRootAggregateReport(project) + } + + private static void contributeToRootAggregateReport(Project project) { + Project root = project.rootProject + + // Ensure JacocoPlugin is on the root so its JacocoReport task has tooling available. + // pluginManager.apply is idempotent — safe to call from every subproject. + root.pluginManager.apply(JacocoPlugin) + + // Register the aggregate task once on the first apply; subsequent subprojects find it by name. + def aggregateTask + if (root.tasks.names.contains(AGGREGATE_TASK_NAME)) { + aggregateTask = root.tasks.named(AGGREGATE_TASK_NAME, JacocoReport) + } else { + aggregateTask = root.tasks.register(AGGREGATE_TASK_NAME, JacocoReport) { JacocoReport task -> + task.group = 'verification' + task.description = 'Aggregates JaCoCo coverage from all subprojects into a single XML report for Codecov.' + task.reports { + it.xml.required = true + it.xml.outputLocation = root.layout.buildDirectory.file( + 'reports/jacoco/aggregate/jacocoAggregateReport.xml' + ) + it.html.required = false + it.csv.required = false + } + task.onlyIf { JacocoReport t -> !t.executionData.files.isEmpty() } + } + } + + // Wire this subproject's test exec data into the aggregate. + aggregateTask.configure { JacocoReport task -> + task.dependsOn project.tasks.withType(Test) + task.executionData.from( + project.fileTree(project.file('build/jacoco')) { include '*.exec' } + ) + } + + // Add source and class directories once the Java plugin is confirmed present. + // Hibernate 7 variant subprojects compile identical class names to their Hibernate 5 + // counterparts; including both causes JaCoCo to throw "Can't add different class with + // same name". Exec data from H7 test runs is still included above so their coverage + // is attributed to the H5 class definitions. + if (!project.path.contains('hibernate7')) { + project.plugins.withType(JavaPlugin) { + aggregateTask.configure { JacocoReport task -> + task.sourceDirectories.from(project.sourceSets.main.allSource.srcDirs) + task.classDirectories.from(project.sourceSets.main.output.classesDirs) + } + } + } + } +} diff --git a/build-logic/plugins/src/test/groovy/org/apache/grails/buildsrc/GrailsJacocoPluginSpec.groovy b/build-logic/plugins/src/test/groovy/org/apache/grails/buildsrc/GrailsJacocoPluginSpec.groovy new file mode 100644 index 00000000000..5ee04174959 --- /dev/null +++ b/build-logic/plugins/src/test/groovy/org/apache/grails/buildsrc/GrailsJacocoPluginSpec.groovy @@ -0,0 +1,178 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.grails.buildsrc + +import org.gradle.testkit.runner.GradleRunner +import org.gradle.testkit.runner.TaskOutcome +import spock.lang.Specification +import spock.lang.TempDir + +import java.nio.file.Path + +class GrailsJacocoPluginSpec extends Specification { + + @TempDir + Path testProjectDir + + def setup() { + testProjectDir.resolve('settings.gradle').toFile().text = '' + testProjectDir.resolve('build.gradle').toFile().text = """ + plugins { + id 'groovy' + id 'org.apache.grails.gradle.grails-jacoco' + } + repositories { + mavenCentral() + } + """ + def src = testProjectDir.resolve('src/main/groovy/com/example/Foo.groovy').toFile() + src.parentFile.mkdirs() + src.text = 'package com.example\nclass Foo {}' + } + + def "jacoco plugin applies JaCoCo and registers jacocoTestReport task"() { + when: "listing verification tasks" + def result = GradleRunner.create() + .withProjectDir(testProjectDir.toFile()) + .withArguments('tasks', '--group=verification') + .withPluginClasspath() + .build() + + then: "jacocoTestReport is present" + result.output.contains('jacocoTestReport') + } + + def "jacocoTestReport generates xml html and csv reports"() { + when: "listing all tasks" + def result = GradleRunner.create() + .withProjectDir(testProjectDir.toFile()) + .withArguments('tasks', '--all') + .withPluginClasspath() + .build() + + then: "aggregateJacocoCoverage is not registered (that task belongs to grails-violation-aggregation)" + !result.output.contains('aggregateJacocoCoverage') + } + + def "jacocoAggregateReport is registered on the root project in a multi-project build"() { + given: "a multi-project build where a subproject applies grails-jacoco" + testProjectDir.resolve('settings.gradle').toFile().text = "include 'app-module'" + testProjectDir.resolve('build.gradle').toFile().text = '' + def moduleDir = testProjectDir.resolve('app-module') + moduleDir.toFile().mkdirs() + moduleDir.resolve('build.gradle').toFile().text = """ + plugins { + id 'groovy' + id 'org.apache.grails.gradle.grails-jacoco' + } + repositories { mavenCentral() } + """ + + when: "listing verification tasks on the root" + def result = GradleRunner.create() + .withProjectDir(testProjectDir.toFile()) + .withArguments('tasks', '--group=verification') + .withPluginClasspath() + .build() + + then: "jacocoAggregateReport appears on the root" + result.output.contains('jacocoAggregateReport') + } + + def "jacocoAggregateReport includes the subproject test task as a dependency"() { + given: "a multi-project build" + testProjectDir.resolve('settings.gradle').toFile().text = "include 'app-module'" + testProjectDir.resolve('build.gradle').toFile().text = '' + def moduleDir = testProjectDir.resolve('app-module') + moduleDir.toFile().mkdirs() + moduleDir.resolve('build.gradle').toFile().text = """ + plugins { + id 'groovy' + id 'org.apache.grails.gradle.grails-jacoco' + } + repositories { mavenCentral() } + """ + + when: "doing a dry run" + def result = GradleRunner.create() + .withProjectDir(testProjectDir.toFile()) + .withArguments('jacocoAggregateReport', '--dry-run') + .withPluginClasspath() + .build() + + then: "the subproject test task is in the execution plan" + result.output.contains(':app-module:test') + } + + def "jacocoAggregateReport is skipped when no exec files exist"() { + given: "a multi-project build with tests excluded so no exec files are produced" + testProjectDir.resolve('settings.gradle').toFile().text = "include 'app-module'" + testProjectDir.resolve('build.gradle').toFile().text = '' + def moduleDir = testProjectDir.resolve('app-module') + moduleDir.toFile().mkdirs() + moduleDir.resolve('build.gradle').toFile().text = """ + plugins { + id 'groovy' + id 'org.apache.grails.gradle.grails-jacoco' + } + repositories { mavenCentral() } + """ + + when: "running jacocoAggregateReport with tests excluded" + def result = GradleRunner.create() + .withProjectDir(testProjectDir.toFile()) + .withArguments('jacocoAggregateReport', '-x', 'test', '--stacktrace') + .withPluginClasspath() + .build() + + then: "the task is skipped because executionData is empty" + result.task(':jacocoAggregateReport').outcome == TaskOutcome.SKIPPED + } + + def "each additional subproject with grails-jacoco wires itself into the same aggregate task"() { + given: "two subprojects both applying grails-jacoco" + testProjectDir.resolve('settings.gradle').toFile().text = "include 'module-a', 'module-b'" + testProjectDir.resolve('build.gradle').toFile().text = '' + ['module-a', 'module-b'].each { name -> + def dir = testProjectDir.resolve(name) + dir.toFile().mkdirs() + dir.resolve('build.gradle').toFile().text = """ + plugins { + id 'groovy' + id 'org.apache.grails.gradle.grails-jacoco' + } + repositories { mavenCentral() } + """ + } + + when: "doing a dry run" + def result = GradleRunner.create() + .withProjectDir(testProjectDir.toFile()) + .withArguments('jacocoAggregateReport', '--dry-run') + .withPluginClasspath() + .build() + + then: "both subproject test tasks appear as dependencies" + result.output.contains(':module-a:test') + result.output.contains(':module-b:test') + + and: "only one aggregate task is registered on the root" + result.output.count('jacocoAggregateReport') == 1 + } +} diff --git a/grails-async/core/build.gradle b/grails-async/core/build.gradle index b2f5f45bc13..bbb0f24d460 100644 --- a/grails-async/core/build.gradle +++ b/grails-async/core/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-async/gpars/build.gradle b/grails-async/gpars/build.gradle index e30f7d2e281..d46431ab2a4 100644 --- a/grails-async/gpars/build.gradle +++ b/grails-async/gpars/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-async/plugin/build.gradle b/grails-async/plugin/build.gradle index 73984e20e09..31a5206673e 100644 --- a/grails-async/plugin/build.gradle +++ b/grails-async/plugin/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-async/rxjava/build.gradle b/grails-async/rxjava/build.gradle index 9494becc598..3326aa8eae4 100644 --- a/grails-async/rxjava/build.gradle +++ b/grails-async/rxjava/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-async/rxjava2/build.gradle b/grails-async/rxjava2/build.gradle index aa269ef1b8d..188ae1a4079 100644 --- a/grails-async/rxjava2/build.gradle +++ b/grails-async/rxjava2/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-async/rxjava3/build.gradle b/grails-async/rxjava3/build.gradle index 25e643124b4..f138f1f6f1c 100644 --- a/grails-async/rxjava3/build.gradle +++ b/grails-async/rxjava3/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-bootstrap/build.gradle b/grails-bootstrap/build.gradle index 22b423f1494..bff4b69f1e7 100644 --- a/grails-bootstrap/build.gradle +++ b/grails-bootstrap/build.gradle @@ -30,6 +30,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-cache/build.gradle b/grails-cache/build.gradle index 45c83921c40..4bcfd27af54 100644 --- a/grails-cache/build.gradle +++ b/grails-cache/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-codecs-core/build.gradle b/grails-codecs-core/build.gradle index 8b952e765f4..a787c9deb5e 100644 --- a/grails-codecs-core/build.gradle +++ b/grails-codecs-core/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-codecs/build.gradle b/grails-codecs/build.gradle index 47fbaab85cd..6151aa6bfc1 100644 --- a/grails-codecs/build.gradle +++ b/grails-codecs/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-common/build.gradle b/grails-common/build.gradle index f6ca3c40f17..0bb4998d4cf 100644 --- a/grails-common/build.gradle +++ b/grails-common/build.gradle @@ -26,6 +26,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-console/build.gradle b/grails-console/build.gradle index 21b341638da..4b06bca58ea 100644 --- a/grails-console/build.gradle +++ b/grails-console/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-controllers/build.gradle b/grails-controllers/build.gradle index 962430281be..24fe759f905 100644 --- a/grails-controllers/build.gradle +++ b/grails-controllers/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-converters/build.gradle b/grails-converters/build.gradle index 22e3e605e1a..ccc99fd8a9f 100644 --- a/grails-converters/build.gradle +++ b/grails-converters/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-core/build.gradle b/grails-core/build.gradle index bbea195d0db..32da709a797 100644 --- a/grails-core/build.gradle +++ b/grails-core/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-data-hibernate5/boot-plugin/build.gradle b/grails-data-hibernate5/boot-plugin/build.gradle index 6dfcb4389df..448832a429c 100644 --- a/grails-data-hibernate5/boot-plugin/build.gradle +++ b/grails-data-hibernate5/boot-plugin/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-data-hibernate5/core/build.gradle b/grails-data-hibernate5/core/build.gradle index 4838afb4afd..17a66c2348f 100644 --- a/grails-data-hibernate5/core/build.gradle +++ b/grails-data-hibernate5/core/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-data-hibernate5/dbmigration/build.gradle b/grails-data-hibernate5/dbmigration/build.gradle index 342dbcfb17a..36c714199bf 100644 --- a/grails-data-hibernate5/dbmigration/build.gradle +++ b/grails-data-hibernate5/dbmigration/build.gradle @@ -26,6 +26,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-data-hibernate5/grails-plugin/build.gradle b/grails-data-hibernate5/grails-plugin/build.gradle index dd0a1a13dea..e7f272e38b8 100644 --- a/grails-data-hibernate5/grails-plugin/build.gradle +++ b/grails-data-hibernate5/grails-plugin/build.gradle @@ -26,6 +26,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-data-hibernate5/spring-orm/build.gradle b/grails-data-hibernate5/spring-orm/build.gradle index 6e65fbdc636..f5b90646679 100644 --- a/grails-data-hibernate5/spring-orm/build.gradle +++ b/grails-data-hibernate5/spring-orm/build.gradle @@ -29,6 +29,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-data-mongodb/boot-plugin/build.gradle b/grails-data-mongodb/boot-plugin/build.gradle index 31a76648f24..7fde1f36ff3 100644 --- a/grails-data-mongodb/boot-plugin/build.gradle +++ b/grails-data-mongodb/boot-plugin/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-data-mongodb/bson/build.gradle b/grails-data-mongodb/bson/build.gradle index 6c1e0243bb8..7fd2d5022c5 100644 --- a/grails-data-mongodb/bson/build.gradle +++ b/grails-data-mongodb/bson/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-data-mongodb/core/build.gradle b/grails-data-mongodb/core/build.gradle index 94c1e6d97e1..c9a48d4b664 100644 --- a/grails-data-mongodb/core/build.gradle +++ b/grails-data-mongodb/core/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-data-mongodb/ext/build.gradle b/grails-data-mongodb/ext/build.gradle index 982b44960db..16f0e30c4c5 100644 --- a/grails-data-mongodb/ext/build.gradle +++ b/grails-data-mongodb/ext/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-data-mongodb/grails-plugin/build.gradle b/grails-data-mongodb/grails-plugin/build.gradle index c22e6dca21e..553b6d5de94 100644 --- a/grails-data-mongodb/grails-plugin/build.gradle +++ b/grails-data-mongodb/grails-plugin/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-data-mongodb/gson-templates/build.gradle b/grails-data-mongodb/gson-templates/build.gradle index da0d0758faa..b9c3ac8d7da 100644 --- a/grails-data-mongodb/gson-templates/build.gradle +++ b/grails-data-mongodb/gson-templates/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-data-simple/build.gradle b/grails-data-simple/build.gradle index 1290a63ad55..6f056842b90 100644 --- a/grails-data-simple/build.gradle +++ b/grails-data-simple/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-databinding-core/build.gradle b/grails-databinding-core/build.gradle index cee4c8051b6..6acbb1d267c 100644 --- a/grails-databinding-core/build.gradle +++ b/grails-databinding-core/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-databinding/build.gradle b/grails-databinding/build.gradle index 363c0012853..dedfee2aaf7 100644 --- a/grails-databinding/build.gradle +++ b/grails-databinding/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-datamapping-async/build.gradle b/grails-datamapping-async/build.gradle index 00c2afdff4a..c300d670689 100644 --- a/grails-datamapping-async/build.gradle +++ b/grails-datamapping-async/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-datamapping-core/build.gradle b/grails-datamapping-core/build.gradle index 700db6df885..daea719e72e 100644 --- a/grails-datamapping-core/build.gradle +++ b/grails-datamapping-core/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-datamapping-rx/build.gradle b/grails-datamapping-rx/build.gradle index e0d5c9d6ea9..15e9efc507b 100644 --- a/grails-datamapping-rx/build.gradle +++ b/grails-datamapping-rx/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-datamapping-support/build.gradle b/grails-datamapping-support/build.gradle index 78a342a5c8d..e2ed2168d7e 100644 --- a/grails-datamapping-support/build.gradle +++ b/grails-datamapping-support/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-datamapping-tck/build.gradle b/grails-datamapping-tck/build.gradle index bc42a8baa44..ac1fa0ab0a8 100644 --- a/grails-datamapping-tck/build.gradle +++ b/grails-datamapping-tck/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-datamapping-validation/build.gradle b/grails-datamapping-validation/build.gradle index accbf04ac20..4483682f671 100644 --- a/grails-datamapping-validation/build.gradle +++ b/grails-datamapping-validation/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-datasource/build.gradle b/grails-datasource/build.gradle index c6cf03293e3..b2ea1a4ed66 100644 --- a/grails-datasource/build.gradle +++ b/grails-datasource/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-datastore-async/build.gradle b/grails-datastore-async/build.gradle index edb0d968a26..3afeb114b18 100644 --- a/grails-datastore-async/build.gradle +++ b/grails-datastore-async/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-datastore-core/build.gradle b/grails-datastore-core/build.gradle index 85da8ab7a1c..e387419b777 100644 --- a/grails-datastore-core/build.gradle +++ b/grails-datastore-core/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-datastore-web/build.gradle b/grails-datastore-web/build.gradle index 7589e7531e9..e0c76671d95 100644 --- a/grails-datastore-web/build.gradle +++ b/grails-datastore-web/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-domain-class/build.gradle b/grails-domain-class/build.gradle index 95103142436..4594208a055 100644 --- a/grails-domain-class/build.gradle +++ b/grails-domain-class/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-encoder/build.gradle b/grails-encoder/build.gradle index 692cf98566a..b72c18d0a0c 100644 --- a/grails-encoder/build.gradle +++ b/grails-encoder/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-events/core/build.gradle b/grails-events/core/build.gradle index fed99b5dd2d..3336a2c93fe 100644 --- a/grails-events/core/build.gradle +++ b/grails-events/core/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-events/gpars/build.gradle b/grails-events/gpars/build.gradle index 3e80b36094f..746d28260b2 100644 --- a/grails-events/gpars/build.gradle +++ b/grails-events/gpars/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-events/plugin/build.gradle b/grails-events/plugin/build.gradle index 5069cad90fe..1298082db28 100644 --- a/grails-events/plugin/build.gradle +++ b/grails-events/plugin/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-events/rxjava/build.gradle b/grails-events/rxjava/build.gradle index d53e072abcd..f5a8d14a2bf 100644 --- a/grails-events/rxjava/build.gradle +++ b/grails-events/rxjava/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-events/rxjava2/build.gradle b/grails-events/rxjava2/build.gradle index 43791ba91fb..523491abadd 100644 --- a/grails-events/rxjava2/build.gradle +++ b/grails-events/rxjava2/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-events/rxjava3/build.gradle b/grails-events/rxjava3/build.gradle index 2daa711d671..5317145cad7 100644 --- a/grails-events/rxjava3/build.gradle +++ b/grails-events/rxjava3/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-events/spring/build.gradle b/grails-events/spring/build.gradle index caefaf3ef6c..b09399742e5 100644 --- a/grails-events/spring/build.gradle +++ b/grails-events/spring/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-events/transforms/build.gradle b/grails-events/transforms/build.gradle index b8797a4699e..2492836e3b7 100644 --- a/grails-events/transforms/build.gradle +++ b/grails-events/transforms/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-fields/build.gradle b/grails-fields/build.gradle index 1b30c8c623f..f92268d3590 100644 --- a/grails-fields/build.gradle +++ b/grails-fields/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-geb/build.gradle b/grails-geb/build.gradle index db3b5b47ea5..19a20382d81 100644 --- a/grails-geb/build.gradle +++ b/grails-geb/build.gradle @@ -26,6 +26,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-gradle/common/build.gradle b/grails-gradle/common/build.gradle index 9ec66022fff..17f053b9eb0 100644 --- a/grails-gradle/common/build.gradle +++ b/grails-gradle/common/build.gradle @@ -25,6 +25,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-gradle/model/build.gradle b/grails-gradle/model/build.gradle index 2cd0762d4de..3c5a2a78517 100644 --- a/grails-gradle/model/build.gradle +++ b/grails-gradle/model/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-gradle/plugins/build.gradle b/grails-gradle/plugins/build.gradle index 78bca0abee3..61328fd8426 100644 --- a/grails-gradle/plugins/build.gradle +++ b/grails-gradle/plugins/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-gradle/tasks/build.gradle b/grails-gradle/tasks/build.gradle index 5970381fa23..080f0c3a526 100644 --- a/grails-gradle/tasks/build.gradle +++ b/grails-gradle/tasks/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-gsp/core/build.gradle b/grails-gsp/core/build.gradle index a032e6f9742..0ae5f361163 100644 --- a/grails-gsp/core/build.gradle +++ b/grails-gsp/core/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-gsp/grails-layout/build.gradle b/grails-gsp/grails-layout/build.gradle index 59e02446ec0..26bcbfe943f 100644 --- a/grails-gsp/grails-layout/build.gradle +++ b/grails-gsp/grails-layout/build.gradle @@ -26,6 +26,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-gsp/grails-sitemesh3/build.gradle b/grails-gsp/grails-sitemesh3/build.gradle index 494e1dd0c92..db052a8e440 100644 --- a/grails-gsp/grails-sitemesh3/build.gradle +++ b/grails-gsp/grails-sitemesh3/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-gsp/grails-taglib/build.gradle b/grails-gsp/grails-taglib/build.gradle index 6ddf4cdd5c5..51dd10f1ea6 100644 --- a/grails-gsp/grails-taglib/build.gradle +++ b/grails-gsp/grails-taglib/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-gsp/grails-web-gsp-taglib/build.gradle b/grails-gsp/grails-web-gsp-taglib/build.gradle index e29c66a4ae4..a0451923835 100644 --- a/grails-gsp/grails-web-gsp-taglib/build.gradle +++ b/grails-gsp/grails-web-gsp-taglib/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-gsp/grails-web-gsp/build.gradle b/grails-gsp/grails-web-gsp/build.gradle index b5c19fef864..d8c1b800cd6 100644 --- a/grails-gsp/grails-web-gsp/build.gradle +++ b/grails-gsp/grails-web-gsp/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-gsp/grails-web-jsp/build.gradle b/grails-gsp/grails-web-jsp/build.gradle index 92a20f8bcd2..161b1b7080e 100644 --- a/grails-gsp/grails-web-jsp/build.gradle +++ b/grails-gsp/grails-web-jsp/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-gsp/grails-web-taglib/build.gradle b/grails-gsp/grails-web-taglib/build.gradle index f6c5fed7d1e..01b51a7a1ab 100644 --- a/grails-gsp/grails-web-taglib/build.gradle +++ b/grails-gsp/grails-web-taglib/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-gsp/plugin/build.gradle b/grails-gsp/plugin/build.gradle index 82e924f5a12..1319cb88a14 100644 --- a/grails-gsp/plugin/build.gradle +++ b/grails-gsp/plugin/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-i18n/build.gradle b/grails-i18n/build.gradle index c08aa68d99e..fe6aabf734a 100644 --- a/grails-i18n/build.gradle +++ b/grails-i18n/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-interceptors/build.gradle b/grails-interceptors/build.gradle index a54d1af3542..0fd0309ddf6 100644 --- a/grails-interceptors/build.gradle +++ b/grails-interceptors/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-logging/build.gradle b/grails-logging/build.gradle index 40ca7b5ae21..a9a548d9d03 100644 --- a/grails-logging/build.gradle +++ b/grails-logging/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-mimetypes/build.gradle b/grails-mimetypes/build.gradle index 20cd89b716d..91f68011133 100644 --- a/grails-mimetypes/build.gradle +++ b/grails-mimetypes/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-rest-transforms/build.gradle b/grails-rest-transforms/build.gradle index ad80cb4057f..76bb9311e24 100644 --- a/grails-rest-transforms/build.gradle +++ b/grails-rest-transforms/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-scaffolding/build.gradle b/grails-scaffolding/build.gradle index 93dfa5f2a48..e6dd2c16722 100644 --- a/grails-scaffolding/build.gradle +++ b/grails-scaffolding/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-services/build.gradle b/grails-services/build.gradle index c13a91ef248..ecfb2e96cdd 100644 --- a/grails-services/build.gradle +++ b/grails-services/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-shell-cli/build.gradle b/grails-shell-cli/build.gradle index b63e2a865ce..c4f35d3a73e 100644 --- a/grails-shell-cli/build.gradle +++ b/grails-shell-cli/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-spring/build.gradle b/grails-spring/build.gradle index 45048ac9c32..ec02285899e 100644 --- a/grails-spring/build.gradle +++ b/grails-spring/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-test-core/build.gradle b/grails-test-core/build.gradle index f23de34dc12..26ceabd96b6 100644 --- a/grails-test-core/build.gradle +++ b/grails-test-core/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-test-suite-base/build.gradle b/grails-test-suite-base/build.gradle index 6e5b9a320d0..d7f6a04d322 100644 --- a/grails-test-suite-base/build.gradle +++ b/grails-test-suite-base/build.gradle @@ -26,6 +26,7 @@ plugins { id 'org.apache.grails.buildsrc.compile' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-testing-support-core/build.gradle b/grails-testing-support-core/build.gradle index 223b2a9ba9d..1a9cda1ee52 100644 --- a/grails-testing-support-core/build.gradle +++ b/grails-testing-support-core/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-testing-support-datamapping/build.gradle b/grails-testing-support-datamapping/build.gradle index 715fbe3f983..38f00d96a6a 100755 --- a/grails-testing-support-datamapping/build.gradle +++ b/grails-testing-support-datamapping/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-testing-support-dbcleanup-core/build.gradle b/grails-testing-support-dbcleanup-core/build.gradle index 70f9682077e..f4698b0eb03 100644 --- a/grails-testing-support-dbcleanup-core/build.gradle +++ b/grails-testing-support-dbcleanup-core/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } diff --git a/grails-testing-support-dbcleanup-h2/build.gradle b/grails-testing-support-dbcleanup-h2/build.gradle index 2bc1cc0adff..b3c18b7b211 100644 --- a/grails-testing-support-dbcleanup-h2/build.gradle +++ b/grails-testing-support-dbcleanup-h2/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } diff --git a/grails-testing-support-dbcleanup-postgresql/build.gradle b/grails-testing-support-dbcleanup-postgresql/build.gradle index 6ff298cbc1e..5f99ce69962 100644 --- a/grails-testing-support-dbcleanup-postgresql/build.gradle +++ b/grails-testing-support-dbcleanup-postgresql/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-testing-support-http-client/build.gradle b/grails-testing-support-http-client/build.gradle index 7d8119d07d2..feff4743f34 100644 --- a/grails-testing-support-http-client/build.gradle +++ b/grails-testing-support-http-client/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-testing-support-mongodb/build.gradle b/grails-testing-support-mongodb/build.gradle index cad012a5cb0..ab82c26ffc2 100644 --- a/grails-testing-support-mongodb/build.gradle +++ b/grails-testing-support-mongodb/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-testing-support-views-gson/build.gradle b/grails-testing-support-views-gson/build.gradle index c847e79679a..fd60e5e89e2 100644 --- a/grails-testing-support-views-gson/build.gradle +++ b/grails-testing-support-views-gson/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-testing-support-web/build.gradle b/grails-testing-support-web/build.gradle index 6b362c056de..34ecdc36876 100755 --- a/grails-testing-support-web/build.gradle +++ b/grails-testing-support-web/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-url-mappings/build.gradle b/grails-url-mappings/build.gradle index 9e548d1212b..8f4b6d8679c 100644 --- a/grails-url-mappings/build.gradle +++ b/grails-url-mappings/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-validation/build.gradle b/grails-validation/build.gradle index 38b907bf6d2..e9088f45873 100644 --- a/grails-validation/build.gradle +++ b/grails-validation/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-views-core/build.gradle b/grails-views-core/build.gradle index d30a0d560da..a6ffab62d23 100644 --- a/grails-views-core/build.gradle +++ b/grails-views-core/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-views-gson/build.gradle b/grails-views-gson/build.gradle index de8b38ed5f6..caf186cb06e 100644 --- a/grails-views-gson/build.gradle +++ b/grails-views-gson/build.gradle @@ -26,6 +26,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-views-markup/build.gradle b/grails-views-markup/build.gradle index 48de6f7f0cb..0ee258916dd 100644 --- a/grails-views-markup/build.gradle +++ b/grails-views-markup/build.gradle @@ -26,6 +26,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-web-boot/build.gradle b/grails-web-boot/build.gradle index 3dbbd9fde67..0c6722dba51 100644 --- a/grails-web-boot/build.gradle +++ b/grails-web-boot/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-web-common/build.gradle b/grails-web-common/build.gradle index ff03053790d..c626d8f81b6 100644 --- a/grails-web-common/build.gradle +++ b/grails-web-common/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-web-core/build.gradle b/grails-web-core/build.gradle index cd9b52c6580..818a27a3763 100644 --- a/grails-web-core/build.gradle +++ b/grails-web-core/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-web-databinding/build.gradle b/grails-web-databinding/build.gradle index 92b7aecc41e..91422ef184e 100644 --- a/grails-web-databinding/build.gradle +++ b/grails-web-databinding/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-web-mvc/build.gradle b/grails-web-mvc/build.gradle index d16e9f41f32..32d7bc07f67 100644 --- a/grails-web-mvc/build.gradle +++ b/grails-web-mvc/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-web-url-mappings/build.gradle b/grails-web-url-mappings/build.gradle index 06c6b87870d..5aba4697dec 100644 --- a/grails-web-url-mappings/build.gradle +++ b/grails-web-url-mappings/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-wrapper/build.gradle b/grails-wrapper/build.gradle index 71a80b3ee42..2a0373cbd36 100644 --- a/grails-wrapper/build.gradle +++ b/grails-wrapper/build.gradle @@ -25,6 +25,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion From ef127f7c9ac4e69a097f640f8eada2e65dbc978c Mon Sep 17 00:00:00 2001 From: James Daugherty Date: Thu, 28 May 2026 12:50:02 -0400 Subject: [PATCH 5/9] Address Copilot review feedback: restrict coverage matrix to ubuntu-24.04 --- .github/workflows/coverage.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index d3aea1995f3..55478c63f32 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -34,7 +34,7 @@ jobs: strategy: fail-fast: false matrix: - os: [ubuntu-24.04, macos-latest, windows-latest] + os: [ubuntu-24.04] runs-on: ${{ matrix.os }} steps: - name: "📥 Checkout repository" @@ -67,7 +67,7 @@ jobs: strategy: fail-fast: false matrix: - os: [ubuntu-24.04, macos-latest, windows-latest] + os: [ubuntu-24.04] runs-on: ${{ matrix.os }} steps: - name: "📥 Checkout repository" From 73814c9d5fe4c6b090593b9fe0a8a84face81fb8 Mon Sep 17 00:00:00 2001 From: James Fredley Date: Fri, 29 May 2026 02:05:09 -0400 Subject: [PATCH 6/9] fix(ci): pin Coverage workflow actions to ASF-approved SHAs The jacoco coverage.yml workflow used floating action tags (checkout@v6, setup-java@v4, upload-artifact@v7.0.1, download-artifact@v7.0.0) and an outdated setup-gradle pin, which the ASF org policy rejects, causing the Coverage workflow to fail at startup. Pin every action to the ASF-approved commit SHAs used elsewhere in the repo (checkout v6.0.2, setup-java v5.2.0, setup-gradle v6.1.0 with cache-provider: basic, upload-artifact v7.0.1, download-artifact v8.0.1). Assisted-by: claude-code:claude-4.8-opus --- .github/workflows/coverage.yml | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index 55478c63f32..32b4586b61c 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -38,15 +38,16 @@ jobs: runs-on: ${{ matrix.os }} steps: - name: "📥 Checkout repository" - uses: actions/checkout@v6 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: "☕️ Setup JDK" - uses: actions/setup-java@v4 + uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0 with: distribution: liberica java-version: 21 - name: "🐘 Setup Gradle" - uses: gradle/actions/setup-gradle@4d9f0ba0025fe599b4ebab900eb7f3a1d93ef4c2 # v5.0.0 + uses: gradle/actions/setup-gradle@50e97c2cd7a37755bbfafc9c5b7cafaece252f6e # v6.1.0 with: + cache-provider: basic # 'basic' uses the MIT-licensed, open-source cache provider; the default 'enhanced' provider (v6+) is proprietary (Gradle commercial Terms of Use) develocity-access-key: ${{ secrets.DEVELOCITY_ACCESS_KEY }} - name: "🌡️ Run tests with coverage" run: > @@ -55,7 +56,7 @@ jobs: --stacktrace -PskipCodeStyle - name: "📤 Upload coverage artifact" - uses: actions/upload-artifact@v7.0.1 + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: coverage-core-${{ matrix.os }} path: build/reports/jacoco/aggregate/jacocoAggregateReport.xml @@ -71,15 +72,16 @@ jobs: runs-on: ${{ matrix.os }} steps: - name: "📥 Checkout repository" - uses: actions/checkout@v6 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: "☕️ Setup JDK" - uses: actions/setup-java@v4 + uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0 with: distribution: liberica java-version: 21 - name: "🐘 Setup Gradle" - uses: gradle/actions/setup-gradle@4d9f0ba0025fe599b4ebab900eb7f3a1d93ef4c2 # v5.0.0 + uses: gradle/actions/setup-gradle@50e97c2cd7a37755bbfafc9c5b7cafaece252f6e # v6.1.0 with: + cache-provider: basic # 'basic' uses the MIT-licensed, open-source cache provider; the default 'enhanced' provider (v6+) is proprietary (Gradle commercial Terms of Use) develocity-access-key: ${{ secrets.DEVELOCITY_ACCESS_KEY }} - name: "🌡️ Run tests with coverage" working-directory: grails-gradle @@ -89,7 +91,7 @@ jobs: --stacktrace -PskipCodeStyle - name: "📤 Upload coverage artifact" - uses: actions/upload-artifact@v7.0.1 + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: coverage-gradle-${{ matrix.os }} path: grails-gradle/build/reports/jacoco/aggregate/jacocoAggregateReport.xml @@ -103,9 +105,9 @@ jobs: runs-on: ubuntu-24.04 steps: - name: "📥 Checkout repository" - uses: actions/checkout@v6 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: "📥 Download all coverage artifacts" - uses: actions/download-artifact@v7.0.0 + uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 with: path: coverage-reports - name: "📊 Upload coverage to Codecov" From cea97996ba93da5deae1388663ef993f9f2e6078 Mon Sep 17 00:00:00 2001 From: Walter Duque de Estrada Date: Sun, 31 May 2026 21:44:48 -0500 Subject: [PATCH 7/9] test: stabilize scaffolding Geb tests with longer login and logout waits --- .../integrationTest/groovy/com/example/pages/LoginPage.groovy | 2 +- .../integrationTest/groovy/com/example/pages/LogoutPage.groovy | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/grails-test-examples/scaffolding/src/integrationTest/groovy/com/example/pages/LoginPage.groovy b/grails-test-examples/scaffolding/src/integrationTest/groovy/com/example/pages/LoginPage.groovy index 8a958f9f598..f7158f36d8a 100644 --- a/grails-test-examples/scaffolding/src/integrationTest/groovy/com/example/pages/LoginPage.groovy +++ b/grails-test-examples/scaffolding/src/integrationTest/groovy/com/example/pages/LoginPage.groovy @@ -36,6 +36,6 @@ class LoginPage extends Page { this.username = username this.password = password loginButton.click() - waitFor { title != pageTitle } + waitFor(30) { title != pageTitle } } } diff --git a/grails-test-examples/scaffolding/src/integrationTest/groovy/com/example/pages/LogoutPage.groovy b/grails-test-examples/scaffolding/src/integrationTest/groovy/com/example/pages/LogoutPage.groovy index dcaaae57cff..e099989d935 100644 --- a/grails-test-examples/scaffolding/src/integrationTest/groovy/com/example/pages/LogoutPage.groovy +++ b/grails-test-examples/scaffolding/src/integrationTest/groovy/com/example/pages/LogoutPage.groovy @@ -32,6 +32,6 @@ class LogoutPage extends Page { void logout() { logoutButton.click() - waitFor { title != pageTitle } + waitFor(30) { title != pageTitle } } } From aead128d238c7050014bc56cae269b5f96e0211b Mon Sep 17 00:00:00 2001 From: Mattias Reichel Date: Tue, 2 Jun 2026 15:23:36 +0200 Subject: [PATCH 8/9] build(refactor): update JaCoCo plugin - Enable and compile plugin statically - Use lazily evaluated log message - Extract jacoco version to gradle.properties --- .../grails/buildsrc/GrailsJacocoPlugin.groovy | 61 +++++++++++-------- gradle.properties | 1 + 2 files changed, 36 insertions(+), 26 deletions(-) diff --git a/build-logic/plugins/src/main/groovy/org/apache/grails/buildsrc/GrailsJacocoPlugin.groovy b/build-logic/plugins/src/main/groovy/org/apache/grails/buildsrc/GrailsJacocoPlugin.groovy index 0071fa61e9f..120d2c11834 100644 --- a/build-logic/plugins/src/main/groovy/org/apache/grails/buildsrc/GrailsJacocoPlugin.groovy +++ b/build-logic/plugins/src/main/groovy/org/apache/grails/buildsrc/GrailsJacocoPlugin.groovy @@ -18,15 +18,19 @@ */ package org.apache.grails.buildsrc -import groovy.transform.CompileDynamic +import groovy.transform.CompileStatic +import org.gradle.api.Action import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.api.plugins.JavaPlugin +import org.gradle.api.tasks.SourceSet +import org.gradle.api.tasks.SourceSetContainer import org.gradle.api.tasks.testing.Test import org.gradle.testing.jacoco.plugins.JacocoPlugin import org.gradle.testing.jacoco.plugins.JacocoPluginExtension import org.gradle.testing.jacoco.tasks.JacocoReport +import org.gradle.testing.jacoco.tasks.JacocoReportsContainer /** * Convention plugin for JaCoCo code coverage. Apply to each subproject that compiles code. @@ -36,18 +40,18 @@ import org.gradle.testing.jacoco.tasks.JacocoReport * each subproject's exec data into that task. The aggregate produces a single XML report * at build/reports/jacoco/aggregate/jacocoAggregateReport.xml suitable for Codecov upload. */ -@CompileDynamic +@CompileStatic class GrailsJacocoPlugin implements Plugin { static final String AGGREGATE_TASK_NAME = 'jacocoAggregateReport' @Override void apply(Project project) { - project.logger.info("Configuring JaCoCo for project: ${project.name}") + project.logger.info('Configuring JaCoCo for project: {}', project.name) project.pluginManager.apply(JacocoPlugin) project.extensions.configure(JacocoPluginExtension) { - it.toolVersion = '0.8.14' + it.toolVersion = project.findProperty('jacocoVersion') } project.tasks.withType(Test).configureEach { @@ -56,38 +60,40 @@ class GrailsJacocoPlugin implements Plugin { project.tasks.withType(JacocoReport).configureEach { it.dependsOn project.tasks.withType(Test) - it.reports { - it.xml.required = true - it.html.required = true - it.csv.required = true - } + it.reports({ JacocoReportsContainer reports -> + reports.xml.required.set(true) + reports.html.required.set(true) + reports.csv.required.set(true) + } as Action) } contributeToRootAggregateReport(project) } private static void contributeToRootAggregateReport(Project project) { - Project root = project.rootProject + def rootProject = project.rootProject // Ensure JacocoPlugin is on the root so its JacocoReport task has tooling available. // pluginManager.apply is idempotent — safe to call from every subproject. - root.pluginManager.apply(JacocoPlugin) + rootProject.pluginManager.apply(JacocoPlugin) // Register the aggregate task once on the first apply; subsequent subprojects find it by name. def aggregateTask - if (root.tasks.names.contains(AGGREGATE_TASK_NAME)) { - aggregateTask = root.tasks.named(AGGREGATE_TASK_NAME, JacocoReport) + if (rootProject.tasks.names.contains(AGGREGATE_TASK_NAME)) { + aggregateTask = rootProject.tasks.named(AGGREGATE_TASK_NAME, JacocoReport) } else { - aggregateTask = root.tasks.register(AGGREGATE_TASK_NAME, JacocoReport) { JacocoReport task -> - task.group = 'verification' - task.description = 'Aggregates JaCoCo coverage from all subprojects into a single XML report for Codecov.' - task.reports { - it.xml.required = true - it.xml.outputLocation = root.layout.buildDirectory.file( + aggregateTask = rootProject.tasks.register(AGGREGATE_TASK_NAME, JacocoReport) { + it.group = 'verification' + it.description = 'Aggregates JaCoCo coverage from all subprojects into a single XML report for Codecov.' + it.reports({ JacocoReportsContainer reports -> + reports.xml.required.set(true) + reports.xml.outputLocation.set(rootProject.layout.buildDirectory.file( 'reports/jacoco/aggregate/jacocoAggregateReport.xml' - ) - it.html.required = false - it.csv.required = false + )) + reports.html.required.set(false) + reports.csv.required.set(false) + + } as Action) } task.onlyIf { JacocoReport t -> !t.executionData.files.isEmpty() } } @@ -107,10 +113,13 @@ class GrailsJacocoPlugin implements Plugin { // same name". Exec data from H7 test runs is still included above so their coverage // is attributed to the H5 class definitions. if (!project.path.contains('hibernate7')) { - project.plugins.withType(JavaPlugin) { - aggregateTask.configure { JacocoReport task -> - task.sourceDirectories.from(project.sourceSets.main.allSource.srcDirs) - task.classDirectories.from(project.sourceSets.main.output.classesDirs) + project.plugins.withType(JavaPlugin).configureEach { + def mainSourceSet = project.extensions + .getByType(SourceSetContainer) + .named(SourceSet.MAIN_SOURCE_SET_NAME) + aggregateTask.configure { + it.sourceDirectories.from(mainSourceSet.map { it.allSource.srcDirs }) + it.classDirectories.from(mainSourceSet.map { it.output.classesDirs }) } } } diff --git a/gradle.properties b/gradle.properties index 77c27d353b7..6d15317671a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -70,6 +70,7 @@ jbossTransactionApiVersion=2.0.0.Final # build dependencies for code quality checks checkstyleVersion=11.0.0 codenarcVersion=3.6.0-groovy-4.0 +jacocoVersion=0.8.14 pmdVersion=7.25.0 spotbugsPluginVersion=6.4.8 From da989a2c098f277197faef7c1d4ac9159e63b9a1 Mon Sep 17 00:00:00 2001 From: Mattias Reichel Date: Tue, 2 Jun 2026 15:27:33 +0200 Subject: [PATCH 9/9] build(style): update JaCoCo plugin - Use parentheses for method calls - Break closures bodies --- .../grails/buildsrc/GrailsJacocoPlugin.groovy | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/build-logic/plugins/src/main/groovy/org/apache/grails/buildsrc/GrailsJacocoPlugin.groovy b/build-logic/plugins/src/main/groovy/org/apache/grails/buildsrc/GrailsJacocoPlugin.groovy index 120d2c11834..8c337156a62 100644 --- a/build-logic/plugins/src/main/groovy/org/apache/grails/buildsrc/GrailsJacocoPlugin.groovy +++ b/build-logic/plugins/src/main/groovy/org/apache/grails/buildsrc/GrailsJacocoPlugin.groovy @@ -55,11 +55,11 @@ class GrailsJacocoPlugin implements Plugin { } project.tasks.withType(Test).configureEach { - it.finalizedBy 'jacocoTestReport' + it.finalizedBy('jacocoTestReport') } project.tasks.withType(JacocoReport).configureEach { - it.dependsOn project.tasks.withType(Test) + it.dependsOn(project.tasks.withType(Test)) it.reports({ JacocoReportsContainer reports -> reports.xml.required.set(true) reports.html.required.set(true) @@ -94,16 +94,19 @@ class GrailsJacocoPlugin implements Plugin { reports.csv.required.set(false) } as Action) + it.onlyIf { JacocoReport t -> + !t.executionData.files.isEmpty() } - task.onlyIf { JacocoReport t -> !t.executionData.files.isEmpty() } } } // Wire this subproject's test exec data into the aggregate. aggregateTask.configure { JacocoReport task -> - task.dependsOn project.tasks.withType(Test) + task.dependsOn(project.tasks.withType(Test)) task.executionData.from( - project.fileTree(project.file('build/jacoco')) { include '*.exec' } + project.fileTree(project.file('build/jacoco')) { + include('*.exec') + } ) }