From 9ff56454dcbcfd417abe05db7eb0a2a5e3dea695 Mon Sep 17 00:00:00 2001 From: Santiago Mola Date: Fri, 23 May 2025 20:39:52 +0200 Subject: [PATCH 1/2] Add gradle debug plugin --- build.gradle | 1 + buildSrc/build.gradle.kts | 6 + .../kotlin/datadog.gradle-debug.gradle.kts | 122 ++++++++++++++++++ 3 files changed, 129 insertions(+) create mode 100644 buildSrc/src/main/kotlin/datadog.gradle-debug.gradle.kts diff --git a/build.gradle b/build.gradle index 6a7447502b6..e71f3a08b3e 100644 --- a/build.gradle +++ b/build.gradle @@ -13,6 +13,7 @@ buildscript { } plugins { + id "datadog.gradle-debug" id "datadog.dependency-locking" id "com.diffplug.spotless" version "6.13.0" diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index 5c95fd38756..c9fb16a0dbd 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -5,6 +5,12 @@ plugins { id("com.diffplug.spotless") version "6.13.0" } +java { + toolchain { + languageVersion = JavaLanguageVersion.of(8) + } +} + gradlePlugin { plugins { create("instrument-plugin") { diff --git a/buildSrc/src/main/kotlin/datadog.gradle-debug.gradle.kts b/buildSrc/src/main/kotlin/datadog.gradle-debug.gradle.kts new file mode 100644 index 00000000000..3da7748c4c6 --- /dev/null +++ b/buildSrc/src/main/kotlin/datadog.gradle-debug.gradle.kts @@ -0,0 +1,122 @@ +/* + * Gradle debugging plugin for dd-trace-java builds. + */ + + +val ddGradleDebugEnabled = project.hasProperty("ddGradleDebug") +val logPath = "${rootProject.projectDir}/build/datadog.gradle-debug.log" + +fun inferJdkFromJavaHome(javaHome: String?): String { + val effectiveJavaHome = javaHome ?: System.getenv("JAVA_HOME") + val javaExecutable = File(effectiveJavaHome, "bin/java").absolutePath + return try { + val process = ProcessBuilder(javaExecutable, "-version") + .redirectErrorStream(true) + .start() + val output = process.inputStream.bufferedReader().readText() + val versionLine = output.lines().firstOrNull() ?: "" + val versionMatch = Regex("version\\s+\"([0-9._]+)\"").find(versionLine) + versionMatch?.let { + val version = it.groupValues[1] + when { + version.startsWith("1.") -> version.substring(2, 3) + else -> version.split('.').first() + } + } ?: "unknown" + } catch (e: Exception) { + "error: ${e.message}" + } +} + +fun getJdkFromCompilerOptions(co: CompileOptions): String? { + if (co.isFork) { + val fo = co.forkOptions + val javaHome = fo.javaHome + if (javaHome != null) { + return inferJdkFromJavaHome(javaHome.toString()) + } + } + return null +} + +fun printJdkForProjectTasks(project: Project) { + project.tasks.forEach { task -> + val data = mutableMapOf() + data["task"] = task.path.toString() + if (task is JavaCompile) { + val compiler = task.javaCompiler.get() + data["jdk"] = compiler.metadata.languageVersion.toString() + val jdkFromJavaHome = getJdkFromCompilerOptions(task.options) + if (jdkFromJavaHome != null && jdkFromJavaHome != data["jdk"]) { + data["java_home"] = jdkFromJavaHome + } + } else if (task is GroovyCompile) { + val launcher = task.javaLauncher.get() + data["jdk"] = launcher.metadata.languageVersion.toString() + val jdkFromJavaHome = getJdkFromCompilerOptions(task.options) + if (jdkFromJavaHome != null && jdkFromJavaHome != data["jdk"]) { + data["java_home"] = jdkFromJavaHome + } + } else if (task.javaClass.name.contains("KotlinCompile")) { + try { + val kc = task.javaClass.getDeclaredMethod("getKotlinOptions").invoke(task) + val jvmTarget = kc.javaClass.getDeclaredMethod("getJvmTarget").invoke(kc) + val get = jvmTarget.javaClass.getDeclaredMethod("get").invoke(jvmTarget) + data["jdk"] = get.toString() + } catch (e: NoSuchMethodException) { + + } + } else if (task is ScalaCompile) { + val launcher = task.javaLauncher.get() + data["jdk"] = launcher.metadata.languageVersion.toString() + val jdkFromJavaHome = getJdkFromCompilerOptions(task.options) + if (jdkFromJavaHome != null && jdkFromJavaHome != data["jdk"]) { + data["java_home"] = jdkFromJavaHome + } + } else if (task is JavaExec) { + val launcher = task.javaLauncher.get() + data["jdk"] = launcher.metadata.languageVersion.toString() + } else if (task is Javadoc) { + val tool = task.javadocTool.get() + data["jdk"] = tool.metadata.languageVersion.toString() + } else if (task is Test) { + val launcher = task.javaLauncher.get() + data["jdk"] = launcher.metadata.languageVersion.toString() + } else if (task is Exec) { + val java_home = task.environment.get("JAVA_HOME")?.toString() + data["jdk"] = inferJdkFromJavaHome(java_home) + } else { + data["jdk"] = "unknown" + } + val json = data.entries.joinToString(prefix = "{", postfix = "}") { (k, v) -> "\"$k\":\"$v\"" } + File(logPath).appendText("$json\n") + } +} + + +class DebugBuildListener : org.gradle.BuildListener { + + override fun settingsEvaluated(settings: Settings) { + + } + + override fun projectsLoaded(gradle: Gradle) { + + } + + override fun buildFinished(result: BuildResult) { + } + + override fun projectsEvaluated(gradle: Gradle) { + File(logPath).writeText("") + gradle.rootProject.allprojects.forEach { project -> + printJdkForProjectTasks(project) + } + } +} + + +if (ddGradleDebugEnabled) { + println("datadog.gradle-debug plugin is enabled") + gradle.addListener(DebugBuildListener()) +} From ce1c1ebcdd2cfaa9bd39c350095abe5fa0f24cd2 Mon Sep 17 00:00:00 2001 From: Santiago Mola Date: Mon, 26 May 2025 19:26:22 +0200 Subject: [PATCH 2/2] address PR comments, format --- .../kotlin/datadog.gradle-debug.gradle.kts | 156 ++++++++---------- 1 file changed, 71 insertions(+), 85 deletions(-) diff --git a/buildSrc/src/main/kotlin/datadog.gradle-debug.gradle.kts b/buildSrc/src/main/kotlin/datadog.gradle-debug.gradle.kts index 3da7748c4c6..0d5c4b7c87a 100644 --- a/buildSrc/src/main/kotlin/datadog.gradle-debug.gradle.kts +++ b/buildSrc/src/main/kotlin/datadog.gradle-debug.gradle.kts @@ -2,29 +2,31 @@ * Gradle debugging plugin for dd-trace-java builds. */ - val ddGradleDebugEnabled = project.hasProperty("ddGradleDebug") -val logPath = "${rootProject.projectDir}/build/datadog.gradle-debug.log" +val logPath = rootProject.layout.buildDirectory.file("datadog.gradle-debug.log") fun inferJdkFromJavaHome(javaHome: String?): String { val effectiveJavaHome = javaHome ?: System.getenv("JAVA_HOME") + if (effectiveJavaHome == null) { + throw IllegalStateException("JAVA_HOME is not set") + } val javaExecutable = File(effectiveJavaHome, "bin/java").absolutePath return try { - val process = ProcessBuilder(javaExecutable, "-version") - .redirectErrorStream(true) - .start() - val output = process.inputStream.bufferedReader().readText() - val versionLine = output.lines().firstOrNull() ?: "" - val versionMatch = Regex("version\\s+\"([0-9._]+)\"").find(versionLine) - versionMatch?.let { - val version = it.groupValues[1] - when { - version.startsWith("1.") -> version.substring(2, 3) - else -> version.split('.').first() - } - } ?: "unknown" + val process = ProcessBuilder(javaExecutable, "-version") + .redirectErrorStream(true) + .start() + val output = process.inputStream.bufferedReader().readText() + val versionLine = output.lines().firstOrNull() ?: "" + val versionMatch = Regex("version\\s+\"([0-9._]+)\"").find(versionLine) + versionMatch?.let { + val version = it.groupValues[1] + when { + version.startsWith("1.") -> version.substring(2, 3) + else -> version.split('.').first() + } + } ?: "unknown" } catch (e: Exception) { - "error: ${e.message}" + "error: ${e.message}" } } @@ -39,84 +41,68 @@ fun getJdkFromCompilerOptions(co: CompileOptions): String? { return null } -fun printJdkForProjectTasks(project: Project) { - project.tasks.forEach { task -> - val data = mutableMapOf() - data["task"] = task.path.toString() - if (task is JavaCompile) { - val compiler = task.javaCompiler.get() - data["jdk"] = compiler.metadata.languageVersion.toString() - val jdkFromJavaHome = getJdkFromCompilerOptions(task.options) - if (jdkFromJavaHome != null && jdkFromJavaHome != data["jdk"]) { - data["java_home"] = jdkFromJavaHome - } - } else if (task is GroovyCompile) { - val launcher = task.javaLauncher.get() - data["jdk"] = launcher.metadata.languageVersion.toString() - val jdkFromJavaHome = getJdkFromCompilerOptions(task.options) - if (jdkFromJavaHome != null && jdkFromJavaHome != data["jdk"]) { - data["java_home"] = jdkFromJavaHome - } - } else if (task.javaClass.name.contains("KotlinCompile")) { - try { - val kc = task.javaClass.getDeclaredMethod("getKotlinOptions").invoke(task) - val jvmTarget = kc.javaClass.getDeclaredMethod("getJvmTarget").invoke(kc) - val get = jvmTarget.javaClass.getDeclaredMethod("get").invoke(jvmTarget) - data["jdk"] = get.toString() - } catch (e: NoSuchMethodException) { - - } - } else if (task is ScalaCompile) { - val launcher = task.javaLauncher.get() - data["jdk"] = launcher.metadata.languageVersion.toString() - val jdkFromJavaHome = getJdkFromCompilerOptions(task.options) - if (jdkFromJavaHome != null && jdkFromJavaHome != data["jdk"]) { - data["java_home"] = jdkFromJavaHome - } - } else if (task is JavaExec) { - val launcher = task.javaLauncher.get() - data["jdk"] = launcher.metadata.languageVersion.toString() - } else if (task is Javadoc) { - val tool = task.javadocTool.get() - data["jdk"] = tool.metadata.languageVersion.toString() - } else if (task is Test) { - val launcher = task.javaLauncher.get() - data["jdk"] = launcher.metadata.languageVersion.toString() - } else if (task is Exec) { - val java_home = task.environment.get("JAVA_HOME")?.toString() - data["jdk"] = inferJdkFromJavaHome(java_home) - } else { - data["jdk"] = "unknown" - } - val json = data.entries.joinToString(prefix = "{", postfix = "}") { (k, v) -> "\"$k\":\"$v\"" } - File(logPath).appendText("$json\n") +fun printJdkForProjectTasks(project: Project, logFile: File) { + project.tasks.forEach { task -> + val data = mutableMapOf() + data["task"] = task.path.toString() + if (task is JavaExec) { + val launcher = task.javaLauncher.get() + data["jdk"] = launcher.metadata.languageVersion.toString() + } else if (task is Javadoc) { + val tool = task.javadocTool.get() + data["jdk"] = tool.metadata.languageVersion.toString() + } else if (task is Test) { + val launcher = task.javaLauncher.get() + data["jdk"] = launcher.metadata.languageVersion.toString() + } else if (task is Exec) { + val java_home = task.environment.get("JAVA_HOME")?.toString() + data["jdk"] = inferJdkFromJavaHome(java_home) + } else if (task is JavaCompile) { + val compiler = task.javaCompiler.get() + data["jdk"] = compiler.metadata.languageVersion.toString() + val jdkFromJavaHome = getJdkFromCompilerOptions(task.options) + if (jdkFromJavaHome != null && jdkFromJavaHome != data["jdk"]) { + data["java_home"] = jdkFromJavaHome + } + } else if (task is GroovyCompile) { + val launcher = task.javaLauncher.get() + data["jdk"] = launcher.metadata.languageVersion.toString() + val jdkFromJavaHome = getJdkFromCompilerOptions(task.options) + if (jdkFromJavaHome != null && jdkFromJavaHome != data["jdk"]) { + data["java_home"] = jdkFromJavaHome + } + } else if (task is ScalaCompile) { + val launcher = task.javaLauncher.get() + data["jdk"] = launcher.metadata.languageVersion.toString() + val jdkFromJavaHome = getJdkFromCompilerOptions(task.options) + if (jdkFromJavaHome != null && jdkFromJavaHome != data["jdk"]) { + data["java_home"] = jdkFromJavaHome + } + } else { + data["jdk"] = "unknown" } + val json = data.entries.joinToString(prefix = "{", postfix = "}") { (k, v) -> "\"$k\":\"$v\"" } + logFile.appendText("$json\n") + } } - class DebugBuildListener : org.gradle.BuildListener { + override fun settingsEvaluated(settings: Settings) = Unit - override fun settingsEvaluated(settings: Settings) { - - } - - override fun projectsLoaded(gradle: Gradle) { - - } + override fun projectsLoaded(gradle: Gradle) = Unit - override fun buildFinished(result: BuildResult) { - } + override fun buildFinished(result: BuildResult) = Unit - override fun projectsEvaluated(gradle: Gradle) { - File(logPath).writeText("") - gradle.rootProject.allprojects.forEach { project -> - printJdkForProjectTasks(project) - } + override fun projectsEvaluated(gradle: Gradle) { + val logFile = logPath.get().asFile + logFile.writeText("") + gradle.rootProject.allprojects.forEach { project -> + printJdkForProjectTasks(project, logFile) } + } } - if (ddGradleDebugEnabled) { - println("datadog.gradle-debug plugin is enabled") - gradle.addListener(DebugBuildListener()) + logger.lifecycle("datadog.gradle-debug plugin is enabled") + gradle.addListener(DebugBuildListener()) }