From 2a11cba0c729f44cc6b44e1b6ce11dff591802d3 Mon Sep 17 00:00:00 2001 From: Brice Dutheil Date: Thu, 9 Oct 2025 15:18:46 +0200 Subject: [PATCH 1/5] chore: Tweak shadowJar/archive configurations --- gradle/java_no_deps.gradle | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/gradle/java_no_deps.gradle b/gradle/java_no_deps.gradle index 4128586bcb0..d59d38a0d38 100644 --- a/gradle/java_no_deps.gradle +++ b/gradle/java_no_deps.gradle @@ -299,19 +299,25 @@ tasks.withType(JavaExec).configureEach { } } -if (project.plugins.hasPlugin('com.gradleup.shadow')) { +// Helps for reproducible builds +tasks.withType(AbstractArchiveTask).configureEach { + preserveFileTimestamps = false + reproducibleFileOrder = true +} + +project.pluginManager.withPlugin('com.gradleup.shadow') { // Remove the no-deps jar from the archives to prevent publication - configurations.archives.with { - artifacts.remove artifacts.find { + configurations.named('archives') { Configuration c -> + c.artifacts.remove(c.artifacts.find { if (it.hasProperty("delegate")) { it.delegate.archiveTask.is jar } else { it.archiveTask.is jar } } - } - artifacts { - archives(shadowJar) + ) + + c.artifacts.add(tasks.named("shadowJar")) } } From 63a651d4db86f10cfbb7a08f4dbdeb9d4962d83d Mon Sep 17 00:00:00 2001 From: Brice Dutheil Date: Sat, 18 Oct 2025 14:08:00 +0200 Subject: [PATCH 2/5] fix: Properly configure artifacts in a lazy way --- gradle/java_no_deps.gradle | 16 ++++++---------- gradle/util.gradle | 15 ++++++++++----- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/gradle/java_no_deps.gradle b/gradle/java_no_deps.gradle index d59d38a0d38..4f002e70b0e 100644 --- a/gradle/java_no_deps.gradle +++ b/gradle/java_no_deps.gradle @@ -299,7 +299,7 @@ tasks.withType(JavaExec).configureEach { } } -// Helps for reproducible builds +// For reproducible builds tasks.withType(AbstractArchiveTask).configureEach { preserveFileTimestamps = false reproducibleFileOrder = true @@ -307,17 +307,13 @@ tasks.withType(AbstractArchiveTask).configureEach { project.pluginManager.withPlugin('com.gradleup.shadow') { // Remove the no-deps jar from the archives to prevent publication - configurations.named('archives') { Configuration c -> - c.artifacts.remove(c.artifacts.find { - if (it.hasProperty("delegate")) { - it.delegate.archiveTask.is jar - } else { - it.archiveTask.is jar + configurations { + named("archives") { + outgoing.artifact(project.tasks.named("shadowJar")) + outgoing.artifacts.removeIf { + it.buildDependencies.getDependencies(null).contains(project.tasks.named("jar", Jar).get()) } } - ) - - c.artifacts.add(tasks.named("shadowJar")) } } diff --git a/gradle/util.gradle b/gradle/util.gradle index 0d876f6fa1a..64ceec6d5d5 100644 --- a/gradle/util.gradle +++ b/gradle/util.gradle @@ -3,12 +3,17 @@ tasks.register("artifacts") { description = "Displays the artifacts associated with each configuration of " + project doFirst { // This eager access is ok as it is during the task execution phase - configurations.each { config -> - println "${config}:" - config.allArtifacts.getFiles().each { file -> - println " " + file + def builder = new StringBuilder() + configurations.matching { it.name == "archives" }.each { config -> + def outgoingFiles = config.outgoing.artifacts.getFiles() + if (!outgoingFiles.isEmpty()) { + builder.setLength(0) + outgoingFiles.each { file -> + def relPath = project.rootDir.toPath().relativize(file.toPath()) + builder.append(config).append(" (outgoing): ").append(relPath).append('\n') + } + logger.quiet(builder.toString()) } - println ' ' } } } From 125d43977f3a653ec4e006c8ba4c558da09c38b5 Mon Sep 17 00:00:00 2001 From: Brice Dutheil Date: Sat, 18 Oct 2025 14:15:27 +0200 Subject: [PATCH 3/5] chore: Simplify archives configurations as we don't need the zip or tar distributions --- gradle/java_no_deps.gradle | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/gradle/java_no_deps.gradle b/gradle/java_no_deps.gradle index 4f002e70b0e..e8e13e57111 100644 --- a/gradle/java_no_deps.gradle +++ b/gradle/java_no_deps.gradle @@ -307,12 +307,11 @@ tasks.withType(AbstractArchiveTask).configureEach { project.pluginManager.withPlugin('com.gradleup.shadow') { // Remove the no-deps jar from the archives to prevent publication + // Also removes other distribution types (zip, tar etc.), only affects project in dd-smoke-tests configurations { named("archives") { + outgoing.artifacts.clear() outgoing.artifact(project.tasks.named("shadowJar")) - outgoing.artifacts.removeIf { - it.buildDependencies.getDependencies(null).contains(project.tasks.named("jar", Jar).get()) - } } } } From 2f85fdb957f9dbe6551d2032c97f8bb223b10966 Mon Sep 17 00:00:00 2001 From: Brice Dutheil Date: Mon, 20 Oct 2025 14:28:38 +0200 Subject: [PATCH 4/5] chore: Allow the artifacts task to receive command line options --- gradle/util.gradle | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/gradle/util.gradle b/gradle/util.gradle index 64ceec6d5d5..8eaa49810ba 100644 --- a/gradle/util.gradle +++ b/gradle/util.gradle @@ -1,16 +1,28 @@ -tasks.register("artifacts") { - group = "Help" - description = "Displays the artifacts associated with each configuration of " + project - doFirst { +abstract class DisplayArtifactsTask extends DefaultTask { + + @Option(option = "configuration", description = "Comma separated list of of configuration name (defaults to 'archives,javadocElements,sourcesElements'). Use 'all' to display all configurations.)") + @Input + @Optional + abstract Property getConfigurationName() + + DisplayArtifactsTask() { + group = "Help" + description = "Displays the artifacts associated with each configuration of " + project + configurationName.convention("archives,javadocElements,sourcesElements") + } + + @TaskAction + void displayArtifacts() { // This eager access is ok as it is during the task execution phase def builder = new StringBuilder() - configurations.matching { it.name == "archives" }.each { config -> + def targetConfig = configurationName.map { it.split(",").toList().toSet() }.orNull + project.configurations.matching { targetConfig.contains("all") ? true : targetConfig.contains(it.name) }.each { config -> def outgoingFiles = config.outgoing.artifacts.getFiles() if (!outgoingFiles.isEmpty()) { builder.setLength(0) outgoingFiles.each { file -> def relPath = project.rootDir.toPath().relativize(file.toPath()) - builder.append(config).append(" (outgoing): ").append(relPath).append('\n') + builder.append(config).append(": ").append(relPath) } logger.quiet(builder.toString()) } @@ -18,6 +30,8 @@ tasks.register("artifacts") { } } +tasks.register("artifacts", DisplayArtifactsTask) + /** Find a random, reusable port. */ ext.randomOpenPort = { -> From be4b39261636635e509ed229b492722e2324d8b2 Mon Sep 17 00:00:00 2001 From: Brice Dutheil Date: Tue, 21 Oct 2025 17:10:04 +0200 Subject: [PATCH 5/5] chore: PR suggestions Co-authored-by: Sarah Chen --- gradle/util.gradle | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/gradle/util.gradle b/gradle/util.gradle index 8eaa49810ba..ea59895b895 100644 --- a/gradle/util.gradle +++ b/gradle/util.gradle @@ -1,6 +1,6 @@ abstract class DisplayArtifactsTask extends DefaultTask { - @Option(option = "configuration", description = "Comma separated list of of configuration name (defaults to 'archives,javadocElements,sourcesElements'). Use 'all' to display all configurations.)") + @Option(option = "configuration", description = "Comma separated list of configuration name (defaults to 'archives,javadocElements,sourcesElements'). Use 'all' to display all configurations.") @Input @Optional abstract Property getConfigurationName() @@ -16,7 +16,8 @@ abstract class DisplayArtifactsTask extends DefaultTask { // This eager access is ok as it is during the task execution phase def builder = new StringBuilder() def targetConfig = configurationName.map { it.split(",").toList().toSet() }.orNull - project.configurations.matching { targetConfig.contains("all") ? true : targetConfig.contains(it.name) }.each { config -> + def configs = targetConfig.contains("all") ? project.configurations : project.configurations.matching { targetConfig.contains(it.name) } + configs.each { config -> def outgoingFiles = config.outgoing.artifacts.getFiles() if (!outgoingFiles.isEmpty()) { builder.setLength(0)