From d996002f32e036ebf20f884e84ff665e7c940f70 Mon Sep 17 00:00:00 2001 From: Brice Dutheil Date: Thu, 4 Dec 2025 17:55:35 +0100 Subject: [PATCH 01/12] fix: Try using a test task specific folder for user preference to avoid locks --- .../src/main/kotlin/dd-trace-java.configure-tests.gradle.kts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/buildSrc/src/main/kotlin/dd-trace-java.configure-tests.gradle.kts b/buildSrc/src/main/kotlin/dd-trace-java.configure-tests.gradle.kts index d0060bbf278..23289cb08e6 100644 --- a/buildSrc/src/main/kotlin/dd-trace-java.configure-tests.gradle.kts +++ b/buildSrc/src/main/kotlin/dd-trace-java.configure-tests.gradle.kts @@ -42,6 +42,10 @@ tasks.withType().configureEach { !rootProject.providers.gradleProperty("rerun.tests.${project.name}").isPresent } + // Trick to avoid on CI: "Couldn't flush user prefs: java.util.prefs.BackingStoreException: Couldn't get file lock." + // Use a task-specific user prefs directory + systemProperty("java.util.prefs.userRoot", "$buildDir/tmp/userPrefs/${name}") + // Split up tests that want to run forked in their own separate JVM for generated tasks if (name.startsWith("forkedTest") || name.endsWith("ForkedTest")) { setExcludes(emptyList()) From 494569698dd4e78aebb12c0e30069e2cfbe49709 Mon Sep 17 00:00:00 2001 From: Brice Dutheil Date: Fri, 5 Dec 2025 18:58:33 +0100 Subject: [PATCH 02/12] fix: Use a temporary preference folder for gradle smoke tests --- .../trace/civisibility/CiVisibilitySmokeTest.groovy | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/dd-java-agent/agent-ci-visibility/civisibility-test-fixtures/src/main/groovy/datadog/trace/civisibility/CiVisibilitySmokeTest.groovy b/dd-java-agent/agent-ci-visibility/civisibility-test-fixtures/src/main/groovy/datadog/trace/civisibility/CiVisibilitySmokeTest.groovy index 31e4d6a67af..6682d04cfc1 100644 --- a/dd-java-agent/agent-ci-visibility/civisibility-test-fixtures/src/main/groovy/datadog/trace/civisibility/CiVisibilitySmokeTest.groovy +++ b/dd-java-agent/agent-ci-visibility/civisibility-test-fixtures/src/main/groovy/datadog/trace/civisibility/CiVisibilitySmokeTest.groovy @@ -7,8 +7,11 @@ import datadog.trace.api.config.GeneralConfig import datadog.trace.api.config.TraceInstrumentationConfig import datadog.trace.api.config.TracerConfig import spock.lang.Specification +import spock.lang.TempDir import spock.util.environment.Jvm +import java.nio.file.Path + import static datadog.trace.util.ConfigStrings.propertyNameToSystemPropertyName abstract class CiVisibilitySmokeTest extends Specification { @@ -21,6 +24,9 @@ abstract class CiVisibilitySmokeTest extends Specification { private static final Map DEFAULT_TRACER_CONFIG = defaultJvmArguments() + @TempDir + protected Path prefsDir + protected static String buildJavaHome() { if (Jvm.current.isJava8()) { return System.getenv("JAVA_8_HOME") @@ -69,6 +75,10 @@ abstract class CiVisibilitySmokeTest extends Specification { protected List buildJvmArguments(String mockBackendIntakeUrl, String serviceName, Map additionalArgs) { List arguments = [] + + // Trick to avoid on CI: "Couldn't flush user prefs: java.util.prefs.BackingStoreException: Couldn't get file lock." + arguments += "-Djava.util.prefs.userRoot=${prefsDir.toAbsolutePath()}" + Map argMap = buildJvmArgMap(mockBackendIntakeUrl, serviceName, additionalArgs) // for convenience when debugging locally From 6daaf0107edd39f8c55a01b90b382026f8c75711 Mon Sep 17 00:00:00 2001 From: Alexey Kuznetsov Date: Sat, 6 Dec 2025 09:46:15 -0500 Subject: [PATCH 03/12] Fixed temp folder for prefs. --- .../trace/civisibility/CiVisibilitySmokeTest.groovy | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/dd-java-agent/agent-ci-visibility/civisibility-test-fixtures/src/main/groovy/datadog/trace/civisibility/CiVisibilitySmokeTest.groovy b/dd-java-agent/agent-ci-visibility/civisibility-test-fixtures/src/main/groovy/datadog/trace/civisibility/CiVisibilitySmokeTest.groovy index 6682d04cfc1..5cba421fb76 100644 --- a/dd-java-agent/agent-ci-visibility/civisibility-test-fixtures/src/main/groovy/datadog/trace/civisibility/CiVisibilitySmokeTest.groovy +++ b/dd-java-agent/agent-ci-visibility/civisibility-test-fixtures/src/main/groovy/datadog/trace/civisibility/CiVisibilitySmokeTest.groovy @@ -6,6 +6,7 @@ import datadog.trace.api.config.CiVisibilityConfig import datadog.trace.api.config.GeneralConfig import datadog.trace.api.config.TraceInstrumentationConfig import datadog.trace.api.config.TracerConfig +import spock.lang.Shared import spock.lang.Specification import spock.lang.TempDir import spock.util.environment.Jvm @@ -27,6 +28,10 @@ abstract class CiVisibilitySmokeTest extends Specification { @TempDir protected Path prefsDir + @Shared + @TempDir + protected Path prefsDirShared + protected static String buildJavaHome() { if (Jvm.current.isJava8()) { return System.getenv("JAVA_8_HOME") @@ -77,7 +82,9 @@ abstract class CiVisibilitySmokeTest extends Specification { List arguments = [] // Trick to avoid on CI: "Couldn't flush user prefs: java.util.prefs.BackingStoreException: Couldn't get file lock." - arguments += "-Djava.util.prefs.userRoot=${prefsDir.toAbsolutePath()}" + // Some tests can setup arguments on spec level, so `prefsDir` will be `null` during `setupSpec()`. + String prefsPath = (prefsDir ?: prefsDirShared).toAbsolutePath() + arguments += "-Djava.util.prefs.userRoot=$prefsPath".toString() Map argMap = buildJvmArgMap(mockBackendIntakeUrl, serviceName, additionalArgs) From 7cecea523c8ed95eb83bbd83b7e8cdb3391f4a33 Mon Sep 17 00:00:00 2001 From: Brice Dutheil Date: Mon, 8 Dec 2025 10:21:32 +0100 Subject: [PATCH 04/12] chore: Emit a stacktrace for gradle jobs --- .gitlab-ci.yml | 1084 ++++++++--------- .../civisibility/CiVisibilitySmokeTest.groovy | 22 +- .../smoketest/GradleLauncherSmokeTest.groovy | 2 +- 3 files changed, 561 insertions(+), 547 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 81f123610c4..544eccfc6ea 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,19 +1,19 @@ include: - local: ".gitlab/one-pipeline.locked.yml" - - local: ".gitlab/benchmarks.yml" - - local: ".gitlab/macrobenchmarks.yml" - - local: ".gitlab/exploration-tests.yml" - - local: ".gitlab/ci-visibility-tests.yml" + # - local: ".gitlab/benchmarks.yml" + # - local: ".gitlab/macrobenchmarks.yml" + # - local: ".gitlab/exploration-tests.yml" + # - local: ".gitlab/ci-visibility-tests.yml" stages: - build - publish - shared-pipeline - - benchmarks - - macrobenchmarks + # - benchmarks + # - macrobenchmarks - tests - - exploration-tests - - ci-visibility-tests + # - exploration-tests + # - ci-visibility-tests - generate-signing-key variables: @@ -303,30 +303,30 @@ build_tests: - ./gradlew --version - ./gradlew clean $GRADLE_TARGET $GRADLE_PARAMS -PskipTests $GRADLE_ARGS -populate_dep_cache: - extends: build_tests - variables: - BUILD_CACHE_POLICY: pull - DEPENDENCY_CACHE_POLICY: push - rules: - - if: '$POPULATE_CACHE' - when: on_success - - when: manual - allow_failure: true - parallel: - matrix: - - GRADLE_TARGET: ":dd-java-agent:shadowJar :dd-trace-api:jar :dd-trace-ot:shadowJar" - CACHE_TYPE: "lib" - - GRADLE_TARGET: ":baseTest" - CACHE_TYPE: "base" - - GRADLE_TARGET: ":profilingTest" - CACHE_TYPE: "profiling" - - GRADLE_TARGET: ":instrumentationTest" - CACHE_TYPE: "inst" - - GRADLE_TARGET: ":instrumentationLatestDepTest" - CACHE_TYPE: "latestdep" - - GRADLE_TARGET: ":smokeTest" - CACHE_TYPE: "smoke" +# populate_dep_cache: +# extends: build_tests +# variables: +# BUILD_CACHE_POLICY: pull +# DEPENDENCY_CACHE_POLICY: push +# rules: +# - if: '$POPULATE_CACHE' +# when: on_success +# - when: manual +# allow_failure: true +# parallel: +# matrix: +# - GRADLE_TARGET: ":dd-java-agent:shadowJar :dd-trace-api:jar :dd-trace-ot:shadowJar" +# CACHE_TYPE: "lib" +# - GRADLE_TARGET: ":baseTest" +# CACHE_TYPE: "base" +# - GRADLE_TARGET: ":profilingTest" +# CACHE_TYPE: "profiling" +# - GRADLE_TARGET: ":instrumentationTest" +# CACHE_TYPE: "inst" +# - GRADLE_TARGET: ":instrumentationLatestDepTest" +# CACHE_TYPE: "latestdep" +# - GRADLE_TARGET: ":smokeTest" +# CACHE_TYPE: "smoke" publish-artifacts-to-s3: image: registry.ddbuild.io/images/mirror/amazon/aws-cli:2.4.29 @@ -360,56 +360,56 @@ publish-artifacts-to-s3: - links.json -spotless: - extends: .gradle_build - stage: tests - needs: [] - variables: - # TODO: Latest version of spotless is failing with OOM on CI only. - # Setting 8G memory solving this issue, but we need to solve it eventually. - GRADLE_MEM: 8G - KUBERNETES_MEMORY_REQUEST: 18Gi - KUBERNETES_MEMORY_LIMIT: 18Gi - script: - - ./gradlew --version - - ./gradlew spotlessCheck $GRADLE_ARGS - -config-inversion-linter: - extends: .gradle_build - stage: tests - needs: [] - script: - - ./gradlew --version - - ./gradlew logEnvVarUsages checkEnvironmentVariablesUsage checkConfigStrings - -test_published_artifacts: - extends: .gradle_build - image: ghcr.io/datadog/dd-trace-java-docker-build:${BUILDER_IMAGE_VERSION_PREFIX}7 # Needs Java7 for some tests - stage: tests - needs: [ build ] - variables: - CACHE_TYPE: "lib" - script: - - mvn_local_repo=$(./mvnw help:evaluate -Dexpression=settings.localRepository -q -DforceStdout) - - rm -rf "${mvn_local_repo}/com/datadoghq" - - export GPG_PRIVATE_KEY=$(aws ssm get-parameter --region us-east-1 --name ci.dd-trace-java.signing.gpg_private_key --with-decryption --query "Parameter.Value" --out text) - - export GPG_PASSWORD=$(aws ssm get-parameter --region us-east-1 --name ci.dd-trace-java.signing.gpg_passphrase --with-decryption --query "Parameter.Value" --out text) - - export GRADLE_OPTS="-Dorg.gradle.jvmargs='-Xms2G -Xmx2G -XX:ErrorFile=/tmp/hs_err_pid%p.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp'" - - ./gradlew publishToMavenLocal $GRADLE_ARGS - - cd test-published-dependencies - - export GRADLE_OPTS="-Dorg.gradle.jvmargs='-Xms1G -Xmx1G -XX:ErrorFile=/tmp/hs_err_pid%p.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp'" - - ./gradlew --version - - ./gradlew check --info $GRADLE_ARGS - after_script: - - *cgroup_info - - source .gitlab/gitlab-utils.sh - - gitlab_section_start "collect-reports" "Collecting reports" - - .gitlab/collect_reports.sh - - gitlab_section_end "collect-reports" - artifacts: - when: always - paths: - - ./check_reports +# spotless: +# extends: .gradle_build +# stage: tests +# needs: [] +# variables: +# # TODO: Latest version of spotless is failing with OOM on CI only. +# # Setting 8G memory solving this issue, but we need to solve it eventually. +# GRADLE_MEM: 8G +# KUBERNETES_MEMORY_REQUEST: 18Gi +# KUBERNETES_MEMORY_LIMIT: 18Gi +# script: +# - ./gradlew --version +# - ./gradlew spotlessCheck $GRADLE_ARGS +# +# config-inversion-linter: +# extends: .gradle_build +# stage: tests +# needs: [] +# script: +# - ./gradlew --version +# - ./gradlew logEnvVarUsages checkEnvironmentVariablesUsage checkConfigStrings +# +# test_published_artifacts: +# extends: .gradle_build +# image: ghcr.io/datadog/dd-trace-java-docker-build:${BUILDER_IMAGE_VERSION_PREFIX}7 # Needs Java7 for some tests +# stage: tests +# needs: [ build ] +# variables: +# CACHE_TYPE: "lib" +# script: +# - mvn_local_repo=$(./mvnw help:evaluate -Dexpression=settings.localRepository -q -DforceStdout) +# - rm -rf "${mvn_local_repo}/com/datadoghq" +# - export GPG_PRIVATE_KEY=$(aws ssm get-parameter --region us-east-1 --name ci.dd-trace-java.signing.gpg_private_key --with-decryption --query "Parameter.Value" --out text) +# - export GPG_PASSWORD=$(aws ssm get-parameter --region us-east-1 --name ci.dd-trace-java.signing.gpg_passphrase --with-decryption --query "Parameter.Value" --out text) +# - export GRADLE_OPTS="-Dorg.gradle.jvmargs='-Xms2G -Xmx2G -XX:ErrorFile=/tmp/hs_err_pid%p.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp'" +# - ./gradlew publishToMavenLocal $GRADLE_ARGS +# - cd test-published-dependencies +# - export GRADLE_OPTS="-Dorg.gradle.jvmargs='-Xms1G -Xmx1G -XX:ErrorFile=/tmp/hs_err_pid%p.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp'" +# - ./gradlew --version +# - ./gradlew check --info $GRADLE_ARGS +# after_script: +# - *cgroup_info +# - source .gitlab/gitlab-utils.sh +# - gitlab_section_start "collect-reports" "Collecting reports" +# - .gitlab/collect_reports.sh +# - gitlab_section_end "collect-reports" +# artifacts: +# when: always +# paths: +# - ./check_reports .check_job: extends: .gradle_build @@ -442,83 +442,83 @@ test_published_artifacts: - scheduler_failure - data_integrity_failure -check_build_src: - extends: .check_job - variables: - GRADLE_TARGET: ":buildSrc:build" - -check_base: - extends: .check_job - variables: - GRADLE_TARGET: ":baseCheck" - -check_inst: - extends: .check_job - parallel: 4 - variables: - GRADLE_TARGET: ":instrumentationCheck" - CACHE_TYPE: "inst" - -check_smoke: - extends: .check_job - parallel: 4 - variables: - GRADLE_TARGET: ":smokeCheck" - CACHE_TYPE: "smoke" - -check_profiling: - extends: .check_job - variables: - GRADLE_TARGET: ":profilingCheck" - -check_debugger: - extends: .check_job - variables: - GRADLE_TARGET: ":debuggerCheck" - -muzzle: - extends: .gradle_build - needs: [ build_tests ] - stage: tests - parallel: - matrix: - - CI_SPLIT: ["1/8", "2/8", "3/8", "4/8", "5/8", "6/8", "7/8", "8/8"] - variables: - CACHE_TYPE: "inst" - script: - - export SKIP_BUILDSCAN="true" - - ./gradlew --version - - ./gradlew :runMuzzle -PtaskPartitionCount=$NORMALIZED_NODE_TOTAL -PtaskPartition=$NORMALIZED_NODE_INDEX $GRADLE_ARGS - after_script: - - *cgroup_info - - source .gitlab/gitlab-utils.sh - - gitlab_section_start "collect-reports" "Collecting reports" - - .gitlab/collect_reports.sh - - gitlab_section_end "collect-reports" - artifacts: - when: always - paths: - - ./reports - - '.gradle/daemon/*/*.out.log' - -muzzle-dep-report: - extends: .gradle_build - needs: [ build_tests ] - stage: tests - variables: - CACHE_TYPE: "inst" - script: - - export SKIP_BUILDSCAN="true" - - ./gradlew --version - - ./gradlew generateMuzzleReport muzzleInstrumentationReport $GRADLE_ARGS - after_script: - - *cgroup_info - - .gitlab/collect_muzzle_deps.sh - artifacts: - when: always - paths: - - ./reports - - '.gradle/daemon/*/*.out.log' +# check_build_src: +# extends: .check_job +# variables: +# GRADLE_TARGET: ":buildSrc:build" +# +# check_base: +# extends: .check_job +# variables: +# GRADLE_TARGET: ":baseCheck" +# +# check_inst: +# extends: .check_job +# parallel: 4 +# variables: +# GRADLE_TARGET: ":instrumentationCheck" +# CACHE_TYPE: "inst" +# +# check_smoke: +# extends: .check_job +# parallel: 4 +# variables: +# GRADLE_TARGET: ":smokeCheck" +# CACHE_TYPE: "smoke" +# +# check_profiling: +# extends: .check_job +# variables: +# GRADLE_TARGET: ":profilingCheck" +# +# check_debugger: +# extends: .check_job +# variables: +# GRADLE_TARGET: ":debuggerCheck" + +# muzzle: +# extends: .gradle_build +# needs: [ build_tests ] +# stage: tests +# parallel: +# matrix: +# - CI_SPLIT: ["1/8", "2/8", "3/8", "4/8", "5/8", "6/8", "7/8", "8/8"] +# variables: +# CACHE_TYPE: "inst" +# script: +# - export SKIP_BUILDSCAN="true" +# - ./gradlew --version +# - ./gradlew :runMuzzle -PtaskPartitionCount=$NORMALIZED_NODE_TOTAL -PtaskPartition=$NORMALIZED_NODE_INDEX $GRADLE_ARGS +# after_script: +# - *cgroup_info +# - source .gitlab/gitlab-utils.sh +# - gitlab_section_start "collect-reports" "Collecting reports" +# - .gitlab/collect_reports.sh +# - gitlab_section_end "collect-reports" +# artifacts: +# when: always +# paths: +# - ./reports +# - '.gradle/daemon/*/*.out.log' +# +# muzzle-dep-report: +# extends: .gradle_build +# needs: [ build_tests ] +# stage: tests +# variables: +# CACHE_TYPE: "inst" +# script: +# - export SKIP_BUILDSCAN="true" +# - ./gradlew --version +# - ./gradlew generateMuzzleReport muzzleInstrumentationReport $GRADLE_ARGS +# after_script: +# - *cgroup_info +# - .gitlab/collect_muzzle_deps.sh +# artifacts: +# when: always +# paths: +# - ./reports +# - '.gradle/daemon/*/*.out.log' # In Gitlab, DD_* variables are set because the build runner is instrumented with Datadog telemetry # To have a pristine environment for the tests, these variables are saved before the test run and restored afterwards @@ -622,395 +622,395 @@ muzzle-dep-report: - !reference [.test_job, script] - .gitlab/check_test_agent_results.sh -agent_integration_tests: - extends: .test_job - tags: [ "arch:amd64" ] - variables: - testJvm: "8" - CI_AGENT_HOST: local-agent - GRADLE_TARGET: "traceAgentTest" - CACHE_TYPE: "base" - services: - - name: registry.ddbuild.io/images/mirror/datadog/agent:7.40.1 - alias: local-agent - variables: - DD_APM_ENABLED: "true" - DD_BIND_HOST: "0.0.0.0" - DD_HOSTNAME: "local-agent" - DD_API_KEY: "invalid_key_but_this_is_fine" - -test_base: - extends: .test_job - variables: - GRADLE_TARGET: ":baseTest" - CACHE_TYPE: "base" - parallel: - matrix: *test_matrix_4 - script: - - if [ "$testJvm" == "8" ]; then export GRADLE_PARAMS="-PskipFlakyTests -PcheckCoverage"; fi - - !reference [.test_job, script] - -test_inst: - extends: .test_job_with_test_agent - variables: - GRADLE_TARGET: ":instrumentationTest" - CACHE_TYPE: "inst" - parallel: - matrix: *test_matrix_6 - -test_inst_latest: - extends: .test_job_with_test_agent - variables: - GRADLE_TARGET: ":instrumentationLatestDepTest" - CACHE_TYPE: "latestdep" - parallel: - matrix: - - testJvm: ["8", "17", "21", "25"] # the latest "stable" version is LTS v25 - # Gitlab doesn't support "parallel" and "parallel:matrix" at the same time - # This emulates "parallel" by including it in the matrix - CI_SPLIT: [ "1/6", "2/6", "3/6", "4/6", "5/6", "6/6"] - -test_flaky: - extends: .test_job_with_test_agent - variables: - GRADLE_PARAMS: "-PrunFlakyTests" - CACHE_TYPE: "smoke" - testJvm: "8" - CONTINUE_ON_FAILURE: "true" - rules: - - *master_only - - if: $RUN_FLAKY_TESTS == "true" - when: on_success - parallel: - matrix: - - GRADLE_TARGET: [":baseTest", ":smokeTest", ":debuggerTest"] - # Gitlab doesn't support "parallel" and "parallel:matrix" at the same time - # This emulates "parallel" by including it in the matrix - CI_SPLIT: [ "1/4", "2/4", "3/4", "4/4" ] - -test_flaky_inst: - extends: .test_job - variables: - GRADLE_TARGET: ":instrumentationTest" - GRADLE_PARAMS: "-PrunFlakyTests" - CACHE_TYPE: "inst" - testJvm: "8" - CONTINUE_ON_FAILURE: "true" - rules: - - *master_only - - if: $RUN_FLAKY_TESTS == "true" - when: on_success - parallel: 6 - -test_profiling: - extends: .test_job - variables: - GRADLE_TARGET: ":profilingTest" - CACHE_TYPE: "profiling" - parallel: - matrix: *test_matrix - -# specific jvms list for debugger project because J9-based JVMs have issues with local vars -# so need to test at least against one J9-based JVM -test_debugger: - extends: .test_job - variables: - GRADLE_TARGET: ":debuggerTest" - CACHE_TYPE: "base" - DEFAULT_TEST_JVMS: /^(8|11|17|21|25|semeru8)$/ # the latest "stable" version is LTS v25 - parallel: - matrix: *test_matrix +# agent_integration_tests: +# extends: .test_job +# tags: [ "arch:amd64" ] +# variables: +# testJvm: "8" +# CI_AGENT_HOST: local-agent +# GRADLE_TARGET: "traceAgentTest" +# CACHE_TYPE: "base" +# services: +# - name: registry.ddbuild.io/images/mirror/datadog/agent:7.40.1 +# alias: local-agent +# variables: +# DD_APM_ENABLED: "true" +# DD_BIND_HOST: "0.0.0.0" +# DD_HOSTNAME: "local-agent" +# DD_API_KEY: "invalid_key_but_this_is_fine" +# +# test_base: +# extends: .test_job +# variables: +# GRADLE_TARGET: ":baseTest" +# CACHE_TYPE: "base" +# parallel: +# matrix: *test_matrix_4 +# script: +# - if [ "$testJvm" == "8" ]; then export GRADLE_PARAMS="-PskipFlakyTests -PcheckCoverage"; fi +# - !reference [.test_job, script] +# +# test_inst: +# extends: .test_job_with_test_agent +# variables: +# GRADLE_TARGET: ":instrumentationTest" +# CACHE_TYPE: "inst" +# parallel: +# matrix: *test_matrix_6 +# +# test_inst_latest: +# extends: .test_job_with_test_agent +# variables: +# GRADLE_TARGET: ":instrumentationLatestDepTest" +# CACHE_TYPE: "latestdep" +# parallel: +# matrix: +# - testJvm: ["8", "17", "21", "25"] # the latest "stable" version is LTS v25 +# # Gitlab doesn't support "parallel" and "parallel:matrix" at the same time +# # This emulates "parallel" by including it in the matrix +# CI_SPLIT: [ "1/6", "2/6", "3/6", "4/6", "5/6", "6/6"] +# +# test_flaky: +# extends: .test_job_with_test_agent +# variables: +# GRADLE_PARAMS: "-PrunFlakyTests" +# CACHE_TYPE: "smoke" +# testJvm: "8" +# CONTINUE_ON_FAILURE: "true" +# rules: +# - *master_only +# - if: $RUN_FLAKY_TESTS == "true" +# when: on_success +# parallel: +# matrix: +# - GRADLE_TARGET: [":baseTest", ":smokeTest", ":debuggerTest"] +# # Gitlab doesn't support "parallel" and "parallel:matrix" at the same time +# # This emulates "parallel" by including it in the matrix +# CI_SPLIT: [ "1/4", "2/4", "3/4", "4/4" ] +# +# test_flaky_inst: +# extends: .test_job +# variables: +# GRADLE_TARGET: ":instrumentationTest" +# GRADLE_PARAMS: "-PrunFlakyTests" +# CACHE_TYPE: "inst" +# testJvm: "8" +# CONTINUE_ON_FAILURE: "true" +# rules: +# - *master_only +# - if: $RUN_FLAKY_TESTS == "true" +# when: on_success +# parallel: 6 +# +# test_profiling: +# extends: .test_job +# variables: +# GRADLE_TARGET: ":profilingTest" +# CACHE_TYPE: "profiling" +# parallel: +# matrix: *test_matrix +# +# # specific jvms list for debugger project because J9-based JVMs have issues with local vars +# # so need to test at least against one J9-based JVM +# test_debugger: +# extends: .test_job +# variables: +# GRADLE_TARGET: ":debuggerTest" +# CACHE_TYPE: "base" +# DEFAULT_TEST_JVMS: /^(8|11|17|21|25|semeru8)$/ # the latest "stable" version is LTS v25 +# parallel: +# matrix: *test_matrix test_smoke: extends: .test_job variables: GRADLE_TARGET: "stageMainDist :smokeTest" - GRADLE_PARAMS: "-PskipFlakyTests" - CACHE_TYPE: "smoke" - parallel: - matrix: *test_matrix_4 - -test_ssi_smoke: - extends: .test_job - rules: *master_only - variables: - GRADLE_TARGET: "stageMainDist :smokeTest" + GRADLE_PARAMS: "-PskipFlakyTests --stacktrace" CACHE_TYPE: "smoke" - DD_INJECT_FORCE: "true" - DD_INJECTION_ENABLED: "tracer" parallel: matrix: *test_matrix_4 -test_smoke_graalvm: - extends: .test_job - tags: [ "arch:amd64" ] - variables: - GRADLE_TARGET: "stageMainDist :dd-smoke-test:spring-boot-3.0-native:test" - CACHE_TYPE: "smoke" - CI_NO_SPLIT: "true" - NON_DEFAULT_JVMS: "true" - parallel: - matrix: - - testJvm: ["graalvm17", "graalvm21", "graalvm25"] - -test_smoke_semeru8_debugger: - extends: .test_job - tags: [ "arch:amd64" ] - variables: - GRADLE_TARGET: "stageMainDist dd-smoke-tests:debugger-integration-tests:test" - CACHE_TYPE: "smoke" - NON_DEFAULT_JVMS: "true" - testJvm: "semeru8" - -deploy_to_profiling_backend: - stage: publish - needs: [ build ] - rules: - - if: '$POPULATE_CACHE' - when: never - - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH' - when: on_success - - if: '$CI_COMMIT_TAG =~ /^v.*/' - when: on_success - - when: manual - allow_failure: true - trigger: - project: DataDog/profiling-backend - branch: dogfooding - variables: - UPSTREAM_PACKAGE_JOB: $BUILD_JOB_NAME - UPSTREAM_PACKAGE_JOB_ID: $BUILD_JOB_ID - UPSTREAM_PROJECT_ID: $CI_PROJECT_ID - UPSTREAM_PROJECT_NAME: $CI_PROJECT_NAME - UPSTREAM_PIPELINE_ID: $CI_PIPELINE_ID - UPSTREAM_BRANCH: $CI_COMMIT_BRANCH - UPSTREAM_TAG: $CI_COMMIT_TAG - -trigger_tibco_tests: - stage: tests - needs: [ build ] - rules: - - if: '$POPULATE_CACHE' - when: never - - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH' - when: on_success - - if: '$CI_COMMIT_TAG =~ /^v.*/' - when: on_success - - when: manual - allow_failure: true - trigger: - project: DataDog/tibco-testing - branch: main - strategy: depend - variables: - UPSTREAM_PACKAGE_JOB: $BUILD_JOB_NAME - UPSTREAM_PACKAGE_JOB_ID: $BUILD_JOB_ID - UPSTREAM_PROJECT_ID: $CI_PROJECT_ID - UPSTREAM_PROJECT_NAME: $CI_PROJECT_NAME - UPSTREAM_PIPELINE_ID: $CI_PIPELINE_ID - UPSTREAM_BRANCH: $CI_COMMIT_BRANCH - UPSTREAM_TAG: $CI_COMMIT_TAG - FORCE_TRIGGER: $FORCE_TRIGGER - -deploy_to_di_backend:manual: - stage: publish - needs: [ build ] - rules: - - if: '$POPULATE_CACHE' - when: never - - when: manual - allow_failure: true - trigger: - project: DataDog/debugger-demos - branch: main - variables: - UPSTREAM_PACKAGE_JOB: build - UPSTREAM_PROJECT_ID: $CI_PROJECT_ID - UPSTREAM_PROJECT_NAME: $CI_PROJECT_NAME - UPSTREAM_PIPELINE_ID: $CI_PIPELINE_ID - UPSTREAM_BRANCH: $CI_COMMIT_BRANCH - UPSTREAM_TAG: $CI_COMMIT_TAG - UPSTREAM_COMMIT_AUTHOR: $CI_COMMIT_AUTHOR - UPSTREAM_COMMIT_SHORT_SHA: $CI_COMMIT_SHORT_SHA - -# If the deploy_to_maven_central job is re-run, re-trigger the deploy_artifacts_to_github job as well so that the artifacts match. -deploy_to_maven_central: - extends: .gradle_build - stage: publish - needs: [ build ] - variables: - CACHE_TYPE: "lib" - rules: - - if: '$POPULATE_CACHE' - when: never - - if: '$CI_COMMIT_BRANCH == "master"' - when: on_success - # Do not deploy release candidate versions - - if: '$CI_COMMIT_TAG =~ /^v[0-9]+\.[0-9]+\.[0-9]+$/' - when: on_success - - when: manual - allow_failure: true - script: - - export MAVEN_CENTRAL_USERNAME=$(aws ssm get-parameter --region us-east-1 --name ci.dd-trace-java.central_username --with-decryption --query "Parameter.Value" --out text) - - export MAVEN_CENTRAL_PASSWORD=$(aws ssm get-parameter --region us-east-1 --name ci.dd-trace-java.central_password --with-decryption --query "Parameter.Value" --out text) - - export GPG_PRIVATE_KEY=$(aws ssm get-parameter --region us-east-1 --name ci.dd-trace-java.signing.gpg_private_key --with-decryption --query "Parameter.Value" --out text) - - export GPG_PASSWORD=$(aws ssm get-parameter --region us-east-1 --name ci.dd-trace-java.signing.gpg_passphrase --with-decryption --query "Parameter.Value" --out text) - - ./gradlew -PbuildInfo.build.number=$CI_JOB_ID publishToSonatype closeSonatypeStagingRepository -PskipTests $GRADLE_ARGS - artifacts: - paths: - - 'workspace/dd-java-agent/build/libs/*.jar' - - 'workspace/dd-trace-api/build/libs/*.jar' - - 'workspace/dd-trace-ot/build/libs/*.jar' - -deploy_artifacts_to_github: - stage: publish - image: registry.ddbuild.io/images/dd-octo-sts-ci-base:2025.06-1 - tags: [ "arch:amd64" ] - id_tokens: - DDOCTOSTS_ID_TOKEN: - aud: dd-octo-sts - rules: - - if: '$POPULATE_CACHE' - when: never - - if: '$CI_COMMIT_TAG =~ /^v[0-9]+\.[0-9]+\.[0-9]+$/' - when: on_success - # Requires the deploy_to_maven_central job to have run first (the UP-TO-DATE gradle check across jobs is broken) - # This will deploy the artifacts built from the publishToSonatype task to the GitHub release - needs: - - job: deploy_to_maven_central - # The deploy_to_maven_central job is not run for release candidate versions - optional: true - before_script: - - dd-octo-sts version - - dd-octo-sts debug --scope DataDog/dd-trace-java --policy self.gitlab.release - - dd-octo-sts token --scope DataDog/dd-trace-java --policy self.gitlab.release > github-token.txt - script: - - gh auth login --with-token < github-token.txt - - gh auth status - - export VERSION=${CI_COMMIT_TAG##v} # remove "v" from front of tag to get version - - cp workspace/dd-java-agent/build/libs/dd-java-agent-${VERSION}.jar workspace/dd-java-agent/build/libs/dd-java-agent.jar # upload two filenames - - gh release upload --clobber --repo DataDog/dd-trace-java $CI_COMMIT_TAG workspace/dd-java-agent/build/libs/dd-java-agent.jar - - gh release upload --clobber --repo DataDog/dd-trace-java $CI_COMMIT_TAG workspace/dd-java-agent/build/libs/dd-java-agent-${VERSION}.jar - - gh release upload --clobber --repo DataDog/dd-trace-java $CI_COMMIT_TAG workspace/dd-trace-api/build/libs/dd-trace-api-${VERSION}.jar - - gh release upload --clobber --repo DataDog/dd-trace-java $CI_COMMIT_TAG workspace/dd-trace-ot/build/libs/dd-trace-ot-${VERSION}.jar - after_script: - - dd-octo-sts revoke -t $(cat github-token.txt) - retry: - max: 2 - when: always - -requirements_json_test: - rules: - - when: on_success - variables: - REQUIREMENTS_BLOCK_JSON_PATH: "metadata/requirements-block.json" - REQUIREMENTS_ALLOW_JSON_PATH: "metadata/requirements-allow.json" - -package-oci: - needs: [ build ] - -override_verify_maven_central: - image: registry.ddbuild.io/images/base/gbi-ubuntu_2204:release - stage: publish - needs: [ ] - rules: - - if: '$POPULATE_CACHE' - when: never - - when: manual - allow_failure: true - script: - - touch OVERRIDE_MAVEN_VERIFY - cache: # Cache is used to signal between the override_verify_maven_central and verify_maven_central_deployment jobs - - key: $CI_PIPELINE_ID-OVERRIDE_SIGNAL - paths: - - OVERRIDE_MAVEN_VERIFY - policy: push - unprotect: true - -# Verify Maven Central deployment is publicly available before publishing OCI images -verify_maven_central_deployment: - image: registry.ddbuild.io/images/base/gbi-ubuntu_2204:release - stage: publish - needs: [ deploy_to_maven_central ] - rules: - - if: '$POPULATE_CACHE' - when: never - - if: '$CI_COMMIT_TAG =~ /^v[0-9]+\.[0-9]+\.[0-9]+$/' - when: on_success - cache: # Cache is used to signal between the override_verify_maven_central and verify_maven_central_deployment jobs - - key: $CI_PIPELINE_ID-OVERRIDE_SIGNAL - paths: - - OVERRIDE_MAVEN_VERIFY - policy: pull - unprotect: true - script: - - if [ -f OVERRIDE_MAVEN_VERIFY ]; then echo "SKIPPING MAVEN VERIFICATION"; exit 0; fi - - | - export VERSION=${CI_COMMIT_TAG##v} - ARTIFACT_URLS=( - "https://repo1.maven.org/maven2/com/datadoghq/dd-java-agent/${VERSION}/dd-java-agent-${VERSION}.jar" - "https://repo1.maven.org/maven2/com/datadoghq/dd-trace-api/${VERSION}/dd-trace-api-${VERSION}.jar" - "https://repo1.maven.org/maven2/com/datadoghq/dd-trace-ot/${VERSION}/dd-trace-ot-${VERSION}.jar" - ) - # Wait 5 mins initially, then try 5 times with a minute delay between each retry to see if the release artifacts are available - sleep 300 - TRY=0 - MAX_TRIES=5 - DELAY=60 - while [ $TRY -lt $MAX_TRIES ]; do - ARTIFACTS_AVAILABLE=true - for URL in "${ARTIFACT_URLS[@]}"; do - if ! curl --location --fail --silent --show-error -I "$URL"; then - ARTIFACTS_AVAILABLE=false - break - fi - done - if [ "$ARTIFACTS_AVAILABLE" = true ]; then - break - fi - TRY=$((TRY + 1)) - if [ $TRY -eq $MAX_TRIES ]; then - echo "The release was not available after 10 mins. Manually re-run the job to try again." - exit 1 - fi - sleep $DELAY - done - -publishing-gate: - stage: publish - needs: - - job: verify_maven_central_deployment - optional: true # Required for releases only - -configure_system_tests: - variables: - SYSTEM_TESTS_SCENARIOS_GROUPS: "simple_onboarding,simple_onboarding_profiling,simple_onboarding_appsec,docker-ssi,lib-injection" - -create_key: - stage: generate-signing-key - when: manual - needs: [ ] - variables: - PROJECT_NAME: "dd-trace-java" - EXPORT_TO_KEYSERVER: "true" - image: $REGISTRY/ci/agent-key-management-tools/gpg:1 - script: - - /create.sh - artifacts: - expire_in: 13 mos - paths: - - pubkeys - -validate_supported_configurations_v2_local_file: - extends: .validate_supported_configurations_v2_local_file - variables: - LOCAL_JSON_PATH: "metadata/supported-configurations.json" - BACKFILLED: "false" - -update_central_configurations_version_range_v2: - extends: .update_central_configurations_version_range_v2 - variables: - LOCAL_REPO_NAME: "dd-trace-java" - LOCAL_JSON_PATH: "metadata/supported-configurations.json" - LANGUAGE_NAME: "java" - MULTIPLE_RELEASE_LINES: "false" +# test_ssi_smoke: +# extends: .test_job +# rules: *master_only +# variables: +# GRADLE_TARGET: "stageMainDist :smokeTest" +# CACHE_TYPE: "smoke" +# DD_INJECT_FORCE: "true" +# DD_INJECTION_ENABLED: "tracer" +# parallel: +# matrix: *test_matrix_4 +# +# test_smoke_graalvm: +# extends: .test_job +# tags: [ "arch:amd64" ] +# variables: +# GRADLE_TARGET: "stageMainDist :dd-smoke-test:spring-boot-3.0-native:test" +# CACHE_TYPE: "smoke" +# CI_NO_SPLIT: "true" +# NON_DEFAULT_JVMS: "true" +# parallel: +# matrix: +# - testJvm: ["graalvm17", "graalvm21", "graalvm25"] +# +# test_smoke_semeru8_debugger: +# extends: .test_job +# tags: [ "arch:amd64" ] +# variables: +# GRADLE_TARGET: "stageMainDist dd-smoke-tests:debugger-integration-tests:test" +# CACHE_TYPE: "smoke" +# NON_DEFAULT_JVMS: "true" +# testJvm: "semeru8" +# +# deploy_to_profiling_backend: +# stage: publish +# needs: [ build ] +# rules: +# - if: '$POPULATE_CACHE' +# when: never +# - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH' +# when: on_success +# - if: '$CI_COMMIT_TAG =~ /^v.*/' +# when: on_success +# - when: manual +# allow_failure: true +# trigger: +# project: DataDog/profiling-backend +# branch: dogfooding +# variables: +# UPSTREAM_PACKAGE_JOB: $BUILD_JOB_NAME +# UPSTREAM_PACKAGE_JOB_ID: $BUILD_JOB_ID +# UPSTREAM_PROJECT_ID: $CI_PROJECT_ID +# UPSTREAM_PROJECT_NAME: $CI_PROJECT_NAME +# UPSTREAM_PIPELINE_ID: $CI_PIPELINE_ID +# UPSTREAM_BRANCH: $CI_COMMIT_BRANCH +# UPSTREAM_TAG: $CI_COMMIT_TAG +# +# trigger_tibco_tests: +# stage: tests +# needs: [ build ] +# rules: +# - if: '$POPULATE_CACHE' +# when: never +# - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH' +# when: on_success +# - if: '$CI_COMMIT_TAG =~ /^v.*/' +# when: on_success +# - when: manual +# allow_failure: true +# trigger: +# project: DataDog/tibco-testing +# branch: main +# strategy: depend +# variables: +# UPSTREAM_PACKAGE_JOB: $BUILD_JOB_NAME +# UPSTREAM_PACKAGE_JOB_ID: $BUILD_JOB_ID +# UPSTREAM_PROJECT_ID: $CI_PROJECT_ID +# UPSTREAM_PROJECT_NAME: $CI_PROJECT_NAME +# UPSTREAM_PIPELINE_ID: $CI_PIPELINE_ID +# UPSTREAM_BRANCH: $CI_COMMIT_BRANCH +# UPSTREAM_TAG: $CI_COMMIT_TAG +# FORCE_TRIGGER: $FORCE_TRIGGER +# +# deploy_to_di_backend:manual: +# stage: publish +# needs: [ build ] +# rules: +# - if: '$POPULATE_CACHE' +# when: never +# - when: manual +# allow_failure: true +# trigger: +# project: DataDog/debugger-demos +# branch: main +# variables: +# UPSTREAM_PACKAGE_JOB: build +# UPSTREAM_PROJECT_ID: $CI_PROJECT_ID +# UPSTREAM_PROJECT_NAME: $CI_PROJECT_NAME +# UPSTREAM_PIPELINE_ID: $CI_PIPELINE_ID +# UPSTREAM_BRANCH: $CI_COMMIT_BRANCH +# UPSTREAM_TAG: $CI_COMMIT_TAG +# UPSTREAM_COMMIT_AUTHOR: $CI_COMMIT_AUTHOR +# UPSTREAM_COMMIT_SHORT_SHA: $CI_COMMIT_SHORT_SHA +# +# # If the deploy_to_maven_central job is re-run, re-trigger the deploy_artifacts_to_github job as well so that the artifacts match. +# deploy_to_maven_central: +# extends: .gradle_build +# stage: publish +# needs: [ build ] +# variables: +# CACHE_TYPE: "lib" +# rules: +# - if: '$POPULATE_CACHE' +# when: never +# - if: '$CI_COMMIT_BRANCH == "master"' +# when: on_success +# # Do not deploy release candidate versions +# - if: '$CI_COMMIT_TAG =~ /^v[0-9]+\.[0-9]+\.[0-9]+$/' +# when: on_success +# - when: manual +# allow_failure: true +# script: +# - export MAVEN_CENTRAL_USERNAME=$(aws ssm get-parameter --region us-east-1 --name ci.dd-trace-java.central_username --with-decryption --query "Parameter.Value" --out text) +# - export MAVEN_CENTRAL_PASSWORD=$(aws ssm get-parameter --region us-east-1 --name ci.dd-trace-java.central_password --with-decryption --query "Parameter.Value" --out text) +# - export GPG_PRIVATE_KEY=$(aws ssm get-parameter --region us-east-1 --name ci.dd-trace-java.signing.gpg_private_key --with-decryption --query "Parameter.Value" --out text) +# - export GPG_PASSWORD=$(aws ssm get-parameter --region us-east-1 --name ci.dd-trace-java.signing.gpg_passphrase --with-decryption --query "Parameter.Value" --out text) +# - ./gradlew -PbuildInfo.build.number=$CI_JOB_ID publishToSonatype closeSonatypeStagingRepository -PskipTests $GRADLE_ARGS +# artifacts: +# paths: +# - 'workspace/dd-java-agent/build/libs/*.jar' +# - 'workspace/dd-trace-api/build/libs/*.jar' +# - 'workspace/dd-trace-ot/build/libs/*.jar' +# +# deploy_artifacts_to_github: +# stage: publish +# image: registry.ddbuild.io/images/dd-octo-sts-ci-base:2025.06-1 +# tags: [ "arch:amd64" ] +# id_tokens: +# DDOCTOSTS_ID_TOKEN: +# aud: dd-octo-sts +# rules: +# - if: '$POPULATE_CACHE' +# when: never +# - if: '$CI_COMMIT_TAG =~ /^v[0-9]+\.[0-9]+\.[0-9]+$/' +# when: on_success +# # Requires the deploy_to_maven_central job to have run first (the UP-TO-DATE gradle check across jobs is broken) +# # This will deploy the artifacts built from the publishToSonatype task to the GitHub release +# needs: +# - job: deploy_to_maven_central +# # The deploy_to_maven_central job is not run for release candidate versions +# optional: true +# before_script: +# - dd-octo-sts version +# - dd-octo-sts debug --scope DataDog/dd-trace-java --policy self.gitlab.release +# - dd-octo-sts token --scope DataDog/dd-trace-java --policy self.gitlab.release > github-token.txt +# script: +# - gh auth login --with-token < github-token.txt +# - gh auth status +# - export VERSION=${CI_COMMIT_TAG##v} # remove "v" from front of tag to get version +# - cp workspace/dd-java-agent/build/libs/dd-java-agent-${VERSION}.jar workspace/dd-java-agent/build/libs/dd-java-agent.jar # upload two filenames +# - gh release upload --clobber --repo DataDog/dd-trace-java $CI_COMMIT_TAG workspace/dd-java-agent/build/libs/dd-java-agent.jar +# - gh release upload --clobber --repo DataDog/dd-trace-java $CI_COMMIT_TAG workspace/dd-java-agent/build/libs/dd-java-agent-${VERSION}.jar +# - gh release upload --clobber --repo DataDog/dd-trace-java $CI_COMMIT_TAG workspace/dd-trace-api/build/libs/dd-trace-api-${VERSION}.jar +# - gh release upload --clobber --repo DataDog/dd-trace-java $CI_COMMIT_TAG workspace/dd-trace-ot/build/libs/dd-trace-ot-${VERSION}.jar +# after_script: +# - dd-octo-sts revoke -t $(cat github-token.txt) +# retry: +# max: 2 +# when: always +# +# requirements_json_test: +# rules: +# - when: on_success +# variables: +# REQUIREMENTS_BLOCK_JSON_PATH: "metadata/requirements-block.json" +# REQUIREMENTS_ALLOW_JSON_PATH: "metadata/requirements-allow.json" +# +# package-oci: +# needs: [ build ] +# +# override_verify_maven_central: +# image: registry.ddbuild.io/images/base/gbi-ubuntu_2204:release +# stage: publish +# needs: [ ] +# rules: +# - if: '$POPULATE_CACHE' +# when: never +# - when: manual +# allow_failure: true +# script: +# - touch OVERRIDE_MAVEN_VERIFY +# cache: # Cache is used to signal between the override_verify_maven_central and verify_maven_central_deployment jobs +# - key: $CI_PIPELINE_ID-OVERRIDE_SIGNAL +# paths: +# - OVERRIDE_MAVEN_VERIFY +# policy: push +# unprotect: true +# +# # Verify Maven Central deployment is publicly available before publishing OCI images +# verify_maven_central_deployment: +# image: registry.ddbuild.io/images/base/gbi-ubuntu_2204:release +# stage: publish +# needs: [ deploy_to_maven_central ] +# rules: +# - if: '$POPULATE_CACHE' +# when: never +# - if: '$CI_COMMIT_TAG =~ /^v[0-9]+\.[0-9]+\.[0-9]+$/' +# when: on_success +# cache: # Cache is used to signal between the override_verify_maven_central and verify_maven_central_deployment jobs +# - key: $CI_PIPELINE_ID-OVERRIDE_SIGNAL +# paths: +# - OVERRIDE_MAVEN_VERIFY +# policy: pull +# unprotect: true +# script: +# - if [ -f OVERRIDE_MAVEN_VERIFY ]; then echo "SKIPPING MAVEN VERIFICATION"; exit 0; fi +# - | +# export VERSION=${CI_COMMIT_TAG##v} +# ARTIFACT_URLS=( +# "https://repo1.maven.org/maven2/com/datadoghq/dd-java-agent/${VERSION}/dd-java-agent-${VERSION}.jar" +# "https://repo1.maven.org/maven2/com/datadoghq/dd-trace-api/${VERSION}/dd-trace-api-${VERSION}.jar" +# "https://repo1.maven.org/maven2/com/datadoghq/dd-trace-ot/${VERSION}/dd-trace-ot-${VERSION}.jar" +# ) +# # Wait 5 mins initially, then try 5 times with a minute delay between each retry to see if the release artifacts are available +# sleep 300 +# TRY=0 +# MAX_TRIES=5 +# DELAY=60 +# while [ $TRY -lt $MAX_TRIES ]; do +# ARTIFACTS_AVAILABLE=true +# for URL in "${ARTIFACT_URLS[@]}"; do +# if ! curl --location --fail --silent --show-error -I "$URL"; then +# ARTIFACTS_AVAILABLE=false +# break +# fi +# done +# if [ "$ARTIFACTS_AVAILABLE" = true ]; then +# break +# fi +# TRY=$((TRY + 1)) +# if [ $TRY -eq $MAX_TRIES ]; then +# echo "The release was not available after 10 mins. Manually re-run the job to try again." +# exit 1 +# fi +# sleep $DELAY +# done +# +# publishing-gate: +# stage: publish +# needs: +# - job: verify_maven_central_deployment +# optional: true # Required for releases only +# +# configure_system_tests: +# variables: +# SYSTEM_TESTS_SCENARIOS_GROUPS: "simple_onboarding,simple_onboarding_profiling,simple_onboarding_appsec,docker-ssi,lib-injection" +# +# create_key: +# stage: generate-signing-key +# when: manual +# needs: [ ] +# variables: +# PROJECT_NAME: "dd-trace-java" +# EXPORT_TO_KEYSERVER: "true" +# image: $REGISTRY/ci/agent-key-management-tools/gpg:1 +# script: +# - /create.sh +# artifacts: +# expire_in: 13 mos +# paths: +# - pubkeys +# +# validate_supported_configurations_v2_local_file: +# extends: .validate_supported_configurations_v2_local_file +# variables: +# LOCAL_JSON_PATH: "metadata/supported-configurations.json" +# BACKFILLED: "false" +# +# update_central_configurations_version_range_v2: +# extends: .update_central_configurations_version_range_v2 +# variables: +# LOCAL_REPO_NAME: "dd-trace-java" +# LOCAL_JSON_PATH: "metadata/supported-configurations.json" +# LANGUAGE_NAME: "java" +# MULTIPLE_RELEASE_LINES: "false" diff --git a/dd-java-agent/agent-ci-visibility/civisibility-test-fixtures/src/main/groovy/datadog/trace/civisibility/CiVisibilitySmokeTest.groovy b/dd-java-agent/agent-ci-visibility/civisibility-test-fixtures/src/main/groovy/datadog/trace/civisibility/CiVisibilitySmokeTest.groovy index 5cba421fb76..d8169fc4fd4 100644 --- a/dd-java-agent/agent-ci-visibility/civisibility-test-fixtures/src/main/groovy/datadog/trace/civisibility/CiVisibilitySmokeTest.groovy +++ b/dd-java-agent/agent-ci-visibility/civisibility-test-fixtures/src/main/groovy/datadog/trace/civisibility/CiVisibilitySmokeTest.groovy @@ -81,10 +81,7 @@ abstract class CiVisibilitySmokeTest extends Specification { protected List buildJvmArguments(String mockBackendIntakeUrl, String serviceName, Map additionalArgs) { List arguments = [] - // Trick to avoid on CI: "Couldn't flush user prefs: java.util.prefs.BackingStoreException: Couldn't get file lock." - // Some tests can setup arguments on spec level, so `prefsDir` will be `null` during `setupSpec()`. - String prefsPath = (prefsDir ?: prefsDirShared).toAbsolutePath() - arguments += "-Djava.util.prefs.userRoot=$prefsPath".toString() + arguments += preventJulPrefsFileLock() Map argMap = buildJvmArgMap(mockBackendIntakeUrl, serviceName, additionalArgs) @@ -102,6 +99,23 @@ abstract class CiVisibilitySmokeTest extends Specification { return arguments } + /** + * Trick to prevent jul Prefs file lock issue on forked processes. + * + * Reason: multiple observations of failed job with + * + *

