Skip to content

Commit 2b016f9

Browse files
feat: allow skipping dependency verification disabling for test opt
1 parent 5a8dcc6 commit 2b016f9

11 files changed

Lines changed: 166 additions & 30 deletions

File tree

dd-java-agent/instrumentation/gradle/gradle-3.0/src/main/groovy/datadog/trace/instrumentation/gradle/legacy/GradleProjectConfigurator.groovy

Lines changed: 26 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ class GradleProjectConfigurator {
4343
public static final GradleProjectConfigurator INSTANCE = new GradleProjectConfigurator()
4444

4545
private static final String JACOCO_PLUGIN_ID = 'jacoco'
46+
private static final String JACOCO_AGENT_CONFIGURATION_NAME = 'jacocoAgent'
47+
private static final String JACOCO_ANT_CONFIGURATION_NAME = 'jacocoAnt'
4648

4749
void configureTracer(Task task, Map<String, String> propagatedSystemProperties) {
4850
def config = Config.get()
@@ -130,15 +132,8 @@ class GradleProjectConfigurator {
130132
def ddJavacPlugin = project.configurations.detachedConfiguration(project.dependencies.create("com.datadoghq:dd-javac-plugin:$compilerPluginVersion"))
131133
def ddJavacPluginClient = project.configurations.detachedConfiguration(project.dependencies.create("com.datadoghq:dd-javac-plugin-client:$compilerPluginVersion"))
132134

133-
// if instrumented project does dependency verification,
134-
// we need to exclude the two detached configurations that we're adding
135-
// as corresponding entries are not in the project's verification-metadata.xml
136-
if (ddJavacPlugin.resolutionStrategy.respondsTo("disableDependencyVerification")) {
137-
ddJavacPlugin.resolutionStrategy.disableDependencyVerification()
138-
}
139-
if (ddJavacPluginClient.resolutionStrategy.respondsTo("disableDependencyVerification")) {
140-
ddJavacPluginClient.resolutionStrategy.disableDependencyVerification()
141-
}
135+
disableDependencyVerificationIfConfigured(project, ddJavacPlugin)
136+
disableDependencyVerificationIfConfigured(project, ddJavacPluginClient)
142137

143138
task.classpath = (task.classpath ?: project.files([])) + ddJavacPluginClient.asFileTree
144139

@@ -199,14 +194,11 @@ class GradleProjectConfigurator {
199194
project.apply("plugin": JACOCO_PLUGIN_ID)
200195
project.jacoco.toolVersion = config.ciVisibilityJacocoPluginVersion
201196

202-
// if instrumented project does dependency verification,
203-
// we need to exclude configurations added by Jacoco
204-
// as corresponding entries are not in the project's verification-metadata.xml
205-
def jacocoConfigurations = project.configurations.findAll { it.name.startsWith("jacoco") }
197+
def jacocoConfigurations = project.configurations.findAll {
198+
it.name == JACOCO_AGENT_CONFIGURATION_NAME || it.name == JACOCO_ANT_CONFIGURATION_NAME
199+
}
206200
for (def jacocoConfiguration : jacocoConfigurations) {
207-
if (jacocoConfiguration.resolutionStrategy.respondsTo("disableDependencyVerification")) {
208-
jacocoConfiguration.resolutionStrategy.disableDependencyVerification()
209-
}
201+
disableDependencyVerificationIfConfigured(project, jacocoConfiguration)
210202
}
211203

212204
def coverageIncludedPackages = sessionSettings.getCoverageIncludedPackages()
@@ -227,6 +219,24 @@ class GradleProjectConfigurator {
227219
}
228220
}
229221

222+
private static void disableDependencyVerificationIfConfigured(Project project, def configuration) {
223+
if (Config.get().ciVisibilityGradleDependencyVerificationEnabled
224+
|| !configuration.resolutionStrategy.respondsTo("disableDependencyVerification")) {
225+
return
226+
}
227+
228+
if (project.rootProject.file('gradle/verification-metadata.xml').isFile()) {
229+
project.logger.warn(
230+
"Datadog Test Optimization disabled Gradle dependency verification for configuration "
231+
+ "${configuration.name}. To keep verification enabled, set "
232+
+ "DD_CIVISIBILITY_GRADLE_DEPENDENCY_VERIFICATION_ENABLED=true and add "
233+
+ "the Datadog compiler plugin and injected JaCoCo dependencies to "
234+
+ "gradle/verification-metadata.xml. If the metadata is not updated, Gradle will "
235+
+ "fail the build while resolving these dependencies.")
236+
}
237+
configuration.resolutionStrategy.disableDependencyVerification()
238+
}
239+
230240
private static void forEveryTestTask(Project project, Closure closure) {
231241
def c = { task ->
232242
if (GradleUtils.isTestTask(task)) {

dd-java-agent/instrumentation/gradle/gradle-8.3/src/main/groovy/datadog/trace/instrumentation/gradle/CiVisibilityPlugin.java

Lines changed: 32 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package datadog.trace.instrumentation.gradle;
22

3+
import datadog.trace.api.Config;
34
import datadog.trace.api.civisibility.domain.BuildModuleLayout;
45
import java.io.File;
56
import java.nio.file.Files;
@@ -30,6 +31,8 @@ public abstract class CiVisibilityPlugin implements Plugin<Project> {
3031

3132
private static final String PLUGIN_EXTENSION_NAME = "dd-ci-visibility";
3233
private static final String JACOCO_PLUGIN_ID = "jacoco";
34+
private static final String JACOCO_AGENT_CONFIGURATION_NAME = "jacocoAgent";
35+
private static final String JACOCO_ANT_CONFIGURATION_NAME = "jacocoAnt";
3336

3437
private Project project;
3538

@@ -105,14 +108,34 @@ public void addCompilerPluginConfigurations(CiVisibilityPluginExtension extensio
105108
"com.datadoghq:dd-javac-plugin-client:%s",
106109
extension.getCompilerPluginVersion())));
107110

108-
// if instrumented project does dependency verification,
109-
// we need to exclude the detached configurations that we're adding
110-
// as corresponding entries are not in the project's verification-metadata.xml
111-
configuration.getResolutionStrategy().disableDependencyVerification();
111+
disableDependencyVerificationIfConfigured(configuration);
112112

113113
extension.setCompilerPluginClasspath(configuration);
114114
}
115115

116+
private void disableDependencyVerificationIfConfigured(Configuration configuration) {
117+
if (Config.get().isCiVisibilityGradleDependencyVerificationEnabled()) {
118+
return;
119+
}
120+
121+
if (Files.isRegularFile(
122+
project
123+
.getRootProject()
124+
.getProjectDir()
125+
.toPath()
126+
.resolve("gradle/verification-metadata.xml"))) {
127+
LOGGER.warn(
128+
"Datadog Test Optimization disabled Gradle dependency verification for configuration "
129+
+ "{}. To keep verification enabled, set "
130+
+ "DD_CIVISIBILITY_GRADLE_DEPENDENCY_VERIFICATION_ENABLED=true and add "
131+
+ "the Datadog compiler plugin and injected JaCoCo dependencies to "
132+
+ "gradle/verification-metadata.xml. If the metadata is not updated, Gradle will "
133+
+ "fail the build while resolving these dependencies.",
134+
configuration.getName());
135+
}
136+
configuration.getResolutionStrategy().disableDependencyVerification();
137+
}
138+
116139
private void addModuleName(CiVisibilityPluginExtension extension) {
117140
extension.setModuleName(getModuleName());
118141
}
@@ -156,13 +179,13 @@ private void applyJacocoPlugin(CiVisibilityPluginExtension extension) {
156179

157180
List<Configuration> jacocoConfigurations =
158181
project.getConfigurations().stream()
159-
.filter(c -> c.getName().startsWith("jacoco"))
182+
.filter(
183+
c ->
184+
JACOCO_AGENT_CONFIGURATION_NAME.equals(c.getName())
185+
|| JACOCO_ANT_CONFIGURATION_NAME.equals(c.getName()))
160186
.collect(Collectors.toList());
161187
for (Configuration jacocoConfiguration : jacocoConfigurations) {
162-
// if instrumented project does dependency verification,
163-
// we need to exclude configurations added by Jacoco
164-
// as corresponding entries are not in the project's verification-metadata.xml
165-
jacocoConfiguration.getResolutionStrategy().disableDependencyVerification();
188+
disableDependencyVerificationIfConfigured(jacocoConfiguration);
166189
}
167190
}
168191

dd-smoke-tests/gradle/src/test/java/datadog/smoketest/GradleDaemonSmokeTest.java

Lines changed: 49 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,45 @@ void testRobolectric(String gradleVersion, String projectName, int expectedTrace
161161
mockBackend.waitForCoverages(0));
162162
}
163163

164+
@TableTest({
165+
"scenario | gradleVersion | verificationEnabled",
166+
"legacy-default | 7.6.4 | false ",
167+
"legacy-enabled | 7.6.4 | true ",
168+
"modern-default | 8.3 | false ",
169+
"modern-enabled | 8.3 | true "
170+
})
171+
@ParameterizedTest
172+
void testInjectedDependencyVerification(String gradleVersion, boolean verificationEnabled)
173+
throws IOException {
174+
givenGradleVersionIsCompatibleWithCurrentJvm(gradleVersion);
175+
givenGradleVersionIsSupportedByCurrentGradleTestKit(gradleVersion);
176+
givenGradleProjectFiles("test-gradle-dependency-verification");
177+
178+
Map<String, String> additionalArgs = new HashMap<>();
179+
if (verificationEnabled) {
180+
additionalArgs.put(
181+
CiVisibilityConfig.CIVISIBILITY_GRADLE_DEPENDENCY_VERIFICATION_ENABLED, "true");
182+
}
183+
givenGradleProjectProperties(additionalArgs);
184+
ensureDependenciesDownloaded(gradleVersion);
185+
186+
BuildResult buildResult =
187+
runGradle(
188+
gradleVersion, Arrays.asList("compileJava", "--stacktrace"), !verificationEnabled);
189+
190+
if (verificationEnabled) {
191+
assertTrue(buildResult.getOutput().contains("Dependency verification failed"));
192+
} else {
193+
assertBuildSuccessful(buildResult);
194+
assertTrue(
195+
buildResult
196+
.getOutput()
197+
.contains(
198+
"Datadog Test Optimization disabled Gradle dependency verification for "
199+
+ "configuration "));
200+
}
201+
}
202+
164203
// TODO: add back LATEST_GRADLE_VERSION after fixing ordering on Gradle 9.3.0
165204
@TableTest({
166205
"scenario | gradleVersion | projectName | flakyTests | expectedOrder | eventsNumber",
@@ -280,14 +319,19 @@ private void runGradleTest(
280319
}
281320

282321
private void givenGradleProjectProperties() throws IOException {
322+
givenGradleProjectProperties(Collections.emptyMap());
323+
}
324+
325+
private void givenGradleProjectProperties(Map<String, String> additionalArgs) throws IOException {
283326
assertTrue(new java.io.File(AGENT_JAR).isFile());
284327

285328
Path ddApiKeyPath = testKitFolder.resolve(".dd.api.key");
286329
Files.write(ddApiKeyPath, "dummy".getBytes());
287330

288-
Map<String, String> additionalArgs = new HashMap<>();
289-
additionalArgs.put(GeneralConfig.API_KEY_FILE, ddApiKeyPath.toAbsolutePath().toString());
290-
additionalArgs.put(
331+
Map<String, String> effectiveAdditionalArgs = new HashMap<>(additionalArgs);
332+
effectiveAdditionalArgs.put(
333+
GeneralConfig.API_KEY_FILE, ddApiKeyPath.toAbsolutePath().toString());
334+
effectiveAdditionalArgs.put(
291335
CiVisibilityConfig.CIVISIBILITY_JACOCO_PLUGIN_VERSION, JACOCO_PLUGIN_VERSION);
292336
/*
293337
* Some of the smoke tests (in particular the one with the Gradle plugin), are using Gradle Test Kit for their tests.
@@ -298,9 +342,9 @@ private void givenGradleProjectProperties() throws IOException {
298342
* This causes the tests to fail because the number of reported traces is different.
299343
* To avoid this discrepancy between local and CI runs, we disable tracing instrumentations.
300344
*/
301-
additionalArgs.put(TraceInstrumentationConfig.TRACE_ENABLED, "false");
345+
effectiveAdditionalArgs.put(TraceInstrumentationConfig.TRACE_ENABLED, "false");
302346
List<String> arguments =
303-
buildJvmArguments(mockBackend.getIntakeUrl(), TEST_SERVICE_NAME, additionalArgs);
347+
buildJvmArguments(mockBackend.getIntakeUrl(), TEST_SERVICE_NAME, effectiveAdditionalArgs);
304348

305349
String gradleProperties = "org.gradle.jvmargs=" + String.join(" ", arguments);
306350
// Write to projectFolder (per-test) instead of testKitFolder (shared), so each
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
apply plugin: 'java'
2+
3+
repositories {
4+
mavenLocal()
5+
6+
def proxyUrl = System.getenv("MAVEN_REPOSITORY_PROXY")
7+
if (proxyUrl) {
8+
println "Using proxy repository: $proxyUrl"
9+
maven {
10+
url = proxyUrl
11+
allowInsecureProtocol = true
12+
}
13+
}
14+
15+
mavenCentral()
16+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<verification-metadata xmlns="https://schema.gradle.org/dependency-verification"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="https://schema.gradle.org/dependency-verification https://schema.gradle.org/dependency-verification/dependency-verification-1.2.xsd">
5+
<configuration>
6+
<verify-metadata>true</verify-metadata>
7+
<verify-signatures>false</verify-signatures>
8+
</configuration>
9+
<components/>
10+
</verification-metadata>
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
rootProject.name = 'gradle-dependency-verification-test-project'
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package datadog.smoke;
2+
3+
public class Calculator {
4+
5+
public int add(int left, int right) {
6+
return left + right;
7+
}
8+
}

dd-trace-api/src/main/java/datadog/trace/api/ConfigDefaults.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,7 @@ public final class ConfigDefaults {
198198
static final boolean DEFAULT_CIVISIBILITY_BUILD_INSTRUMENTATION_ENABLED = true;
199199
static final boolean DEFAULT_CIVISIBILITY_AUTO_CONFIGURATION_ENABLED = true;
200200
static final boolean DEFAULT_CIVISIBILITY_COMPILER_PLUGIN_AUTO_CONFIGURATION_ENABLED = true;
201+
static final boolean DEFAULT_CIVISIBILITY_GRADLE_DEPENDENCY_VERIFICATION_ENABLED = false;
201202
static final String DEFAULT_CIVISIBILITY_COMPILER_PLUGIN_VERSION = "0.2.4";
202203
static final String DEFAULT_CIVISIBILITY_JACOCO_PLUGIN_VERSION = "0.8.15";
203204
static final String DEFAULT_CIVISIBILITY_JACOCO_PLUGIN_EXCLUDES =

dd-trace-api/src/main/java/datadog/trace/api/config/CiVisibilityConfig.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,8 @@ public final class CiVisibilityConfig {
8383
public static final String TEST_MANAGEMENT_ATTEMPT_TO_FIX_RETRIES =
8484
"test.management.attempt.to.fix.retries";
8585
public static final String TEST_FAILED_TEST_REPLAY_ENABLED = "test.failed.test.replay.enabled";
86+
public static final String CIVISIBILITY_GRADLE_DEPENDENCY_VERIFICATION_ENABLED =
87+
"civisibility.gradle.dependency.verification.enabled";
8688

8789
/* Git PR info */
8890
public static final String GIT_PULL_REQUEST_BASE_BRANCH = "git.pull.request.base.branch";

internal-api/src/main/java/datadog/trace/api/Config.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import static datadog.trace.api.ConfigDefaults.DEFAULT_CIVISIBILITY_GIT_UNSHALLOW_ENABLED;
3636
import static datadog.trace.api.ConfigDefaults.DEFAULT_CIVISIBILITY_GIT_UPLOAD_ENABLED;
3737
import static datadog.trace.api.ConfigDefaults.DEFAULT_CIVISIBILITY_GIT_UPLOAD_TIMEOUT_MILLIS;
38+
import static datadog.trace.api.ConfigDefaults.DEFAULT_CIVISIBILITY_GRADLE_DEPENDENCY_VERIFICATION_ENABLED;
3839
import static datadog.trace.api.ConfigDefaults.DEFAULT_CIVISIBILITY_JACOCO_PLUGIN_EXCLUDES;
3940
import static datadog.trace.api.ConfigDefaults.DEFAULT_CIVISIBILITY_JACOCO_PLUGIN_VERSION;
4041
import static datadog.trace.api.ConfigDefaults.DEFAULT_CIVISIBILITY_RESOURCE_FOLDER_NAMES;
@@ -277,6 +278,7 @@
277278
import static datadog.trace.api.config.CiVisibilityConfig.CIVISIBILITY_GIT_UNSHALLOW_ENABLED;
278279
import static datadog.trace.api.config.CiVisibilityConfig.CIVISIBILITY_GIT_UPLOAD_ENABLED;
279280
import static datadog.trace.api.config.CiVisibilityConfig.CIVISIBILITY_GIT_UPLOAD_TIMEOUT_MILLIS;
281+
import static datadog.trace.api.config.CiVisibilityConfig.CIVISIBILITY_GRADLE_DEPENDENCY_VERIFICATION_ENABLED;
280282
import static datadog.trace.api.config.CiVisibilityConfig.CIVISIBILITY_GRADLE_SOURCE_SETS;
281283
import static datadog.trace.api.config.CiVisibilityConfig.CIVISIBILITY_IMPACTED_TESTS_DETECTION_ENABLED;
282284
import static datadog.trace.api.config.CiVisibilityConfig.CIVISIBILITY_INJECTED_TRACER_VERSION;
@@ -1149,6 +1151,7 @@ public static String getHostName() {
11491151
private final boolean ciVisibilityAutoConfigurationEnabled;
11501152
private final String ciVisibilityAdditionalChildProcessJvmArgs;
11511153
private final boolean ciVisibilityCompilerPluginAutoConfigurationEnabled;
1154+
private final boolean ciVisibilityGradleDependencyVerificationEnabled;
11521155
private final boolean ciVisibilityCodeCoverageEnabled;
11531156
private final Boolean ciVisibilityCoverageLinesEnabled;
11541157
private final String ciVisibilityCodeCoverageReportDumpDir;
@@ -2703,6 +2706,10 @@ PROFILING_DATADOG_PROFILER_ENABLED, isDatadogProfilerSafeInCurrentEnvironment())
27032706
configProvider.getBoolean(
27042707
CIVISIBILITY_COMPILER_PLUGIN_AUTO_CONFIGURATION_ENABLED,
27052708
DEFAULT_CIVISIBILITY_COMPILER_PLUGIN_AUTO_CONFIGURATION_ENABLED);
2709+
ciVisibilityGradleDependencyVerificationEnabled =
2710+
configProvider.getBoolean(
2711+
CIVISIBILITY_GRADLE_DEPENDENCY_VERIFICATION_ENABLED,
2712+
DEFAULT_CIVISIBILITY_GRADLE_DEPENDENCY_VERIFICATION_ENABLED);
27062713
ciVisibilityCodeCoverageEnabled =
27072714
configProvider.getBoolean(CIVISIBILITY_CODE_COVERAGE_ENABLED, true);
27082715
ciVisibilityCoverageLinesEnabled =
@@ -4447,6 +4454,10 @@ public List<String> getCiVisibilityJacocoGradleSourceSets() {
44474454
return ciVisibilityJacocoGradleSourceSets;
44484455
}
44494456

4457+
public boolean isCiVisibilityGradleDependencyVerificationEnabled() {
4458+
return ciVisibilityGradleDependencyVerificationEnabled;
4459+
}
4460+
44504461
public boolean isCiVisibilityCodeCoverageReportUploadEnabled() {
44514462
return ciVisibilityCodeCoverageReportUploadEnabled;
44524463
}
@@ -6820,6 +6831,8 @@ public String toString() {
68206831
+ otlpTracesCompression
68216832
+ ", otlpTracesTimeout="
68226833
+ otlpTracesTimeout
6834+
+ ", ciVisibilityGradleDependencyVerificationEnabled="
6835+
+ ciVisibilityGradleDependencyVerificationEnabled
68236836
+ ", serviceDiscoveryEnabled="
68246837
+ serviceDiscoveryEnabled
68256838
+ ", sfnInjectDatadogAttributeEnabled="

0 commit comments

Comments
 (0)