Skip to content

Commit 5243e52

Browse files
Fix gradle-debug failing on configuration resolution (#11755)
Fix gradle-debug failing on configuration resolution Inspect tasks at taskGraph.whenReady instead of force-realizing every task in projectsEvaluated, which resolved configurations without an exclusive lock. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Co-authored-by: alexey.kuznetsov <alexey.kuznetsov@datadoghq.com>
1 parent e292db6 commit 5243e52

1 file changed

Lines changed: 28 additions & 19 deletions

File tree

buildSrc/src/main/kotlin/dd-trace-java.gradle-debug.gradle.kts

Lines changed: 28 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,27 @@
11
/*
22
* Gradle debugging plugin for dd-trace-java builds.
3+
*
4+
* Logs the JDK used by each scheduled task to diagnose unexpected Java versions.
5+
*
6+
* Usage:
7+
* ./gradlew <task> -PddGradleDebug e.g. ./gradlew assemble -PddGradleDebug
8+
*
9+
* Only tasks in the execution graph of the requested command are reported, so run it
10+
* against a real task (e.g. `build`, `:module:test`); `help` reports almost nothing.
11+
*
12+
* Output: build/datadog.gradle-debug.log (one JSON object per task), e.g.
13+
* {"task":":dd-trace-api:compileJava", "jdk":"8"}
14+
* {"task":":dd-trace-api:test", "jdk":"11"}
15+
*
16+
* "jdk":"unknown" means the task type carries no JVM (e.g. lifecycle/aggregate tasks like
17+
* `classes` or `assemble`, copy/`Sync` tasks); only Java/Groovy/Scala compile, Test, JavaExec,
18+
* Javadoc and Exec tasks report a version.
319
*/
420

21+
import org.gradle.api.Action
22+
import org.gradle.api.Task
23+
import org.gradle.api.execution.TaskExecutionGraph
24+
525
val ddGradleDebugEnabled = project.hasProperty("ddGradleDebug")
626
val logPath = rootProject.layout.buildDirectory.file("datadog.gradle-debug.log")
727

@@ -38,8 +58,8 @@ fun getJdkFromCompilerOptions(co: CompileOptions): String? {
3858
return null
3959
}
4060

41-
fun printJdkForProjectTasks(project: Project, logFile: File) {
42-
project.tasks.forEach { task ->
61+
fun printJdkForTasks(tasks: Iterable<Task>, logFile: File) {
62+
tasks.forEach { task ->
4363
val data = mutableMapOf<String, String>()
4464
data["task"] = task.path
4565
if (task is JavaExec) {
@@ -83,23 +103,12 @@ fun printJdkForProjectTasks(project: Project, logFile: File) {
83103
}
84104
}
85105

86-
class DebugBuildListener : org.gradle.BuildListener {
87-
override fun settingsEvaluated(settings: Settings) = Unit
88-
89-
override fun projectsLoaded(gradle: Gradle) = Unit
90-
91-
override fun buildFinished(result: BuildResult) = Unit
92-
93-
override fun projectsEvaluated(gradle: Gradle) {
94-
val logFile = logPath.get().asFile
95-
logFile.writeText("")
96-
gradle.rootProject.allprojects.forEach { project ->
97-
printJdkForProjectTasks(project, logFile)
98-
}
99-
}
100-
}
101-
102106
if (ddGradleDebugEnabled) {
103107
logger.lifecycle("datadog.gradle-debug plugin is enabled")
104-
gradle.addListener(DebugBuildListener())
108+
// Inspect tasks once the execution graph is ready, when scheduled tasks are fully configured.
109+
gradle.taskGraph.whenReady(Action<TaskExecutionGraph> {
110+
val logFile = logPath.get().asFile
111+
logFile.writeText("")
112+
printJdkForTasks(allTasks, logFile)
113+
})
105114
}

0 commit comments

Comments
 (0)