+   * Couldn't flush user prefs: java.util.prefs.BackingStoreException: Couldn't get file lock.
+   * 
+ * + * Note, some tests can setup arguments on spec level, so `prefsDir` will be `null` during + * `setupSpec()`. + */ + protected String preventJulPrefsFileLock() { + String prefsPath = (prefsDir ?: prefsDirShared).toAbsolutePath() + return "-Djava.util.prefs.userRoot=$prefsPath".toString() + } + protected verifyEventsAndCoverages(String projectName, String toolchain, String toolchainVersion, List> events, List> coverages, List additionalDynamicTags = []) { def additionalReplacements = ["content.meta.['test.toolchain']": "$toolchain:$toolchainVersion"] diff --git a/dd-smoke-tests/gradle/src/test/groovy/datadog/smoketest/GradleLauncherSmokeTest.groovy b/dd-smoke-tests/gradle/src/test/groovy/datadog/smoketest/GradleLauncherSmokeTest.groovy index e27511e3507..50a0372a78f 100644 --- a/dd-smoke-tests/gradle/src/test/groovy/datadog/smoketest/GradleLauncherSmokeTest.groovy +++ b/dd-smoke-tests/gradle/src/test/groovy/datadog/smoketest/GradleLauncherSmokeTest.groovy @@ -76,7 +76,7 @@ class GradleLauncherSmokeTest extends AbstractGradleTest { "DD_CODE_ORIGIN_FOR_SPANS_ENABLED" : "false", "DD_API_KEY" : "dummy" ]) - String[] command = ["./gradlew", "--no-daemon", "--info"] + String[] command = ["./gradlew", "--no-daemon", "--info", "--stacktrace"] if (gradleDaemonCmdLineParams) { command += "-Dorg.gradle.jvmargs=$gradleDaemonCmdLineParams".toString() } From 8cefb2e55d9f1596a416f3efa7f9f9d2be21f4fc Mon Sep 17 00:00:00 2001 From: Brice Dutheil Date: Mon, 8 Dec 2025 12:26:56 +0100 Subject: [PATCH 05/12] chore: check user home --- .gitlab-ci.yml | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 544eccfc6ea..a48d78c203d 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -36,7 +36,7 @@ variables: value: "false" NON_DEFAULT_JVMS: description: "Enable tests on JVMs that are not the default" - value: "false" + value: "true" RUN_FLAKY_TESTS: description: "Enable flaky tests" value: "false" @@ -56,19 +56,19 @@ workflow: .test_matrix: &test_matrix - testJvm: &test_jvms - - "8" - - "11" - - "17" - - "21" - - "25" - - "26" - - "semeru11" + # - "8" + # - "11" + # - "17" + # - "21" + # - "25" + # - "26" + # - "semeru11" - "oracle8" - - "zulu8" - - "semeru8" - - "ibm8" - - "zulu11" - - "semeru17" + # - "zulu8" + # - "semeru8" + # - "ibm8" + # - "zulu11" + # - "semeru17" # - "stable" CI_SPLIT: ["1/1"] @@ -260,8 +260,10 @@ build: DEPENDENCY_CACHE_POLICY: pull script: - if [ $CI_PIPELINE_SOURCE == "schedule" ] ; then ./gradlew resolveAndLockAll --write-locks $GRADLE_ARGS; fi + - echo $HOME - ./gradlew --version - ./gradlew clean :dd-java-agent:shadowJar :dd-trace-api:jar :dd-trace-ot:shadowJar -PskipTests $GRADLE_ARGS + - ls -lah $HOME/.java/.userPrefs - echo UPSTREAM_TRACER_VERSION=$(java -jar workspace/dd-java-agent/build/libs/*.jar) >> upstream.env - echo "BUILD_JOB_NAME=$CI_JOB_NAME" >> build.env - echo "BUILD_JOB_ID=$CI_JOB_ID" >> build.env @@ -422,6 +424,8 @@ publish-artifacts-to-s3: - ./gradlew --version - ./gradlew $GRADLE_TARGET $GRADLE_PARAMS -PskipTests -PrunBuildSrcTests -PskipSpotless -PtaskPartitionCount=$NORMALIZED_NODE_TOTAL -PtaskPartition=$NORMALIZED_NODE_INDEX $GRADLE_ARGS after_script: + - echo $HOME + - ls -lah $HOME/.java/.userPrefs - *cgroup_info - source .gitlab/gitlab-utils.sh - gitlab_section_start "collect-reports" "Collecting reports" @@ -572,6 +576,7 @@ publish-artifacts-to-s3: - ./gradlew --version - ./gradlew $GRADLE_TARGET $GRADLE_PARAMS -PtestJvm=$testJvm -PtaskPartitionCount=$NORMALIZED_NODE_TOTAL -PtaskPartition=$NORMALIZED_NODE_INDEX $GRADLE_ARGS --continue || $CONTINUE_ON_FAILURE after_script: + - ls -lah $HOME/.java/.userPrefs - *restore_pretest_env - *set_datadog_api_keys - *cgroup_info From ad93e099da62136ee969a18af19d84a76da84752 Mon Sep 17 00:00:00 2001 From: Brice Dutheil Date: Mon, 8 Dec 2025 14:43:13 +0100 Subject: [PATCH 06/12] chore: More 8 JDK vendors --- .gitlab-ci.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index a48d78c203d..71337cd2c4e 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -56,7 +56,7 @@ workflow: .test_matrix: &test_matrix - testJvm: &test_jvms - # - "8" + - "8" # - "11" # - "17" # - "21" @@ -64,9 +64,9 @@ workflow: # - "26" # - "semeru11" - "oracle8" - # - "zulu8" - # - "semeru8" - # - "ibm8" + - "zulu8" + - "semeru8" + - "ibm8" # - "zulu11" # - "semeru17" # - "stable" From 9240710e8bb97b614f33de44a47d15977fae66cd Mon Sep 17 00:00:00 2001 From: Brice Dutheil Date: Mon, 8 Dec 2025 15:01:07 +0100 Subject: [PATCH 07/12] chore: Patch smoke test forked processes to use a custom preference file --- .../civisibility/CiVisibilitySmokeTest.groovy | 5 ++--- .../datadog/smoketest/ProcessBuilderHelper.java | 17 ++++++++++++++++- .../datadog/smoketest/AbstractSmokeTest.groovy | 9 ++++++++- 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/dd-java-agent/agent-ci-visibility/civisibility-test-fixtures/src/main/groovy/datadog/trace/civisibility/CiVisibilitySmokeTest.groovy b/dd-java-agent/agent-ci-visibility/civisibility-test-fixtures/src/main/groovy/datadog/trace/civisibility/CiVisibilitySmokeTest.groovy index d8169fc4fd4..d2c7427c126 100644 --- a/dd-java-agent/agent-ci-visibility/civisibility-test-fixtures/src/main/groovy/datadog/trace/civisibility/CiVisibilitySmokeTest.groovy +++ b/dd-java-agent/agent-ci-visibility/civisibility-test-fixtures/src/main/groovy/datadog/trace/civisibility/CiVisibilitySmokeTest.groovy @@ -100,9 +100,8 @@ abstract class CiVisibilitySmokeTest extends Specification { } /** - * Trick to prevent jul Prefs file lock issue on forked processes. - * - * Reason: multiple observations of failed job with + * Trick to prevent jul Prefs file lock issue on forked processes, in particular in CI which + * runs on Linux and have competing processes trying to write to it, including the Gradle daemon. * *

    * Couldn't flush user prefs: java.util.prefs.BackingStoreException: Couldn't get file lock.
