From 38f64a7e18f897dc6a5a0af7b0a2220e015eda84 Mon Sep 17 00:00:00 2001 From: Gasper Kojek Date: Tue, 3 Mar 2026 14:27:06 +0100 Subject: [PATCH 1/7] build: make cacheable test inputs relocatable --- build-tools/scripts/src/main/groovy/jmh.gradle | 3 +-- geode-jmh/build.gradle | 4 ++-- geode-server-all/build.gradle | 2 +- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/build-tools/scripts/src/main/groovy/jmh.gradle b/build-tools/scripts/src/main/groovy/jmh.gradle index c470e08befbe..df16323e147d 100644 --- a/build-tools/scripts/src/main/groovy/jmh.gradle +++ b/build-tools/scripts/src/main/groovy/jmh.gradle @@ -35,7 +35,7 @@ dependencies { jmh { zip64 = true duplicateClassesStrategy = 'exclude' - jvmArgs += ['-javaagent:' + configurations.javaagent.singleFile] + jvmArgs += ["-javaagent:${project.relativePath(configurations.javaagent.singleFile)}"] include = project.hasProperty('jmh.include') ? project.property('jmh.include').tokenize() : ['.*'] profilers = project.hasProperty('jmh.profilers') ? project.property('jmh.profilers').tokenize() : [] @@ -69,4 +69,3 @@ jmhTest { configurations { jmhTestRuntimeOnly.extendsFrom(jmhRuntimeOnly) } - diff --git a/geode-jmh/build.gradle b/geode-jmh/build.gradle index b760b1ea417f..cf9817dd6cc3 100644 --- a/geode-jmh/build.gradle +++ b/geode-jmh/build.gradle @@ -43,14 +43,14 @@ jar { test { jvmArgs += [ - '-javaagent:' + jar.outputs.files.singleFile + "-javaagent:../libs/${jar.archiveFileName.get()}" ] dependsOn jar } repeatUnitTest { jvmArgs += [ - '-javaagent:' + jar.outputs.files.singleFile + "-javaagent:../libs/${jar.archiveFileName.get()}" ] dependsOn jar } diff --git a/geode-server-all/build.gradle b/geode-server-all/build.gradle index 94b525f3ae6e..8472817ae377 100644 --- a/geode-server-all/build.gradle +++ b/geode-server-all/build.gradle @@ -75,7 +75,7 @@ jar { ].each { tasks.named(it).configure { systemProperty 'test.buildVersion', version - systemProperty 'test.buildDirectory', buildDir + systemProperty 'test.buildDirectory', '..' dependsOn(tasks.named('jar')) } } From 0bff89d89438259fe35e12a4b726b2adb9fa0d9c Mon Sep 17 00:00:00 2001 From: Gasper Kojek Date: Fri, 27 Mar 2026 10:27:34 +0100 Subject: [PATCH 2/7] Disabled caching for all test tasks, ecept for :test, as they have utputs.upToDateWhen { false } configured, which effectively disabled caching anyway --- build-tools/scripts/src/main/groovy/geode-test.gradle | 3 +++ 1 file changed, 3 insertions(+) diff --git a/build-tools/scripts/src/main/groovy/geode-test.gradle b/build-tools/scripts/src/main/groovy/geode-test.gradle index 602f0b731651..73a56dfd2f79 100644 --- a/build-tools/scripts/src/main/groovy/geode-test.gradle +++ b/build-tools/scripts/src/main/groovy/geode-test.gradle @@ -91,12 +91,14 @@ configure([integrationTest, distributedTest, performanceTest, acceptanceTest, ui TestPropertiesWriter.writeTestProperties(buildDir, name) } outputs.upToDateWhen { false } + outputs.doNotCacheIf("Forced rerun") { true } } if (project.hasProperty("forceTest")) { // All test facets already force rerun. Only :test can be upToDate. test { outputs.upToDateWhen { false } + outputs.doNotCacheIf("Forced rerun") { true } } } @@ -148,6 +150,7 @@ configure([repeatDistributedTest, repeatIntegrationTest, repeatUpgradeTest, repe testFramework.options.excludeTags += "org.apache.geode.test.junit.categories.IgnoreInRepeatTestTasks" outputs.upToDateWhen { false } + outputs.doNotCacheIf("Forced rerun") { true } if (project.hasProperty("failOnNoMatchingTests")) { filter { From 6748617f9970fa643ea2e36c101efe87493ec4f5 Mon Sep 17 00:00:00 2001 From: Gasper Kojek Date: Fri, 27 Mar 2026 12:08:40 +0100 Subject: [PATCH 3/7] build: fix missing task dependencies causing cache disabled for correctness - Add sourcesJar.dependsOn(generateGrammarSource) in geode-core so the sourcesJar task declares its dependency on antlr-generated sources. - Replace taskGraph.whenReady combineReports wiring with eager subprojects configuration so Gradle sees the dependency declarations during configuration phase instead of after task graph finalization. --- build.gradle | 13 +++++++------ geode-core/build.gradle | 1 + 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/build.gradle b/build.gradle index 59c2e0a2ed9a..777e05c12797 100755 --- a/build.gradle +++ b/build.gradle @@ -228,9 +228,10 @@ if (project.hasProperty('askpass')) { } } -gradle.taskGraph.whenReady({ graph -> - def allTestTasks = rootProject.subprojects.collect { it.tasks.withType(Test) }.flatten() - def cr = tasks.getByName('combineReports') as TestReport - cr.reportOn allTestTasks - cr.dependsOn allTestTasks -}) +subprojects { + tasks.withType(Test).configureEach { testTask -> + def cr = rootProject.tasks.getByName('combineReports') as TestReport + cr.reportOn testTask + cr.dependsOn testTask + } +} diff --git a/geode-core/build.gradle b/geode-core/build.gradle index ee5ac51b11bb..4188aaea93a3 100755 --- a/geode-core/build.gradle +++ b/geode-core/build.gradle @@ -438,6 +438,7 @@ dependencies { } tasks.eclipse.dependsOn(generateGrammarSource) +sourcesJar.dependsOn(generateGrammarSource) distributedTest { // Some tests have inner tests that should be ignored From 62ecc5f966e6f53f8aeaa59f9ca47cfe9856d967 Mon Sep 17 00:00:00 2001 From: Gasper Kojek Date: Fri, 27 Mar 2026 14:09:53 +0100 Subject: [PATCH 4/7] build: use mustRunAfter instead of dependsOn for combineReports dependsOn forces all test tasks to execute when combineReports runs. The original whenReady wiring never triggered tasks because the graph was already sealed. mustRunAfter preserves ordering without forcing execution. --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 777e05c12797..8ae3ec9bac27 100755 --- a/build.gradle +++ b/build.gradle @@ -232,6 +232,6 @@ subprojects { tasks.withType(Test).configureEach { testTask -> def cr = rootProject.tasks.getByName('combineReports') as TestReport cr.reportOn testTask - cr.dependsOn testTask + cr.mustRunAfter testTask } } From beeefff150189b946a247fe3388192d532564cb9 Mon Sep 17 00:00:00 2001 From: Gasper Kojek Date: Fri, 27 Mar 2026 14:15:47 +0100 Subject: [PATCH 5/7] build: revert eager combineReports wiring, fix geode-old-versions only reportOn creates implicit file dependencies that trigger all test tasks. Revert to original whenReady block and instead add the missing finalizedBy/mustRunAfter wiring in geode-old-versions, which is the only project that lacks it since it doesn't apply geode-test.gradle. --- build.gradle | 13 ++++++------- geode-old-versions/build.gradle | 3 +++ 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/build.gradle b/build.gradle index 8ae3ec9bac27..59c2e0a2ed9a 100755 --- a/build.gradle +++ b/build.gradle @@ -228,10 +228,9 @@ if (project.hasProperty('askpass')) { } } -subprojects { - tasks.withType(Test).configureEach { testTask -> - def cr = rootProject.tasks.getByName('combineReports') as TestReport - cr.reportOn testTask - cr.mustRunAfter testTask - } -} +gradle.taskGraph.whenReady({ graph -> + def allTestTasks = rootProject.subprojects.collect { it.tasks.withType(Test) }.flatten() + def cr = tasks.getByName('combineReports') as TestReport + cr.reportOn allTestTasks + cr.dependsOn allTestTasks +}) diff --git a/geode-old-versions/build.gradle b/geode-old-versions/build.gradle index 71309b66d725..c790ed0c4d8f 100644 --- a/geode-old-versions/build.gradle +++ b/geode-old-versions/build.gradle @@ -141,3 +141,6 @@ tasks.register('geodeOldVersionClasspathsJar', Jar) { artifacts { classpathsOutput tasks.named('geodeOldVersionClasspathsJar') } + +test.finalizedBy rootProject.tasks.combineReports +rootProject.tasks.combineReports.mustRunAfter test From 6bcf3b2ac30f86aff8014ba2404d6196537a68cd Mon Sep 17 00:00:00 2001 From: Gasper Kojek Date: Mon, 30 Mar 2026 14:23:06 +0200 Subject: [PATCH 6/7] build: exclude geode-old-versions version dirs from rat task inputs The version subdirectories (1.10.0, 1.11.0, etc.) are empty Gradle project directories with no source files. Gradle creates them during the build, so their presence differs between clean builds in different locations, causing a rat task cache miss. --- build-tools/scripts/src/main/groovy/geode-rat.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/build-tools/scripts/src/main/groovy/geode-rat.gradle b/build-tools/scripts/src/main/groovy/geode-rat.gradle index dca43213de10..1489f2dbf062 100644 --- a/build-tools/scripts/src/main/groovy/geode-rat.gradle +++ b/build-tools/scripts/src/main/groovy/geode-rat.gradle @@ -31,6 +31,7 @@ rat { // gradle '**/.gradle/**', + 'geode-old-versions/[0-9]*/**', 'gradlew', 'gradlew.bat', 'gradle/wrapper/gradle-wrapper.properties', From cdaf7aabe7259c89ce18cfe1d6c0d04082b27b10 Mon Sep 17 00:00:00 2001 From: Gasper Kojek Date: Mon, 30 Mar 2026 16:43:38 +0200 Subject: [PATCH 7/7] build: clean geode-old-versions subproject dirs to fix rat cache miss The version subdirectories (1.10.0, 1.11.0, etc.) are not in git but get created during the build as Gradle project directories. On subsequent clean builds from the same location, these dirs persist after clean and cause rat task input fingerprint mismatches. Add a deleteOldGeodeVersions task finalized by clean to remove them. --- build-tools/scripts/src/main/groovy/geode-rat.gradle | 1 - geode-old-versions/build.gradle | 5 +++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/build-tools/scripts/src/main/groovy/geode-rat.gradle b/build-tools/scripts/src/main/groovy/geode-rat.gradle index 1489f2dbf062..dca43213de10 100644 --- a/build-tools/scripts/src/main/groovy/geode-rat.gradle +++ b/build-tools/scripts/src/main/groovy/geode-rat.gradle @@ -31,7 +31,6 @@ rat { // gradle '**/.gradle/**', - 'geode-old-versions/[0-9]*/**', 'gradlew', 'gradlew.bat', 'gradle/wrapper/gradle-wrapper.properties', diff --git a/geode-old-versions/build.gradle b/geode-old-versions/build.gradle index c790ed0c4d8f..059248bff8cb 100644 --- a/geode-old-versions/build.gradle +++ b/geode-old-versions/build.gradle @@ -110,8 +110,13 @@ tasks.register('createGeodeClasspathsFile') { } } +tasks.register('deleteOldGeodeVersions', Delete) { + delete subprojects.collect { it.projectDir } +} + tasks.named('clean') { dependsOn subprojects.collect { it.tasks.named('clean') } + finalizedBy deleteOldGeodeVersions } project.createGeodeClasspathsFile.mustRunAfter(clean)