This is an automated email from the ASF dual-hosted git repository.

jerryshao pushed a commit to branch branch-1.3
in repository https://gitbox.apache.org/repos/asf/gravitino.git


The following commit(s) were added to refs/heads/branch-1.3 by this push:
     new c922c80bbc [Cherry-pick to branch-1.3] [#12583] improvement(ci): 
Optimize build test execution (#12584) (#12703)
c922c80bbc is described below

commit c922c80bbc1b5c8903ddc6f55bff59473193274b
Author: Qi Yu <[email protected]>
AuthorDate: Fri Aug 28 13:59:56 2026 +0800

    [Cherry-pick to branch-1.3] [#12583] improvement(ci): Optimize build test 
execution (#12584) (#12703)
    
    ### What changes were proposed in this pull request?
    
    Backport #12584 to `branch-1.3`.
    
    - Write Gradle test reports to task-specific directories.
    - Serialize tests sharing Docker resources.
    - Limit the build job to two Gradle workers.
    - Raise the build timeout from 90 to 120 minutes.
    
    ### Why are the changes needed?
    
    Reduce the build critical path and avoid CI build timeouts on
    `branch-1.3`.
    
    Fix: #12583
    
    ### Does this PR introduce _any_ user-facing change?
    
    No.
    
    ### How was this patch tested?
    
    - `./gradlew --no-daemon help --max-workers=2 -PskipWeb=true`
    - `git diff --check`
    
    ### Cherry-pick information
    
    - Original commit: `a80f6fd2e70c5d9e76ed98b3fbae706533687740`
    - Target branch: `branch-1.3`
    - Status: Clean cherry-pick
---
 .github/workflows/build.yml |  3 ++-
 build.gradle.kts            | 33 ++++++++++++++++++++++++++++++++-
 2 files changed, 34 insertions(+), 2 deletions(-)

diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 25f98b26ff..891616f1da 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -152,7 +152,7 @@ jobs:
     strategy:
       matrix:
         java-version: [ 17 ]
-    timeout-minutes: 90
+    timeout-minutes: 120
     needs: changes
     if: needs.changes.outputs.source_changes == 'true'
     # Steps represent a sequence of tasks that will be executed as part of the 
job
@@ -192,6 +192,7 @@ jobs:
 
           gradle_args=(
             build
+            --max-workers=2
             -PskipWeb=true
             -PskipITs
             -PskipDockerTests=false
diff --git a/build.gradle.kts b/build.gradle.kts
index 5e957ef255..ae26a4df48 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -25,6 +25,8 @@ import com.github.jk1.license.render.ReportRenderer
 import com.github.vlsi.gradle.dsl.configureEach
 import net.ltgt.gradle.errorprone.errorprone
 import org.gradle.api.attributes.java.TargetJvmVersion
+import org.gradle.api.services.BuildService
+import org.gradle.api.services.BuildServiceParameters
 import org.gradle.api.tasks.testing.logging.TestExceptionFormat
 import org.gradle.internal.hash.ChecksumService
 import org.gradle.internal.os.OperatingSystem
@@ -34,6 +36,8 @@ import java.util.Locale
 
 Locale.setDefault(Locale.US)
 
+abstract class SharedTestEnvironmentLock : 
BuildService<BuildServiceParameters.None>
+
 plugins {
   `maven-publish`
   id("java")
@@ -61,6 +65,13 @@ plugins {
   alias(libs.plugins.errorprone)
 }
 
+val sharedTestEnvironmentLock = gradle.sharedServices.registerIfAbsent(
+  "sharedTestEnvironmentLock",
+  SharedTestEnvironmentLock::class
+) {
+  maxParallelUsages.set(1)
+}
+
 val snappyJavaVersion: String = libs.versions.snappy.java.get()
 
 val scalaVersion: String = project.properties["scalaVersion"] as? String ?: 
extra["defaultScalaVersion"].toString()
@@ -676,7 +687,11 @@ subprojects {
       showCauses = true
       showStackTraces = true
     }
-    
reports.html.outputLocation.set(file("${rootProject.projectDir}/build/reports/"))
+    // Distinct outputs let Gradle execute independent test tasks in parallel.
+    val testReportPath = path.removePrefix(":").replace(':', '/')
+    reports.html.outputLocation.set(
+      rootProject.layout.buildDirectory.dir("reports/tests/$testReportPath")
+    )
     val skipTests = project.hasProperty("skipTests")
     if (!skipTests) {
       val extraArgs = project.property("extraJvmArgs") as List<String>
@@ -1251,6 +1266,22 @@ gradle.projectsEvaluated {
     subprojectJarOutputDirs.map { 
it.get().asFile.toPath().toAbsolutePath().normalize() }
 
   allprojects {
+    val runsIntegrationTestsOnly = rootProject.hasProperty("skipTests")
+    val hasDockerTests =
+      rootProject.extra["dockerTest"] == true && fileTree("src/test") {
+        include("**/*.java", "**/*.kt")
+      }.any { it.readText().contains("gravitino-docker-test") }
+
+    // Integration tests in different projects share the same Gravitino 
server, database,
+    // containers, and configuration files. Running them together lets one 
test stop or reset
+    // resources while another test is still using them. Normal builds keep 
independent unit tests
+    // parallel and serialize only projects that contain Docker-tagged tests.
+    if (runsIntegrationTestsOnly || hasDockerTests) {
+      tasks.withType<Test>().configureEach {
+        usesService(sharedTestEnvironmentLock)
+      }
+    }
+
     tasks.withType<Jar>().configureEach {
       mustRunAfter(cleanDistributionPackageTask)
     }

Reply via email to