Skip to content

Commit aea5035

Browse files
authored
Add gradle debug plugin (#8879)
1 parent 7b14cc7 commit aea5035

3 files changed

Lines changed: 115 additions & 0 deletions

File tree

build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ buildscript {
1313
}
1414

1515
plugins {
16+
id "datadog.gradle-debug"
1617
id "datadog.dependency-locking"
1718

1819
id "com.diffplug.spotless" version "6.13.0"

buildSrc/build.gradle.kts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,12 @@ plugins {
55
id("com.diffplug.spotless") version "6.13.0"
66
}
77

8+
java {
9+
toolchain {
10+
languageVersion = JavaLanguageVersion.of(8)
11+
}
12+
}
13+
814
gradlePlugin {
915
plugins {
1016
create("instrument-plugin") {
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
/*
2+
* Gradle debugging plugin for dd-trace-java builds.
3+
*/
4+
5+
val ddGradleDebugEnabled = project.hasProperty("ddGradleDebug")
6+
val logPath = rootProject.layout.buildDirectory.file("datadog.gradle-debug.log")
7+
8+
fun inferJdkFromJavaHome(javaHome: String?): String {
9+
val effectiveJavaHome = javaHome ?: System.getenv("JAVA_HOME")
10+
if (effectiveJavaHome == null) {
11+
throw IllegalStateException("JAVA_HOME is not set")
12+
}
13+
val javaExecutable = File(effectiveJavaHome, "bin/java").absolutePath
14+
return try {
15+
val process = ProcessBuilder(javaExecutable, "-version")
16+
.redirectErrorStream(true)
17+
.start()
18+
val output = process.inputStream.bufferedReader().readText()
19+
val versionLine = output.lines().firstOrNull() ?: ""
20+
val versionMatch = Regex("version\\s+\"([0-9._]+)\"").find(versionLine)
21+
versionMatch?.let {
22+
val version = it.groupValues[1]
23+
when {
24+
version.startsWith("1.") -> version.substring(2, 3)
25+
else -> version.split('.').first()
26+
}
27+
} ?: "unknown"
28+
} catch (e: Exception) {
29+
"error: ${e.message}"
30+
}
31+
}
32+
33+
fun getJdkFromCompilerOptions(co: CompileOptions): String? {
34+
if (co.isFork) {
35+
val fo = co.forkOptions
36+
val javaHome = fo.javaHome
37+
if (javaHome != null) {
38+
return inferJdkFromJavaHome(javaHome.toString())
39+
}
40+
}
41+
return null
42+
}
43+
44+
fun printJdkForProjectTasks(project: Project, logFile: File) {
45+
project.tasks.forEach { task ->
46+
val data = mutableMapOf<String, String>()
47+
data["task"] = task.path.toString()
48+
if (task is JavaExec) {
49+
val launcher = task.javaLauncher.get()
50+
data["jdk"] = launcher.metadata.languageVersion.toString()
51+
} else if (task is Javadoc) {
52+
val tool = task.javadocTool.get()
53+
data["jdk"] = tool.metadata.languageVersion.toString()
54+
} else if (task is Test) {
55+
val launcher = task.javaLauncher.get()
56+
data["jdk"] = launcher.metadata.languageVersion.toString()
57+
} else if (task is Exec) {
58+
val java_home = task.environment.get("JAVA_HOME")?.toString()
59+
data["jdk"] = inferJdkFromJavaHome(java_home)
60+
} else if (task is JavaCompile) {
61+
val compiler = task.javaCompiler.get()
62+
data["jdk"] = compiler.metadata.languageVersion.toString()
63+
val jdkFromJavaHome = getJdkFromCompilerOptions(task.options)
64+
if (jdkFromJavaHome != null && jdkFromJavaHome != data["jdk"]) {
65+
data["java_home"] = jdkFromJavaHome
66+
}
67+
} else if (task is GroovyCompile) {
68+
val launcher = task.javaLauncher.get()
69+
data["jdk"] = launcher.metadata.languageVersion.toString()
70+
val jdkFromJavaHome = getJdkFromCompilerOptions(task.options)
71+
if (jdkFromJavaHome != null && jdkFromJavaHome != data["jdk"]) {
72+
data["java_home"] = jdkFromJavaHome
73+
}
74+
} else if (task is ScalaCompile) {
75+
val launcher = task.javaLauncher.get()
76+
data["jdk"] = launcher.metadata.languageVersion.toString()
77+
val jdkFromJavaHome = getJdkFromCompilerOptions(task.options)
78+
if (jdkFromJavaHome != null && jdkFromJavaHome != data["jdk"]) {
79+
data["java_home"] = jdkFromJavaHome
80+
}
81+
} else {
82+
data["jdk"] = "unknown"
83+
}
84+
val json = data.entries.joinToString(prefix = "{", postfix = "}") { (k, v) -> "\"$k\":\"$v\"" }
85+
logFile.appendText("$json\n")
86+
}
87+
}
88+
89+
class DebugBuildListener : org.gradle.BuildListener {
90+
override fun settingsEvaluated(settings: Settings) = Unit
91+
92+
override fun projectsLoaded(gradle: Gradle) = Unit
93+
94+
override fun buildFinished(result: BuildResult) = Unit
95+
96+
override fun projectsEvaluated(gradle: Gradle) {
97+
val logFile = logPath.get().asFile
98+
logFile.writeText("")
99+
gradle.rootProject.allprojects.forEach { project ->
100+
printJdkForProjectTasks(project, logFile)
101+
}
102+
}
103+
}
104+
105+
if (ddGradleDebugEnabled) {
106+
logger.lifecycle("datadog.gradle-debug plugin is enabled")
107+
gradle.addListener(DebugBuildListener())
108+
}

0 commit comments

Comments
 (0)