diff --git a/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/ProcessBuilderHelper.java b/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/ProcessBuilderHelper.java
index 1b107f7c31d..5faf29bbaa5 100644
--- a/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/ProcessBuilderHelper.java
+++ b/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/ProcessBuilderHelper.java
@@ -28,6 +28,20 @@ public static ProcessBuilder createProcessBuilder(
       String mainClassName,
       String... params) {
 
+    // Trick to prevent jul preferences file lock issue on forked processes, in particular in CI
+    // which runs on Linux and have competing processes trying to write to it, including the
+    // Gradle daemon.
+    //
+    //   Couldn't flush user prefs: java.util.prefs.BackingStoreException: Couldn't get file lock.
+    String prefsDir =
+        System.getProperty("java.io.tmpdir")
+            + File.separator
+            + "userPrefs"
+            + File.separator
+            + mainClassName
+            + "_"
+            + System.nanoTime();
+
     List baseCommand =
         Arrays.asList(
             javaPath(),
@@ -37,7 +51,8 @@ public static ProcessBuilder createProcessBuilder(
             "-javaagent:" + agentShadowJar(),
             "-XX:ErrorFile=/tmp/hs_err_pid%p.log",
             "-Ddd.env=smoketest",
-            "-Ddd.version=99");
+            "-Ddd.version=99",
+            "-Djava.util.prefs.userRoot=" + prefsDir);
 
     List command = new ArrayList<>();
     command.addAll(baseCommand);
diff --git a/dd-smoke-tests/src/main/groovy/datadog/smoketest/AbstractSmokeTest.groovy b/dd-smoke-tests/src/main/groovy/datadog/smoketest/AbstractSmokeTest.groovy
index 8bc5e2f5a33..5f882fc359a 100644
--- a/dd-smoke-tests/src/main/groovy/datadog/smoketest/AbstractSmokeTest.groovy
+++ b/dd-smoke-tests/src/main/groovy/datadog/smoketest/AbstractSmokeTest.groovy
@@ -188,6 +188,12 @@ abstract class AbstractSmokeTest extends ProcessManager {
   def javaProperties() {
     def tmpDir = "/tmp"
 
+    // Trick to prevent jul preferences file lock issue on forked processes, in particular in CI which
+    // runs on Linux and have competing processes trying to write to it, including the Gradle daemon.
+    //
+    //   Couldn't flush user prefs: java.util.prefs.BackingStoreException: Couldn't get file lock.
+    def prefsDir = "${tmpDir}/userPrefs/${this.getClass().simpleName}_${System.nanoTime()}"
+
     def ret = [
       "${getMaxMemoryArgumentForFork()}",
       "${getMinMemoryArgumentForFork()}",
@@ -204,7 +210,8 @@ abstract class AbstractSmokeTest extends ProcessManager {
       "-Ddd.profiling.ddprof.alloc.enabled=${isDdprofSafe()}",
       "-Ddatadog.slf4j.simpleLogger.defaultLogLevel=${logLevel()}",
       "-Dorg.slf4j.simpleLogger.defaultLogLevel=${logLevel()}",
-      "-Ddd.site="
+      "-Ddd.site=",
+      "-Djava.util.prefs.userRoot=${prefsDir}"
     ]
     if (inferServiceName())  {
       ret += "-Ddd.service.name=${SERVICE_NAME}"

From e0835230a8c9814c1616a985549eab0e82bfc86b Mon Sep 17 00:00:00 2001
From: Brice Dutheil 
Date: Mon, 8 Dec 2025 15:43:03 +0100
Subject: [PATCH 08/12] chore: Revert changes to gitlab but non default jvms

---
 .gitlab-ci.yml                                | 1105 ++++++++---------
 .../smoketest/GradleLauncherSmokeTest.groovy  |    2 +-
 2 files changed, 551 insertions(+), 556 deletions(-)

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 71337cd2c4e..0c74d14c308 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,19 +1,19 @@
 include:
   - local: ".gitlab/one-pipeline.locked.yml"
-  # - local: ".gitlab/benchmarks.yml"
-  # - local: ".gitlab/macrobenchmarks.yml"
-  # - local: ".gitlab/exploration-tests.yml"
-  # - local: ".gitlab/ci-visibility-tests.yml"
+  - local: ".gitlab/benchmarks.yml"
+  - local: ".gitlab/macrobenchmarks.yml"
+  - local: ".gitlab/exploration-tests.yml"
+  - local: ".gitlab/ci-visibility-tests.yml"
 
 stages:
   - build
   - publish
   - shared-pipeline
-  # - benchmarks
-  # - macrobenchmarks
+  - benchmarks
+  - macrobenchmarks
   - tests
-  # - exploration-tests
-  # - ci-visibility-tests
+  - exploration-tests
+  - ci-visibility-tests
   - generate-signing-key
 
 variables:
@@ -57,18 +57,18 @@ workflow:
 .test_matrix: &test_matrix
   - testJvm: &test_jvms
       - "8"
-      # - "11"
-      # - "17"
-      # - "21"
-      # - "25"
-      # - "26"
-      # - "semeru11"
+      - "11"
+      - "17"
+      - "21"
+      - "25"
+      - "26"
+      - "semeru11"
       - "oracle8"
       - "zulu8"
       - "semeru8"
       - "ibm8"
-      # - "zulu11"
-      # - "semeru17"
+      - "zulu11"
+      - "semeru17"
       # - "stable"
     CI_SPLIT: ["1/1"]
 
@@ -260,10 +260,8 @@ build:
     DEPENDENCY_CACHE_POLICY: pull
   script:
     - if [ $CI_PIPELINE_SOURCE == "schedule" ] ; then ./gradlew resolveAndLockAll --write-locks $GRADLE_ARGS; fi
-    - echo $HOME
     - ./gradlew --version
     - ./gradlew clean :dd-java-agent:shadowJar :dd-trace-api:jar :dd-trace-ot:shadowJar -PskipTests $GRADLE_ARGS
-    - ls -lah $HOME/.java/.userPrefs
     - echo UPSTREAM_TRACER_VERSION=$(java -jar workspace/dd-java-agent/build/libs/*.jar) >> upstream.env
     - echo "BUILD_JOB_NAME=$CI_JOB_NAME" >> build.env
     - echo "BUILD_JOB_ID=$CI_JOB_ID" >> build.env
@@ -305,30 +303,30 @@ build_tests:
     - ./gradlew --version
     - ./gradlew clean $GRADLE_TARGET $GRADLE_PARAMS -PskipTests $GRADLE_ARGS
 
-# populate_dep_cache:
-#   extends: build_tests
-#   variables:
-#     BUILD_CACHE_POLICY: pull
-#     DEPENDENCY_CACHE_POLICY: push
-#   rules:
-#     - if: '$POPULATE_CACHE'
-#       when: on_success
-#     - when: manual
-#       allow_failure: true
-#   parallel:
-#     matrix:
-#       - GRADLE_TARGET: ":dd-java-agent:shadowJar :dd-trace-api:jar :dd-trace-ot:shadowJar"
-#         CACHE_TYPE: "lib"
-#       - GRADLE_TARGET: ":baseTest"
-#         CACHE_TYPE: "base"
-#       - GRADLE_TARGET: ":profilingTest"
-#         CACHE_TYPE: "profiling"
-#       - GRADLE_TARGET: ":instrumentationTest"
-#         CACHE_TYPE: "inst"
-#       - GRADLE_TARGET: ":instrumentationLatestDepTest"
-#         CACHE_TYPE: "latestdep"
-#       - GRADLE_TARGET: ":smokeTest"
-#         CACHE_TYPE: "smoke"
+populate_dep_cache:
+  extends: build_tests
+  variables:
+    BUILD_CACHE_POLICY: pull
+    DEPENDENCY_CACHE_POLICY: push
+  rules:
+    - if: '$POPULATE_CACHE'
+      when: on_success
+    - when: manual
+      allow_failure: true
+  parallel:
+    matrix:
+      - GRADLE_TARGET: ":dd-java-agent:shadowJar :dd-trace-api:jar :dd-trace-ot:shadowJar"
+        CACHE_TYPE: "lib"
+      - GRADLE_TARGET: ":baseTest"
+        CACHE_TYPE: "base"
+      - GRADLE_TARGET: ":profilingTest"
+        CACHE_TYPE: "profiling"
+      - GRADLE_TARGET: ":instrumentationTest"
+        CACHE_TYPE: "inst"
+      - GRADLE_TARGET: ":instrumentationLatestDepTest"
+        CACHE_TYPE: "latestdep"
+      - GRADLE_TARGET: ":smokeTest"
+        CACHE_TYPE: "smoke"
 
 publish-artifacts-to-s3:
   image: registry.ddbuild.io/images/mirror/amazon/aws-cli:2.4.29
@@ -362,56 +360,56 @@ publish-artifacts-to-s3:
         - links.json
 
 
-# spotless:
-#   extends: .gradle_build
-#   stage: tests
-#   needs: []
-#   variables:
-#     # TODO: Latest version of spotless is failing with OOM on CI only.
-#     # Setting 8G memory solving this issue, but we need to solve it eventually.
-#     GRADLE_MEM: 8G
-#     KUBERNETES_MEMORY_REQUEST: 18Gi
-#     KUBERNETES_MEMORY_LIMIT: 18Gi
-#   script:
-#     - ./gradlew --version
-#     - ./gradlew spotlessCheck $GRADLE_ARGS
-#
-# config-inversion-linter:
-#   extends: .gradle_build
-#   stage: tests
-#   needs: []
-#   script:
-#     - ./gradlew --version
-#     - ./gradlew logEnvVarUsages checkEnvironmentVariablesUsage checkConfigStrings
-#
-# test_published_artifacts:
-#   extends: .gradle_build
-#   image: ghcr.io/datadog/dd-trace-java-docker-build:${BUILDER_IMAGE_VERSION_PREFIX}7 # Needs Java7 for some tests
-#   stage: tests
-#   needs: [ build ]
-#   variables:
-#     CACHE_TYPE: "lib"
-#   script:
-#     - mvn_local_repo=$(./mvnw help:evaluate -Dexpression=settings.localRepository -q -DforceStdout)
-#     - rm -rf "${mvn_local_repo}/com/datadoghq"
-#     - export GPG_PRIVATE_KEY=$(aws ssm get-parameter --region us-east-1 --name ci.dd-trace-java.signing.gpg_private_key --with-decryption --query "Parameter.Value" --out text)
-#     - export GPG_PASSWORD=$(aws ssm get-parameter --region us-east-1 --name ci.dd-trace-java.signing.gpg_passphrase --with-decryption --query "Parameter.Value" --out text)
-#     - export GRADLE_OPTS="-Dorg.gradle.jvmargs='-Xms2G -Xmx2G -XX:ErrorFile=/tmp/hs_err_pid%p.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp'"
-#     - ./gradlew publishToMavenLocal $GRADLE_ARGS
-#     - cd test-published-dependencies
-#     - export GRADLE_OPTS="-Dorg.gradle.jvmargs='-Xms1G -Xmx1G -XX:ErrorFile=/tmp/hs_err_pid%p.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp'"
-#     - ./gradlew --version
-#     - ./gradlew check --info $GRADLE_ARGS
-#   after_script:
-#     - *cgroup_info
-#     - source .gitlab/gitlab-utils.sh
-#     - gitlab_section_start "collect-reports" "Collecting reports"
-#     - .gitlab/collect_reports.sh
-#     - gitlab_section_end "collect-reports"
-#   artifacts:
-#     when: always
-#     paths:
-#       - ./check_reports
+spotless:
+  extends: .gradle_build
+  stage: tests
+  needs: []
+  variables:
+    # TODO: Latest version of spotless is failing with OOM on CI only.
+    # Setting 8G memory solving this issue, but we need to solve it eventually.
+    GRADLE_MEM: 8G
+    KUBERNETES_MEMORY_REQUEST: 18Gi
+    KUBERNETES_MEMORY_LIMIT: 18Gi
+  script:
+    - ./gradlew --version
+    - ./gradlew spotlessCheck $GRADLE_ARGS
+
+config-inversion-linter:
+  extends: .gradle_build
+  stage: tests
+  needs: []
+  script:
+    - ./gradlew --version
+    - ./gradlew logEnvVarUsages checkEnvironmentVariablesUsage checkConfigStrings
+
+test_published_artifacts:
+  extends: .gradle_build
+  image: ghcr.io/datadog/dd-trace-java-docker-build:${BUILDER_IMAGE_VERSION_PREFIX}7 # Needs Java7 for some tests
+  stage: tests
+  needs: [ build ]
+  variables:
+    CACHE_TYPE: "lib"
+  script:
+    - mvn_local_repo=$(./mvnw help:evaluate -Dexpression=settings.localRepository -q -DforceStdout)
+    - rm -rf "${mvn_local_repo}/com/datadoghq"
+    - export GPG_PRIVATE_KEY=$(aws ssm get-parameter --region us-east-1 --name ci.dd-trace-java.signing.gpg_private_key --with-decryption --query "Parameter.Value" --out text)
+    - export GPG_PASSWORD=$(aws ssm get-parameter --region us-east-1 --name ci.dd-trace-java.signing.gpg_passphrase --with-decryption --query "Parameter.Value" --out text)
+    - export GRADLE_OPTS="-Dorg.gradle.jvmargs='-Xms2G -Xmx2G -XX:ErrorFile=/tmp/hs_err_pid%p.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp'"
+    - ./gradlew publishToMavenLocal $GRADLE_ARGS
+    - cd test-published-dependencies
+    - export GRADLE_OPTS="-Dorg.gradle.jvmargs='-Xms1G -Xmx1G -XX:ErrorFile=/tmp/hs_err_pid%p.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp'"
+    - ./gradlew --version
+    - ./gradlew check --info $GRADLE_ARGS
+  after_script:
+    - *cgroup_info
+    - source .gitlab/gitlab-utils.sh
+    - gitlab_section_start "collect-reports" "Collecting reports"
+    - .gitlab/collect_reports.sh
+    - gitlab_section_end "collect-reports"
+  artifacts:
+    when: always
+    paths:
+      - ./check_reports
 
 .check_job:
   extends: .gradle_build
@@ -424,8 +422,6 @@ publish-artifacts-to-s3:
     - ./gradlew --version
     - ./gradlew $GRADLE_TARGET $GRADLE_PARAMS -PskipTests -PrunBuildSrcTests -PskipSpotless -PtaskPartitionCount=$NORMALIZED_NODE_TOTAL -PtaskPartition=$NORMALIZED_NODE_INDEX $GRADLE_ARGS
   after_script:
-    - echo $HOME
-    - ls -lah $HOME/.java/.userPrefs
     - *cgroup_info
     - source .gitlab/gitlab-utils.sh
     - gitlab_section_start "collect-reports" "Collecting reports"
@@ -446,83 +442,83 @@ publish-artifacts-to-s3:
       - scheduler_failure
       - data_integrity_failure
 
-# check_build_src:
-#   extends: .check_job
-#   variables:
-#     GRADLE_TARGET: ":buildSrc:build"
-#
-# check_base:
-#   extends: .check_job
-#   variables:
-#     GRADLE_TARGET: ":baseCheck"
-#
-# check_inst:
-#   extends: .check_job
-#   parallel: 4
-#   variables:
-#     GRADLE_TARGET: ":instrumentationCheck"
-#     CACHE_TYPE: "inst"
-#
-# check_smoke:
-#   extends: .check_job
-#   parallel: 4
-#   variables:
-#     GRADLE_TARGET: ":smokeCheck"
-#     CACHE_TYPE: "smoke"
-#
-# check_profiling:
-#   extends: .check_job
-#   variables:
-#     GRADLE_TARGET: ":profilingCheck"
-#
-# check_debugger:
-#   extends: .check_job
-#   variables:
-#     GRADLE_TARGET: ":debuggerCheck"
-
-# muzzle:
-#   extends: .gradle_build
-#   needs: [ build_tests ]
-#   stage: tests
-#   parallel:
-#     matrix:
-#       - CI_SPLIT: ["1/8", "2/8", "3/8", "4/8", "5/8", "6/8", "7/8", "8/8"]
-#   variables:
-#     CACHE_TYPE: "inst"
-#   script:
-#     - export SKIP_BUILDSCAN="true"
-#     - ./gradlew --version
-#     - ./gradlew :runMuzzle -PtaskPartitionCount=$NORMALIZED_NODE_TOTAL -PtaskPartition=$NORMALIZED_NODE_INDEX $GRADLE_ARGS
-#   after_script:
-#     - *cgroup_info
-#     - source .gitlab/gitlab-utils.sh
-#     - gitlab_section_start "collect-reports" "Collecting reports"
-#     - .gitlab/collect_reports.sh
-#     - gitlab_section_end "collect-reports"
-#   artifacts:
-#     when: always
-#     paths:
-#       - ./reports
-#       - '.gradle/daemon/*/*.out.log'
-#
-# muzzle-dep-report:
-#   extends: .gradle_build
-#   needs: [ build_tests ]
-#   stage: tests
-#   variables:
-#     CACHE_TYPE: "inst"
-#   script:
-#     - export SKIP_BUILDSCAN="true"
-#     - ./gradlew --version
-#     - ./gradlew generateMuzzleReport muzzleInstrumentationReport $GRADLE_ARGS
-#   after_script:
-#     - *cgroup_info
-#     - .gitlab/collect_muzzle_deps.sh
-#   artifacts:
-#     when: always
-#     paths:
-#       - ./reports
-#       - '.gradle/daemon/*/*.out.log'
+check_build_src:
+  extends: .check_job
+  variables:
+    GRADLE_TARGET: ":buildSrc:build"
+
+check_base:
+  extends: .check_job
+  variables:
+    GRADLE_TARGET: ":baseCheck"
+
+check_inst:
+  extends: .check_job
+  parallel: 4
+  variables:
+    GRADLE_TARGET: ":instrumentationCheck"
+    CACHE_TYPE: "inst"
+
+check_smoke:
+  extends: .check_job
+  parallel: 4
+  variables:
+    GRADLE_TARGET: ":smokeCheck"
+    CACHE_TYPE: "smoke"
+
+check_profiling:
+  extends: .check_job
+  variables:
+    GRADLE_TARGET: ":profilingCheck"
+
+check_debugger:
+  extends: .check_job
+  variables:
+    GRADLE_TARGET: ":debuggerCheck"
+
+muzzle:
+  extends: .gradle_build
+  needs: [ build_tests ]
+  stage: tests
+  parallel:
+    matrix:
+      - CI_SPLIT: ["1/8", "2/8", "3/8", "4/8", "5/8", "6/8", "7/8", "8/8"]
+  variables:
+    CACHE_TYPE: "inst"
+  script:
+    - export SKIP_BUILDSCAN="true"
+    - ./gradlew --version
+    - ./gradlew :runMuzzle -PtaskPartitionCount=$NORMALIZED_NODE_TOTAL -PtaskPartition=$NORMALIZED_NODE_INDEX $GRADLE_ARGS
+  after_script:
+    - *cgroup_info
+    - source .gitlab/gitlab-utils.sh
+    - gitlab_section_start "collect-reports" "Collecting reports"
+    - .gitlab/collect_reports.sh
+    - gitlab_section_end "collect-reports"
+  artifacts:
+    when: always
+    paths:
+      - ./reports
+      - '.gradle/daemon/*/*.out.log'
+
+muzzle-dep-report:
+  extends: .gradle_build
+  needs: [ build_tests ]
+  stage: tests
+  variables:
+    CACHE_TYPE: "inst"
+  script:
+    - export SKIP_BUILDSCAN="true"
+    - ./gradlew --version
+    - ./gradlew generateMuzzleReport muzzleInstrumentationReport $GRADLE_ARGS
+  after_script:
+    - *cgroup_info
+    - .gitlab/collect_muzzle_deps.sh
+  artifacts:
+    when: always
+    paths:
+      - ./reports
+      - '.gradle/daemon/*/*.out.log'
 
 # In Gitlab, DD_* variables are set because the build runner is instrumented with Datadog telemetry
 # To have a pristine environment for the tests, these variables are saved before the test run and restored afterwards
@@ -576,7 +572,6 @@ publish-artifacts-to-s3:
     - ./gradlew --version
     - ./gradlew $GRADLE_TARGET $GRADLE_PARAMS -PtestJvm=$testJvm -PtaskPartitionCount=$NORMALIZED_NODE_TOTAL -PtaskPartition=$NORMALIZED_NODE_INDEX $GRADLE_ARGS --continue || $CONTINUE_ON_FAILURE
   after_script:
-    - ls -lah $HOME/.java/.userPrefs
     - *restore_pretest_env
     - *set_datadog_api_keys
     - *cgroup_info
@@ -627,395 +622,395 @@ publish-artifacts-to-s3:
     - !reference [.test_job, script]
     - .gitlab/check_test_agent_results.sh
 
-# agent_integration_tests:
-#   extends: .test_job
-#   tags: [ "arch:amd64" ]
-#   variables:
-#     testJvm: "8"
-#     CI_AGENT_HOST: local-agent
-#     GRADLE_TARGET: "traceAgentTest"
-#     CACHE_TYPE: "base"
-#   services:
-#     - name: registry.ddbuild.io/images/mirror/datadog/agent:7.40.1
-#       alias: local-agent
-#       variables:
-#         DD_APM_ENABLED: "true"
-#         DD_BIND_HOST: "0.0.0.0"
-#         DD_HOSTNAME: "local-agent"
-#         DD_API_KEY: "invalid_key_but_this_is_fine"
-#
-# test_base:
-#   extends: .test_job
-#   variables:
-#     GRADLE_TARGET: ":baseTest"
-#     CACHE_TYPE: "base"
-#   parallel:
-#     matrix: *test_matrix_4
-#   script:
-#     - if [ "$testJvm" == "8" ]; then export GRADLE_PARAMS="-PskipFlakyTests -PcheckCoverage"; fi
-#     - !reference [.test_job, script]
-# 
-# test_inst:
-#   extends: .test_job_with_test_agent
-#   variables:
-#     GRADLE_TARGET: ":instrumentationTest"
-#     CACHE_TYPE: "inst"
-#   parallel:
-#     matrix: *test_matrix_6
-#
-# test_inst_latest:
-#   extends: .test_job_with_test_agent
-#   variables:
-#     GRADLE_TARGET: ":instrumentationLatestDepTest"
-#     CACHE_TYPE: "latestdep"
-#   parallel:
-#     matrix:
-#       - testJvm: ["8", "17", "21", "25"] # the latest "stable" version is LTS v25
-#         # Gitlab doesn't support "parallel" and "parallel:matrix" at the same time
-#         # This emulates "parallel" by including it in the matrix
-#         CI_SPLIT: [ "1/6", "2/6", "3/6", "4/6", "5/6", "6/6"]
-#
-# test_flaky:
-#   extends: .test_job_with_test_agent
-#   variables:
-#     GRADLE_PARAMS: "-PrunFlakyTests"
-#     CACHE_TYPE: "smoke"
-#     testJvm: "8"
-#     CONTINUE_ON_FAILURE: "true"
-#   rules:
-#     - *master_only
-#     - if: $RUN_FLAKY_TESTS == "true"
-#       when: on_success
-#   parallel:
-#     matrix:
-#       - GRADLE_TARGET: [":baseTest", ":smokeTest", ":debuggerTest"]
-#         # Gitlab doesn't support "parallel" and "parallel:matrix" at the same time
-#         # This emulates "parallel" by including it in the matrix
-#         CI_SPLIT: [ "1/4", "2/4", "3/4", "4/4" ]
-#
-# test_flaky_inst:
-#   extends: .test_job
-#   variables:
-#     GRADLE_TARGET: ":instrumentationTest"
-#     GRADLE_PARAMS: "-PrunFlakyTests"
-#     CACHE_TYPE: "inst"
-#     testJvm: "8"
-#     CONTINUE_ON_FAILURE: "true"
-#   rules:
-#     - *master_only
-#     - if: $RUN_FLAKY_TESTS == "true"
-#       when: on_success
-#   parallel: 6
-#
-# test_profiling:
-#   extends: .test_job
-#   variables:
-#     GRADLE_TARGET: ":profilingTest"
-#     CACHE_TYPE: "profiling"
-#   parallel:
-#     matrix: *test_matrix
-#
-# # specific jvms list for debugger project because J9-based JVMs have issues with local vars
-# # so need to test at least against one J9-based JVM
-# test_debugger:
-#   extends: .test_job
-#   variables:
-#     GRADLE_TARGET: ":debuggerTest"
-#     CACHE_TYPE: "base"
-#     DEFAULT_TEST_JVMS: /^(8|11|17|21|25|semeru8)$/ # the latest "stable" version is LTS v25
-#   parallel:
-#     matrix: *test_matrix
+agent_integration_tests:
+  extends: .test_job
+  tags: [ "arch:amd64" ]
+  variables:
+    testJvm: "8"
+    CI_AGENT_HOST: local-agent
+    GRADLE_TARGET: "traceAgentTest"
+    CACHE_TYPE: "base"
+  services:
+    - name: registry.ddbuild.io/images/mirror/datadog/agent:7.40.1
+      alias: local-agent
+      variables:
+        DD_APM_ENABLED: "true"
+        DD_BIND_HOST: "0.0.0.0"
+        DD_HOSTNAME: "local-agent"
+        DD_API_KEY: "invalid_key_but_this_is_fine"
+
+test_base:
+  extends: .test_job
+  variables:
+    GRADLE_TARGET: ":baseTest"
+    CACHE_TYPE: "base"
+  parallel:
+    matrix: *test_matrix_4
+  script:
+    - if [ "$testJvm" == "8" ]; then export GRADLE_PARAMS="-PskipFlakyTests -PcheckCoverage"; fi
+    - !reference [.test_job, script]
+
+test_inst:
+  extends: .test_job_with_test_agent
+  variables:
+    GRADLE_TARGET: ":instrumentationTest"
+    CACHE_TYPE: "inst"
+  parallel:
+    matrix: *test_matrix_6
+
+test_inst_latest:
+  extends: .test_job_with_test_agent
+  variables:
+    GRADLE_TARGET: ":instrumentationLatestDepTest"
+    CACHE_TYPE: "latestdep"
+  parallel:
+    matrix:
+      - testJvm: ["8", "17", "21", "25"] # the latest "stable" version is LTS v25
+        # Gitlab doesn't support "parallel" and "parallel:matrix" at the same time
+        # This emulates "parallel" by including it in the matrix
+        CI_SPLIT: [ "1/6", "2/6", "3/6", "4/6", "5/6", "6/6"]
+
+test_flaky:
+  extends: .test_job_with_test_agent
+  variables:
+    GRADLE_PARAMS: "-PrunFlakyTests"
+    CACHE_TYPE: "smoke"
+    testJvm: "8"
+    CONTINUE_ON_FAILURE: "true"
+  rules:
+    - *master_only
+    - if: $RUN_FLAKY_TESTS == "true"
+      when: on_success
+  parallel:
+    matrix:
+      - GRADLE_TARGET: [":baseTest", ":smokeTest", ":debuggerTest"]
+        # Gitlab doesn't support "parallel" and "parallel:matrix" at the same time
+        # This emulates "parallel" by including it in the matrix
+        CI_SPLIT: [ "1/4", "2/4", "3/4", "4/4" ]
+
+test_flaky_inst:
+  extends: .test_job
+  variables:
+    GRADLE_TARGET: ":instrumentationTest"
+    GRADLE_PARAMS: "-PrunFlakyTests"
+    CACHE_TYPE: "inst"
+    testJvm: "8"
+    CONTINUE_ON_FAILURE: "true"
+  rules:
+    - *master_only
+    - if: $RUN_FLAKY_TESTS == "true"
+      when: on_success
+  parallel: 6
+
+test_profiling:
+  extends: .test_job
+  variables:
+    GRADLE_TARGET: ":profilingTest"
+    CACHE_TYPE: "profiling"
+  parallel:
+    matrix: *test_matrix
+
+# specific jvms list for debugger project because J9-based JVMs have issues with local vars
+# so need to test at least against one J9-based JVM
+test_debugger:
+  extends: .test_job
+  variables:
+    GRADLE_TARGET: ":debuggerTest"
+    CACHE_TYPE: "base"
+    DEFAULT_TEST_JVMS: /^(8|11|17|21|25|semeru8)$/ # the latest "stable" version is LTS v25
+  parallel:
+    matrix: *test_matrix
 
 test_smoke:
   extends: .test_job
   variables:
     GRADLE_TARGET: "stageMainDist :smokeTest"
-    GRADLE_PARAMS: "-PskipFlakyTests --stacktrace"
+    GRADLE_PARAMS: "-PskipFlakyTests"
+    CACHE_TYPE: "smoke"
+  parallel:
+    matrix: *test_matrix_4
+
+test_ssi_smoke:
+  extends: .test_job
+  rules: *master_only
+  variables:
+    GRADLE_TARGET: "stageMainDist :smokeTest"
     CACHE_TYPE: "smoke"
+    DD_INJECT_FORCE: "true"
+    DD_INJECTION_ENABLED: "tracer"
   parallel:
     matrix: *test_matrix_4
 
-# test_ssi_smoke:
-#   extends: .test_job
-#   rules: *master_only
-#   variables:
-#     GRADLE_TARGET: "stageMainDist :smokeTest"
-#     CACHE_TYPE: "smoke"
-#     DD_INJECT_FORCE: "true"
-#     DD_INJECTION_ENABLED: "tracer"
-#   parallel:
-#     matrix: *test_matrix_4
-#
-# test_smoke_graalvm:
-#   extends: .test_job
-#   tags: [ "arch:amd64" ]
-#   variables:
-#     GRADLE_TARGET: "stageMainDist :dd-smoke-test:spring-boot-3.0-native:test"
-#     CACHE_TYPE: "smoke"
-#     CI_NO_SPLIT: "true"
-#     NON_DEFAULT_JVMS: "true"
-#   parallel:
-#     matrix:
-#       - testJvm: ["graalvm17", "graalvm21", "graalvm25"]
-#
-# test_smoke_semeru8_debugger:
-#   extends: .test_job
-#   tags: [ "arch:amd64" ]
-#   variables:
-#     GRADLE_TARGET: "stageMainDist dd-smoke-tests:debugger-integration-tests:test"
-#     CACHE_TYPE: "smoke"
-#     NON_DEFAULT_JVMS: "true"
-#     testJvm: "semeru8"
-#
-# deploy_to_profiling_backend:
-#   stage: publish
-#   needs: [ build ]
-#   rules:
-#     - if: '$POPULATE_CACHE'
-#       when: never
-#     - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
-#       when: on_success
-#     - if: '$CI_COMMIT_TAG =~ /^v.*/'
-#       when: on_success
-#     - when: manual
-#       allow_failure: true
-#   trigger:
-#     project: DataDog/profiling-backend
-#     branch: dogfooding
-#   variables:
-#     UPSTREAM_PACKAGE_JOB: $BUILD_JOB_NAME
-#     UPSTREAM_PACKAGE_JOB_ID: $BUILD_JOB_ID
-#     UPSTREAM_PROJECT_ID: $CI_PROJECT_ID
-#     UPSTREAM_PROJECT_NAME: $CI_PROJECT_NAME
-#     UPSTREAM_PIPELINE_ID: $CI_PIPELINE_ID
-#     UPSTREAM_BRANCH: $CI_COMMIT_BRANCH
-#     UPSTREAM_TAG: $CI_COMMIT_TAG
-#
-# trigger_tibco_tests:
-#   stage: tests
-#   needs: [ build ]
-#   rules:
-#     - if: '$POPULATE_CACHE'
-#       when: never
-#     - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
-#       when: on_success
-#     - if: '$CI_COMMIT_TAG =~ /^v.*/'
-#       when: on_success
-#     - when: manual
-#       allow_failure: true
-#   trigger:
-#     project: DataDog/tibco-testing
-#     branch: main
-#     strategy: depend
-#   variables:
-#     UPSTREAM_PACKAGE_JOB: $BUILD_JOB_NAME
-#     UPSTREAM_PACKAGE_JOB_ID: $BUILD_JOB_ID
-#     UPSTREAM_PROJECT_ID: $CI_PROJECT_ID
-#     UPSTREAM_PROJECT_NAME: $CI_PROJECT_NAME
-#     UPSTREAM_PIPELINE_ID: $CI_PIPELINE_ID
-#     UPSTREAM_BRANCH: $CI_COMMIT_BRANCH
-#     UPSTREAM_TAG: $CI_COMMIT_TAG
-#     FORCE_TRIGGER: $FORCE_TRIGGER
-#
-# deploy_to_di_backend:manual:
-#   stage: publish
-#   needs: [ build ]
-#   rules:
-#     - if: '$POPULATE_CACHE'
-#       when: never
-#     - when: manual
-#       allow_failure: true
-#   trigger:
-#     project: DataDog/debugger-demos
-#     branch: main
-#   variables:
-#     UPSTREAM_PACKAGE_JOB: build
-#     UPSTREAM_PROJECT_ID: $CI_PROJECT_ID
-#     UPSTREAM_PROJECT_NAME: $CI_PROJECT_NAME
-#     UPSTREAM_PIPELINE_ID: $CI_PIPELINE_ID
-#     UPSTREAM_BRANCH: $CI_COMMIT_BRANCH
-#     UPSTREAM_TAG: $CI_COMMIT_TAG
-#     UPSTREAM_COMMIT_AUTHOR: $CI_COMMIT_AUTHOR
-#     UPSTREAM_COMMIT_SHORT_SHA: $CI_COMMIT_SHORT_SHA
-#
-# # If the deploy_to_maven_central job is re-run, re-trigger the deploy_artifacts_to_github job as well so that the artifacts match.
-# deploy_to_maven_central:
-#   extends: .gradle_build
-#   stage: publish
-#   needs: [ build ]
-#   variables:
-#     CACHE_TYPE: "lib"
-#   rules:
-#     - if: '$POPULATE_CACHE'
-#       when: never
-#     - if: '$CI_COMMIT_BRANCH == "master"'
-#       when: on_success
-#     # Do not deploy release candidate versions
-#     - if: '$CI_COMMIT_TAG =~ /^v[0-9]+\.[0-9]+\.[0-9]+$/'
-#       when: on_success
-#     - when: manual
-#       allow_failure: true
-#   script:
-#     - export MAVEN_CENTRAL_USERNAME=$(aws ssm get-parameter --region us-east-1 --name ci.dd-trace-java.central_username --with-decryption --query "Parameter.Value" --out text)
-#     - export MAVEN_CENTRAL_PASSWORD=$(aws ssm get-parameter --region us-east-1 --name ci.dd-trace-java.central_password --with-decryption --query "Parameter.Value" --out text)
-#     - export GPG_PRIVATE_KEY=$(aws ssm get-parameter --region us-east-1 --name ci.dd-trace-java.signing.gpg_private_key --with-decryption --query "Parameter.Value" --out text)
-#     - export GPG_PASSWORD=$(aws ssm get-parameter --region us-east-1 --name ci.dd-trace-java.signing.gpg_passphrase --with-decryption --query "Parameter.Value" --out text)
-#     - ./gradlew -PbuildInfo.build.number=$CI_JOB_ID publishToSonatype closeSonatypeStagingRepository -PskipTests $GRADLE_ARGS
-#   artifacts:
-#     paths:
-#       - 'workspace/dd-java-agent/build/libs/*.jar'
-#       - 'workspace/dd-trace-api/build/libs/*.jar'
-#       - 'workspace/dd-trace-ot/build/libs/*.jar'
-#
-# deploy_artifacts_to_github:
-#   stage: publish
-#   image: registry.ddbuild.io/images/dd-octo-sts-ci-base:2025.06-1
-#   tags: [ "arch:amd64" ]
-#   id_tokens:
-#     DDOCTOSTS_ID_TOKEN:
-#       aud: dd-octo-sts
-#   rules:
-#     - if: '$POPULATE_CACHE'
-#       when: never
-#     - if: '$CI_COMMIT_TAG =~ /^v[0-9]+\.[0-9]+\.[0-9]+$/'
-#       when: on_success
-#   # Requires the deploy_to_maven_central job to have run first (the UP-TO-DATE gradle check across jobs is broken)
-#   # This will deploy the artifacts built from the publishToSonatype task to the GitHub release
-#   needs:
-#     - job: deploy_to_maven_central
-#       # The deploy_to_maven_central job is not run for release candidate versions
-#       optional: true
-#   before_script:
-#     - dd-octo-sts version
-#     - dd-octo-sts debug --scope DataDog/dd-trace-java --policy self.gitlab.release
-#     - dd-octo-sts token --scope DataDog/dd-trace-java --policy self.gitlab.release > github-token.txt
-#   script:
-#     - gh auth login --with-token < github-token.txt
-#     - gh auth status
-#     - export VERSION=${CI_COMMIT_TAG##v} # remove "v" from front of tag to get version
-#     - cp workspace/dd-java-agent/build/libs/dd-java-agent-${VERSION}.jar workspace/dd-java-agent/build/libs/dd-java-agent.jar # upload two filenames
-#     - gh release upload --clobber --repo DataDog/dd-trace-java $CI_COMMIT_TAG workspace/dd-java-agent/build/libs/dd-java-agent.jar
-#     - gh release upload --clobber --repo DataDog/dd-trace-java $CI_COMMIT_TAG workspace/dd-java-agent/build/libs/dd-java-agent-${VERSION}.jar
-#     - gh release upload --clobber --repo DataDog/dd-trace-java $CI_COMMIT_TAG workspace/dd-trace-api/build/libs/dd-trace-api-${VERSION}.jar
-#     - gh release upload --clobber --repo DataDog/dd-trace-java $CI_COMMIT_TAG workspace/dd-trace-ot/build/libs/dd-trace-ot-${VERSION}.jar
-#   after_script:
-#     - dd-octo-sts revoke -t $(cat github-token.txt)
-#   retry:
-#     max: 2
-#     when: always
-#
-# requirements_json_test:
-#   rules:
-#     - when: on_success
-#   variables:
-#     REQUIREMENTS_BLOCK_JSON_PATH: "metadata/requirements-block.json"
-#     REQUIREMENTS_ALLOW_JSON_PATH: "metadata/requirements-allow.json"
-#
-# package-oci:
-#   needs: [ build ]
-#
-# override_verify_maven_central:
-#   image: registry.ddbuild.io/images/base/gbi-ubuntu_2204:release
-#   stage: publish
-#   needs: [ ]
-#   rules:
-#     - if: '$POPULATE_CACHE'
-#       when: never
-#     - when: manual
-#       allow_failure: true
-#   script:
-#     - touch OVERRIDE_MAVEN_VERIFY
-#   cache: # Cache is used to signal between the override_verify_maven_central and verify_maven_central_deployment jobs
-#     - key: $CI_PIPELINE_ID-OVERRIDE_SIGNAL
-#       paths:
-#         - OVERRIDE_MAVEN_VERIFY
-#       policy: push
-#       unprotect: true
-#
-# # Verify Maven Central deployment is publicly available before publishing OCI images
-# verify_maven_central_deployment:
-#   image: registry.ddbuild.io/images/base/gbi-ubuntu_2204:release
-#   stage: publish
-#   needs: [ deploy_to_maven_central ]
-#   rules:
-#     - if: '$POPULATE_CACHE'
-#       when: never
-#     - if: '$CI_COMMIT_TAG =~ /^v[0-9]+\.[0-9]+\.[0-9]+$/'
-#       when: on_success
-#   cache: # Cache is used to signal between the override_verify_maven_central and verify_maven_central_deployment jobs
-#     - key: $CI_PIPELINE_ID-OVERRIDE_SIGNAL
-#       paths:
-#         - OVERRIDE_MAVEN_VERIFY
-#       policy: pull
-#       unprotect: true
-#   script:
-#     - if [ -f OVERRIDE_MAVEN_VERIFY ]; then echo "SKIPPING MAVEN VERIFICATION"; exit 0; fi
-#     - |
-#       export VERSION=${CI_COMMIT_TAG##v}
-#       ARTIFACT_URLS=(
-#         "https://repo1.maven.org/maven2/com/datadoghq/dd-java-agent/${VERSION}/dd-java-agent-${VERSION}.jar"
-#         "https://repo1.maven.org/maven2/com/datadoghq/dd-trace-api/${VERSION}/dd-trace-api-${VERSION}.jar"
-#         "https://repo1.maven.org/maven2/com/datadoghq/dd-trace-ot/${VERSION}/dd-trace-ot-${VERSION}.jar"
-#       )
-#       # Wait 5 mins initially, then try 5 times with a minute delay between each retry to see if the release artifacts are available
-#       sleep 300
-#       TRY=0
-#       MAX_TRIES=5
-#       DELAY=60
-#       while [ $TRY -lt $MAX_TRIES ]; do
-#         ARTIFACTS_AVAILABLE=true
-#         for URL in "${ARTIFACT_URLS[@]}"; do
-#           if ! curl --location --fail --silent --show-error -I "$URL"; then
-#             ARTIFACTS_AVAILABLE=false
-#             break
-#           fi
-#         done
-#         if [ "$ARTIFACTS_AVAILABLE" = true ]; then
-#           break
-#         fi
-#         TRY=$((TRY + 1))
-#         if [ $TRY -eq $MAX_TRIES ]; then
-#           echo "The release was not available after 10 mins. Manually re-run the job to try again."
-#           exit 1
-#         fi
-#         sleep $DELAY
-#       done
-#
-# publishing-gate:
-#   stage: publish
-#   needs:
-#     - job: verify_maven_central_deployment
-#       optional: true # Required for releases only
-#
-# configure_system_tests:
-#   variables:
-#     SYSTEM_TESTS_SCENARIOS_GROUPS: "simple_onboarding,simple_onboarding_profiling,simple_onboarding_appsec,docker-ssi,lib-injection"
-#
-# create_key:
-#   stage: generate-signing-key
-#   when: manual
-#   needs: [ ]
-#   variables:
-#     PROJECT_NAME: "dd-trace-java"
-#     EXPORT_TO_KEYSERVER: "true"
-#   image: $REGISTRY/ci/agent-key-management-tools/gpg:1
-#   script:
-#     - /create.sh
-#   artifacts:
-#     expire_in: 13 mos
-#     paths:
-#       - pubkeys
-#
-# validate_supported_configurations_v2_local_file:
-#   extends: .validate_supported_configurations_v2_local_file
-#   variables:
-#     LOCAL_JSON_PATH: "metadata/supported-configurations.json"
-#     BACKFILLED: "false"
-#
-# update_central_configurations_version_range_v2:
-#   extends: .update_central_configurations_version_range_v2
-#   variables:
-#     LOCAL_REPO_NAME: "dd-trace-java"
-#     LOCAL_JSON_PATH: "metadata/supported-configurations.json"
-#     LANGUAGE_NAME: "java"
-#     MULTIPLE_RELEASE_LINES: "false"
+test_smoke_graalvm:
+  extends: .test_job
+  tags: [ "arch:amd64" ]
+  variables:
+    GRADLE_TARGET: "stageMainDist :dd-smoke-test:spring-boot-3.0-native:test"
+    CACHE_TYPE: "smoke"
+    CI_NO_SPLIT: "true"
+    NON_DEFAULT_JVMS: "true"
+  parallel:
+    matrix:
+      - testJvm: ["graalvm17", "graalvm21", "graalvm25"]
+
+test_smoke_semeru8_debugger:
+  extends: .test_job
+  tags: [ "arch:amd64" ]
+  variables:
+    GRADLE_TARGET: "stageMainDist dd-smoke-tests:debugger-integration-tests:test"
+    CACHE_TYPE: "smoke"
+    NON_DEFAULT_JVMS: "true"
+    testJvm: "semeru8"
+
+deploy_to_profiling_backend:
+  stage: publish
+  needs: [ build ]
+  rules:
+    - if: '$POPULATE_CACHE'
+      when: never
+    - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
+      when: on_success
+    - if: '$CI_COMMIT_TAG =~ /^v.*/'
+      when: on_success
+    - when: manual
+      allow_failure: true
+  trigger:
+    project: DataDog/profiling-backend
+    branch: dogfooding
+  variables:
+    UPSTREAM_PACKAGE_JOB: $BUILD_JOB_NAME
+    UPSTREAM_PACKAGE_JOB_ID: $BUILD_JOB_ID
+    UPSTREAM_PROJECT_ID: $CI_PROJECT_ID
+    UPSTREAM_PROJECT_NAME: $CI_PROJECT_NAME
+    UPSTREAM_PIPELINE_ID: $CI_PIPELINE_ID
+    UPSTREAM_BRANCH: $CI_COMMIT_BRANCH
+    UPSTREAM_TAG: $CI_COMMIT_TAG
+
+trigger_tibco_tests:
+  stage: tests
+  needs: [ build ]
+  rules:
+    - if: '$POPULATE_CACHE'
+      when: never
+    - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
+      when: on_success
+    - if: '$CI_COMMIT_TAG =~ /^v.*/'
+      when: on_success
+    - when: manual
+      allow_failure: true
+  trigger:
+    project: DataDog/tibco-testing
+    branch: main
+    strategy: depend
+  variables:
+    UPSTREAM_PACKAGE_JOB: $BUILD_JOB_NAME
+    UPSTREAM_PACKAGE_JOB_ID: $BUILD_JOB_ID
+    UPSTREAM_PROJECT_ID: $CI_PROJECT_ID
+    UPSTREAM_PROJECT_NAME: $CI_PROJECT_NAME
+    UPSTREAM_PIPELINE_ID: $CI_PIPELINE_ID
+    UPSTREAM_BRANCH: $CI_COMMIT_BRANCH
+    UPSTREAM_TAG: $CI_COMMIT_TAG
+    FORCE_TRIGGER: $FORCE_TRIGGER
+
+deploy_to_di_backend:manual:
+  stage: publish
+  needs: [ build ]
+  rules:
+    - if: '$POPULATE_CACHE'
+      when: never
+    - when: manual
+      allow_failure: true
+  trigger:
+    project: DataDog/debugger-demos
+    branch: main
+  variables:
+    UPSTREAM_PACKAGE_JOB: build
+    UPSTREAM_PROJECT_ID: $CI_PROJECT_ID
+    UPSTREAM_PROJECT_NAME: $CI_PROJECT_NAME
+    UPSTREAM_PIPELINE_ID: $CI_PIPELINE_ID
+    UPSTREAM_BRANCH: $CI_COMMIT_BRANCH
+    UPSTREAM_TAG: $CI_COMMIT_TAG
+    UPSTREAM_COMMIT_AUTHOR: $CI_COMMIT_AUTHOR
+    UPSTREAM_COMMIT_SHORT_SHA: $CI_COMMIT_SHORT_SHA
+
+# If the deploy_to_maven_central job is re-run, re-trigger the deploy_artifacts_to_github job as well so that the artifacts match.
+deploy_to_maven_central:
+  extends: .gradle_build
+  stage: publish
+  needs: [ build ]
+  variables:
+    CACHE_TYPE: "lib"
+  rules:
+    - if: '$POPULATE_CACHE'
+      when: never
+    - if: '$CI_COMMIT_BRANCH == "master"'
+      when: on_success
+    # Do not deploy release candidate versions
+    - if: '$CI_COMMIT_TAG =~ /^v[0-9]+\.[0-9]+\.[0-9]+$/'
+      when: on_success
+    - when: manual
+      allow_failure: true
+  script:
+    - export MAVEN_CENTRAL_USERNAME=$(aws ssm get-parameter --region us-east-1 --name ci.dd-trace-java.central_username --with-decryption --query "Parameter.Value" --out text)
+    - export MAVEN_CENTRAL_PASSWORD=$(aws ssm get-parameter --region us-east-1 --name ci.dd-trace-java.central_password --with-decryption --query "Parameter.Value" --out text)
+    - export GPG_PRIVATE_KEY=$(aws ssm get-parameter --region us-east-1 --name ci.dd-trace-java.signing.gpg_private_key --with-decryption --query "Parameter.Value" --out text)
+    - export GPG_PASSWORD=$(aws ssm get-parameter --region us-east-1 --name ci.dd-trace-java.signing.gpg_passphrase --with-decryption --query "Parameter.Value" --out text)
+    - ./gradlew -PbuildInfo.build.number=$CI_JOB_ID publishToSonatype closeSonatypeStagingRepository -PskipTests $GRADLE_ARGS
+  artifacts:
+    paths:
+      - 'workspace/dd-java-agent/build/libs/*.jar'
+      - 'workspace/dd-trace-api/build/libs/*.jar'
+      - 'workspace/dd-trace-ot/build/libs/*.jar'
+
+deploy_artifacts_to_github:
+  stage: publish
+  image: registry.ddbuild.io/images/dd-octo-sts-ci-base:2025.06-1
+  tags: [ "arch:amd64" ]
+  id_tokens:
+    DDOCTOSTS_ID_TOKEN:
+      aud: dd-octo-sts
+  rules:
+    - if: '$POPULATE_CACHE'
+      when: never
+    - if: '$CI_COMMIT_TAG =~ /^v[0-9]+\.[0-9]+\.[0-9]+$/'
+      when: on_success
+  # Requires the deploy_to_maven_central job to have run first (the UP-TO-DATE gradle check across jobs is broken)
+  # This will deploy the artifacts built from the publishToSonatype task to the GitHub release
+  needs:
+    - job: deploy_to_maven_central
+      # The deploy_to_maven_central job is not run for release candidate versions
+      optional: true
+  before_script:
+    - dd-octo-sts version
+    - dd-octo-sts debug --scope DataDog/dd-trace-java --policy self.gitlab.release
+    - dd-octo-sts token --scope DataDog/dd-trace-java --policy self.gitlab.release > github-token.txt
+  script:
+    - gh auth login --with-token < github-token.txt
+    - gh auth status
+    - export VERSION=${CI_COMMIT_TAG##v} # remove "v" from front of tag to get version
+    - cp workspace/dd-java-agent/build/libs/dd-java-agent-${VERSION}.jar workspace/dd-java-agent/build/libs/dd-java-agent.jar # upload two filenames
+    - gh release upload --clobber --repo DataDog/dd-trace-java $CI_COMMIT_TAG workspace/dd-java-agent/build/libs/dd-java-agent.jar
+    - gh release upload --clobber --repo DataDog/dd-trace-java $CI_COMMIT_TAG workspace/dd-java-agent/build/libs/dd-java-agent-${VERSION}.jar
+    - gh release upload --clobber --repo DataDog/dd-trace-java $CI_COMMIT_TAG workspace/dd-trace-api/build/libs/dd-trace-api-${VERSION}.jar
+    - gh release upload --clobber --repo DataDog/dd-trace-java $CI_COMMIT_TAG workspace/dd-trace-ot/build/libs/dd-trace-ot-${VERSION}.jar
+  after_script:
+    - dd-octo-sts revoke -t $(cat github-token.txt)
+  retry:
+    max: 2
+    when: always
+
+requirements_json_test:
+  rules:
+    - when: on_success
+  variables:
+    REQUIREMENTS_BLOCK_JSON_PATH: "metadata/requirements-block.json"
+    REQUIREMENTS_ALLOW_JSON_PATH: "metadata/requirements-allow.json"
+
+package-oci:
+  needs: [ build ]
+
+override_verify_maven_central:
+  image: registry.ddbuild.io/images/base/gbi-ubuntu_2204:release
+  stage: publish
+  needs: [ ]
+  rules:
+    - if: '$POPULATE_CACHE'
+      when: never
+    - when: manual
+      allow_failure: true
+  script:
+    - touch OVERRIDE_MAVEN_VERIFY
+  cache: # Cache is used to signal between the override_verify_maven_central and verify_maven_central_deployment jobs
+    - key: $CI_PIPELINE_ID-OVERRIDE_SIGNAL
+      paths:
+        - OVERRIDE_MAVEN_VERIFY
+      policy: push
+      unprotect: true
+
+# Verify Maven Central deployment is publicly available before publishing OCI images
+verify_maven_central_deployment:
+  image: registry.ddbuild.io/images/base/gbi-ubuntu_2204:release
+  stage: publish
+  needs: [ deploy_to_maven_central ]
+  rules:
+    - if: '$POPULATE_CACHE'
+      when: never
+    - if: '$CI_COMMIT_TAG =~ /^v[0-9]+\.[0-9]+\.[0-9]+$/'
+      when: on_success
+  cache: # Cache is used to signal between the override_verify_maven_central and verify_maven_central_deployment jobs
+    - key: $CI_PIPELINE_ID-OVERRIDE_SIGNAL
+      paths:
+        - OVERRIDE_MAVEN_VERIFY
+      policy: pull
+      unprotect: true
+  script:
+    - if [ -f OVERRIDE_MAVEN_VERIFY ]; then echo "SKIPPING MAVEN VERIFICATION"; exit 0; fi
+    - |
+      export VERSION=${CI_COMMIT_TAG##v}
+      ARTIFACT_URLS=(
+        "https://repo1.maven.org/maven2/com/datadoghq/dd-java-agent/${VERSION}/dd-java-agent-${VERSION}.jar"
+        "https://repo1.maven.org/maven2/com/datadoghq/dd-trace-api/${VERSION}/dd-trace-api-${VERSION}.jar"
+        "https://repo1.maven.org/maven2/com/datadoghq/dd-trace-ot/${VERSION}/dd-trace-ot-${VERSION}.jar"
+      )
+      # Wait 5 mins initially, then try 5 times with a minute delay between each retry to see if the release artifacts are available
+      sleep 300
+      TRY=0
+      MAX_TRIES=5
+      DELAY=60
+      while [ $TRY -lt $MAX_TRIES ]; do
+        ARTIFACTS_AVAILABLE=true
+        for URL in "${ARTIFACT_URLS[@]}"; do
+          if ! curl --location --fail --silent --show-error -I "$URL"; then
+            ARTIFACTS_AVAILABLE=false
+            break
+          fi
+        done
+        if [ "$ARTIFACTS_AVAILABLE" = true ]; then
+          break
+        fi
+        TRY=$((TRY + 1))
+        if [ $TRY -eq $MAX_TRIES ]; then
+          echo "The release was not available after 10 mins. Manually re-run the job to try again."
+          exit 1
+        fi
+        sleep $DELAY
+      done
+
+publishing-gate:
+  stage: publish
+  needs:
+    - job: verify_maven_central_deployment
+      optional: true # Required for releases only
+
+configure_system_tests:
+  variables:
+    SYSTEM_TESTS_SCENARIOS_GROUPS: "simple_onboarding,simple_onboarding_profiling,simple_onboarding_appsec,docker-ssi,lib-injection"
+
+create_key:
+  stage: generate-signing-key
+  when: manual
+  needs: [ ]
+  variables:
+    PROJECT_NAME: "dd-trace-java"
+    EXPORT_TO_KEYSERVER: "true"
+  image: $REGISTRY/ci/agent-key-management-tools/gpg:1
+  script:
+    - /create.sh
+  artifacts:
+    expire_in: 13 mos
+    paths:
+      - pubkeys
+
+validate_supported_configurations_v2_local_file:
+  extends: .validate_supported_configurations_v2_local_file
+  variables:
+    LOCAL_JSON_PATH: "metadata/supported-configurations.json"
+    BACKFILLED: "false"
+
+update_central_configurations_version_range_v2:
+  extends: .update_central_configurations_version_range_v2
+  variables:
+    LOCAL_REPO_NAME: "dd-trace-java"
+    LOCAL_JSON_PATH: "metadata/supported-configurations.json"
+    LANGUAGE_NAME: "java"
+    MULTIPLE_RELEASE_LINES: "false"
diff --git a/dd-smoke-tests/gradle/src/test/groovy/datadog/smoketest/GradleLauncherSmokeTest.groovy b/dd-smoke-tests/gradle/src/test/groovy/datadog/smoketest/GradleLauncherSmokeTest.groovy
index 50a0372a78f..e27511e3507 100644
--- a/dd-smoke-tests/gradle/src/test/groovy/datadog/smoketest/GradleLauncherSmokeTest.groovy
+++ b/dd-smoke-tests/gradle/src/test/groovy/datadog/smoketest/GradleLauncherSmokeTest.groovy
@@ -76,7 +76,7 @@ class GradleLauncherSmokeTest extends AbstractGradleTest {
       "DD_CODE_ORIGIN_FOR_SPANS_ENABLED"  : "false",
       "DD_API_KEY"                        : "dummy"
     ])
-    String[] command = ["./gradlew", "--no-daemon", "--info", "--stacktrace"]
+    String[] command = ["./gradlew", "--no-daemon", "--info"]
     if (gradleDaemonCmdLineParams) {
       command += "-Dorg.gradle.jvmargs=$gradleDaemonCmdLineParams".toString()
     }

From a8a85d154bd95c122847a4a6509f6a68ba9c259c Mon Sep 17 00:00:00 2001
From: Brice Dutheil 
Date: Mon, 8 Dec 2025 17:31:09 +0100
Subject: [PATCH 09/12] fix: Don't use the the shared tempdir as it is shared
 for every test

This causes all tests to use the same user preference folder,
possibly increasing the chance of this issue happening.
---
 .../trace/civisibility/CiVisibilitySmokeTest.groovy | 13 ++++++++-----
 1 file changed, 8 insertions(+), 5 deletions(-)

diff --git a/dd-java-agent/agent-ci-visibility/civisibility-test-fixtures/src/main/groovy/datadog/trace/civisibility/CiVisibilitySmokeTest.groovy b/dd-java-agent/agent-ci-visibility/civisibility-test-fixtures/src/main/groovy/datadog/trace/civisibility/CiVisibilitySmokeTest.groovy
index d2c7427c126..df4c653d9e5 100644
--- a/dd-java-agent/agent-ci-visibility/civisibility-test-fixtures/src/main/groovy/datadog/trace/civisibility/CiVisibilitySmokeTest.groovy
+++ b/dd-java-agent/agent-ci-visibility/civisibility-test-fixtures/src/main/groovy/datadog/trace/civisibility/CiVisibilitySmokeTest.groovy
@@ -6,6 +6,7 @@ import datadog.trace.api.config.CiVisibilityConfig
 import datadog.trace.api.config.GeneralConfig
 import datadog.trace.api.config.TraceInstrumentationConfig
 import datadog.trace.api.config.TracerConfig
+import java.nio.file.Paths
 import spock.lang.Shared
 import spock.lang.Specification
 import spock.lang.TempDir
@@ -28,10 +29,6 @@ abstract class CiVisibilitySmokeTest extends Specification {
   @TempDir
   protected Path prefsDir
 
-  @Shared
-  @TempDir
-  protected Path prefsDirShared
-
   protected static String buildJavaHome() {
     if (Jvm.current.isJava8()) {
       return System.getenv("JAVA_8_HOME")
@@ -111,10 +108,16 @@ abstract class CiVisibilitySmokeTest extends Specification {
    * `setupSpec()`.
    */
   protected String preventJulPrefsFileLock() {
-    String prefsPath = (prefsDir ?: prefsDirShared).toAbsolutePath()
+    String prefsPath = (prefsDir ?: tempUserPrefsPath()).toAbsolutePath()
     return "-Djava.util.prefs.userRoot=$prefsPath".toString()
   }
 
+  private static Path tempUserPrefsPath() {
+    String uniqueId = "${System.currentTimeMillis()}_${System.nanoTime()}_${Thread.currentThread().id}"
+    Path prefsPath = Paths.get(System.getProperty("java.io.tmpdir"), "gradle-test-userPrefs", uniqueId)
+    return prefsPath
+  }
+
   protected verifyEventsAndCoverages(String projectName, String toolchain, String toolchainVersion, List> events, List> coverages, List additionalDynamicTags = []) {
     def additionalReplacements = ["content.meta.['test.toolchain']": "$toolchain:$toolchainVersion"]
 

From 2a15199d21ba3b90e1b9bc6e1298548ae48d4a78 Mon Sep 17 00:00:00 2001
From: Brice Dutheil 
Date: Mon, 8 Dec 2025 18:02:51 +0100
Subject: [PATCH 10/12] fix: Emit gradle properties per test run

Previous code, was generating a single gradle properties file per test.
---
 .../datadog/smoketest/GradleDaemonSmokeTest.groovy   | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/dd-smoke-tests/gradle/src/test/groovy/datadog/smoketest/GradleDaemonSmokeTest.groovy b/dd-smoke-tests/gradle/src/test/groovy/datadog/smoketest/GradleDaemonSmokeTest.groovy
index 45a7c5deb7c..ec808b56c0e 100644
--- a/dd-smoke-tests/gradle/src/test/groovy/datadog/smoketest/GradleDaemonSmokeTest.groovy
+++ b/dd-smoke-tests/gradle/src/test/groovy/datadog/smoketest/GradleDaemonSmokeTest.groovy
@@ -34,10 +34,6 @@ class GradleDaemonSmokeTest extends AbstractGradleTest {
   @TempDir
   Path testKitFolder
 
-  def setupSpec() {
-    givenGradleProperties()
-  }
-
   @IgnoreIf(reason = "Jacoco plugin does not work with OpenJ9 in older Gradle versions", value = {
     JavaVirtualMachine.isJ9()
   })
@@ -79,6 +75,7 @@ class GradleDaemonSmokeTest extends AbstractGradleTest {
   def "test junit4 class ordering v#gradleVersion"() {
     givenGradleVersionIsCompatibleWithCurrentJvm(gradleVersion)
     givenGradleProjectFiles(projectName)
+    givenGradleProjectProperties()
     ensureDependenciesDownloaded(gradleVersion)
 
     mockBackend.givenKnownTests(true)
@@ -124,6 +121,7 @@ class GradleDaemonSmokeTest extends AbstractGradleTest {
     givenGradleVersionIsCompatibleWithCurrentJvm(gradleVersion)
     givenConfigurationCacheIsCompatibleWithCurrentPlatform(configurationCache)
     givenGradleProjectFiles(projectName)
+    givenGradleProjectProperties()
     ensureDependenciesDownloaded(gradleVersion)
 
     mockBackend.givenFlakyRetries(flakyRetries)
@@ -150,7 +148,7 @@ class GradleDaemonSmokeTest extends AbstractGradleTest {
     }
   }
 
-  private void givenGradleProperties() {
+  private void givenGradleProjectProperties() {
     assert new File(AGENT_JAR).isFile()
 
     def ddApiKeyPath = testKitFolder.resolve(".dd.api.key")
@@ -173,7 +171,9 @@ class GradleDaemonSmokeTest extends AbstractGradleTest {
     def arguments = buildJvmArguments(mockBackend.intakeUrl, TEST_SERVICE_NAME, additionalArgs)
 
     def gradleProperties = "org.gradle.jvmargs=${arguments.join(" ")}".toString()
-    Files.write(testKitFolder.resolve("gradle.properties"), gradleProperties.getBytes())
+    // Write to projectFolder (per-test) instead of testKitFolder (shared), so each
+    // Gradle daemon gets its own unique preference directory
+    Files.write(projectFolder.resolve("gradle.properties"), gradleProperties.getBytes())
   }
 
   private BuildResult runGradleTests(String gradleVersion, boolean successExpected = true, boolean configurationCache = false) {

From 40e7b82b30557f456a1aec399f3dcb940a60db1f Mon Sep 17 00:00:00 2001
From: Brice Dutheil 
Date: Mon, 8 Dec 2025 20:52:31 +0100
Subject: [PATCH 11/12] fix: remove unused import

---
 .../datadog/trace/civisibility/CiVisibilitySmokeTest.groovy      | 1 -
 1 file changed, 1 deletion(-)

diff --git a/dd-java-agent/agent-ci-visibility/civisibility-test-fixtures/src/main/groovy/datadog/trace/civisibility/CiVisibilitySmokeTest.groovy b/dd-java-agent/agent-ci-visibility/civisibility-test-fixtures/src/main/groovy/datadog/trace/civisibility/CiVisibilitySmokeTest.groovy
index df4c653d9e5..14a01165915 100644
--- a/dd-java-agent/agent-ci-visibility/civisibility-test-fixtures/src/main/groovy/datadog/trace/civisibility/CiVisibilitySmokeTest.groovy
+++ b/dd-java-agent/agent-ci-visibility/civisibility-test-fixtures/src/main/groovy/datadog/trace/civisibility/CiVisibilitySmokeTest.groovy
@@ -7,7 +7,6 @@ import datadog.trace.api.config.GeneralConfig
 import datadog.trace.api.config.TraceInstrumentationConfig
 import datadog.trace.api.config.TracerConfig
 import java.nio.file.Paths
-import spock.lang.Shared
 import spock.lang.Specification
 import spock.lang.TempDir
 import spock.util.environment.Jvm

From bc8489613b7196233f6e9835dfa36ee27a112ea0 Mon Sep 17 00:00:00 2001
From: Alexey Kuznetsov 
Date: Mon, 8 Dec 2025 16:45:50 -0500
Subject: [PATCH 12/12] Revert flag

---
 .gitlab-ci.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 0c74d14c308..81f123610c4 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -36,7 +36,7 @@ variables:
     value: "false"
   NON_DEFAULT_JVMS:
     description: "Enable tests on JVMs that are not the default"
-    value: "true"
+    value: "false"
   RUN_FLAKY_TESTS:
     description: "Enable flaky tests"
     value: "false"