diff --git a/build-logic/smoke-test/src/main/resources/datadog/buildlogic/smoketest/proxy-repositories.init.gradle.kts b/build-logic/smoke-test/src/main/resources/datadog/buildlogic/smoketest/proxy-repositories.init.gradle.kts index 70fe8054b90..cd54686d921 100644 --- a/build-logic/smoke-test/src/main/resources/datadog/buildlogic/smoketest/proxy-repositories.init.gradle.kts +++ b/build-logic/smoke-test/src/main/resources/datadog/buildlogic/smoketest/proxy-repositories.init.gradle.kts @@ -1,10 +1,38 @@ import org.gradle.api.Action import org.gradle.api.Project +import org.gradle.api.artifacts.dsl.RepositoryHandler +import org.gradle.api.artifacts.repositories.MavenArtifactRepository import org.gradle.api.initialization.Settings gradle.beforeSettings(Action { val gradlePluginProxy = providers.gradleProperty("gradlePluginProxy").orNull val mavenRepositoryProxy = providers.gradleProperty("mavenRepositoryProxy").orNull + val mavenCentralUrls = setOf( + "https://repo.maven.apache.org/maven2", + "https://repo1.maven.org/maven2", + ) + + fun RepositoryHandler.redirectMavenCentral() { + val proxy = mavenRepositoryProxy?.takeIf { it.isNotBlank() } ?: return + withType(MavenArtifactRepository::class.java).configureEach { + if (url.toString().trimEnd('/') in mavenCentralUrls) { + url = java.net.URI(proxy) + isAllowInsecureProtocol = true + } + } + } + + fun RepositoryHandler.removeDuplicateMavenProxy() { + val proxyUrl = mavenRepositoryProxy?.takeIf { it.isNotBlank() }?.trimEnd('/') ?: return + withType(MavenArtifactRepository::class.java) + .filter { it.url.toString().trimEnd('/') == proxyUrl } + .drop(1) + .forEach { remove(it) } + } + + buildscript.repositories.redirectMavenCentral() + pluginManagement.repositories.redirectMavenCentral() + dependencyResolutionManagement.repositories.redirectMavenCentral() pluginManagement { repositories { @@ -22,11 +50,19 @@ gradle.beforeSettings(Action { } } gradlePluginPortal() - mavenCentral() + if (mavenRepositoryProxy.isNullOrBlank()) { + mavenCentral() + } } } + gradle.settingsEvaluated(Action { + pluginManagement.repositories.removeDuplicateMavenProxy() + }) + gradle.beforeProject(Action { + repositories.redirectMavenCentral() + buildscript.repositories.redirectMavenCentral() repositories { mavenLocal() mavenRepositoryProxy?.takeIf { it.isNotBlank() }?.let { proxy -> @@ -35,7 +71,13 @@ gradle.beforeSettings(Action { isAllowInsecureProtocol = true } } - mavenCentral() + if (mavenRepositoryProxy.isNullOrBlank()) { + mavenCentral() + } } }) + + gradle.afterProject(Action { + repositories.removeDuplicateMavenProxy() + }) }) diff --git a/build-logic/smoke-test/src/test/kotlin/datadog/buildlogic/smoketest/SmokeTestAppEndToEndTest.kt b/build-logic/smoke-test/src/test/kotlin/datadog/buildlogic/smoketest/SmokeTestAppEndToEndTest.kt index 6aa17ed4b7c..da64a0d303e 100644 --- a/build-logic/smoke-test/src/test/kotlin/datadog/buildlogic/smoketest/SmokeTestAppEndToEndTest.kt +++ b/build-logic/smoke-test/src/test/kotlin/datadog/buildlogic/smoketest/SmokeTestAppEndToEndTest.kt @@ -265,7 +265,7 @@ class SmokeTestAppEndToEndTest { } @Test - fun `local proxy property prepends Maven proxy repositories exactly once`() { + fun `Maven proxy replaces Maven Central in nested repositories`() { writeOuterSettings() val proxyRepository = projectDir.resolve("proxy-maven-repo").toFile() val projectRepository = projectDir.resolve("project-maven-repo").toFile() @@ -279,10 +279,29 @@ class SmokeTestAppEndToEndTest { sysProperty = "resolved.repositories.path", ), ) - writeInnerSettings() + writeInnerSettings( + """ + pluginManagement { + repositories { + mavenCentral() + } + } + + gradle.settingsEvaluated { + val outputDir = java.io.File(providers.gradleProperty("appBuildDir").get()) + outputDir.mkdirs() + outputDir.resolve("plugin-repositories.txt").writeText( + pluginManagement.repositories + .withType(org.gradle.api.artifacts.repositories.MavenArtifactRepository::class.java) + .joinToString(System.lineSeparator()) { "repository=" + it.url } + ) + } + """.trimIndent(), + ) writeInnerBuild( """ repositories { + mavenCentral() maven { url = uri("${projectRepository.toURI()}") } @@ -301,8 +320,12 @@ class SmokeTestAppEndToEndTest { val artifacts = configurations.compileClasspath.get() .sortedBy { it.name } .map { it.name + "=" + it.readText() } + val repositoryUrls = repositories + .withType(org.gradle.api.artifacts.repositories.MavenArtifactRepository::class.java) + .map { "repository=" + it.url } resolved.get().asFile.writeText( - (listOf("init-script-count=" + gradle.startParameter.initScripts.size) + artifacts) + (listOf("init-script-count=" + gradle.startParameter.initScripts.size) + + repositoryUrls + artifacts) .joinToString(System.lineSeparator()) ) } @@ -319,11 +342,31 @@ class SmokeTestAppEndToEndTest { assertThat(result.task(":resolveRepositories")?.outcome).isEqualTo(TaskOutcome.SUCCESS) val resolvedFile = applicationOutput("resolved-repositories.txt") assertThat(resolvedFile).exists() - assertThat(resolvedFile.readLines()).containsExactly( + val resolvedLines = resolvedFile.readLines() + assertThat(resolvedLines).contains( "init-script-count=1", + "repository=${proxyRepository.toURI()}", "project-only-1.0.jar=project-only", "shared-1.0.jar=proxy", ) + assertThat(resolvedLines).containsOnlyOnce( + "repository=${proxyRepository.toURI()}", + ) + assertThat(resolvedLines).doesNotContain( + "repository=https://repo.maven.apache.org/maven2/", + ) + val pluginRepositoriesFile = applicationOutput("plugin-repositories.txt") + assertThat(pluginRepositoriesFile).exists() + val pluginRepositoryLines = pluginRepositoriesFile.readLines() + assertThat(pluginRepositoryLines).contains( + "repository=${proxyRepository.toURI()}", + ) + assertThat(pluginRepositoryLines).containsOnlyOnce( + "repository=${proxyRepository.toURI()}", + ) + assertThat(pluginRepositoryLines).doesNotContain( + "repository=https://repo.maven.apache.org/maven2/", + ) } @Test @@ -649,10 +692,11 @@ class SmokeTestAppEndToEndTest { "fake-mvnw" } - private fun writeInnerSettings() { + private fun writeInnerSettings(additionalContent: String = "") { File(applicationDir, "settings.gradle.kts").writeText( """ rootProject.name = "smoke-test-app-fixture-application" + $additionalContent """.trimIndent(), ) }