Simplify cache-redirector script apply method

Now it could be only be applied inside settings file pluginManagement
block. This will update both settings repositories and all projects in
the repo with cache redirection settings.
This commit is contained in:
Yahor Berdnikau
2022-09-23 12:24:16 +02:00
committed by Space
parent 8af5ade2f4
commit c198d4d90d
19 changed files with 178 additions and 224 deletions
+2 -8
View File
@@ -10,14 +10,8 @@ buildscript {
repositories { repositories {
bootstrapKotlinRepo?.let(::maven) bootstrapKotlinRepo?.let(::maven)
if (cacheRedirectorEnabled) { mavenCentral()
maven("https://cache-redirector.jetbrains.com/plugins.gradle.org/m2") gradlePluginPortal()
maven("https://cache-redirector.jetbrains.com/repo.maven.apache.org/maven2")
} else {
maven("https://plugins.gradle.org/m2")
mavenCentral()
}
} }
// a workaround for kotlin compiler classpath in kotlin project: sometimes gradle substitutes // a workaround for kotlin compiler classpath in kotlin project: sometimes gradle substitutes
+1 -9
View File
@@ -10,11 +10,7 @@ buildscript {
kotlinBootstrapFrom(BootstrapOption.SpaceBootstrap(kotlinBuildProperties.kotlinBootstrapVersion!!, cacheRedirectorEnabled)) kotlinBootstrapFrom(BootstrapOption.SpaceBootstrap(kotlinBuildProperties.kotlinBootstrapVersion!!, cacheRedirectorEnabled))
repositories { repositories {
if (cacheRedirectorEnabled) { maven("https://maven.pkg.jetbrains.space/kotlin/p/kotlin/kotlin-dependencies")
maven("https://cache-redirector.jetbrains.com/maven.pkg.jetbrains.space/kotlin/p/kotlin/kotlin-dependencies")
} else {
maven("https://maven.pkg.jetbrains.space/kotlin/p/kotlin/kotlin-dependencies")
}
project.bootstrapKotlinRepo?.let { project.bootstrapKotlinRepo?.let {
maven(url = it) maven(url = it)
@@ -238,10 +234,6 @@ tasks.named("compileGroovy", GroovyCompile::class.java) {
allprojects { allprojects {
tasks.register("checkBuild") tasks.register("checkBuild")
afterEvaluate {
apply(from = "$rootDir/../gradle/cacheRedirector.gradle.kts")
}
} }
gradlePlugin { gradlePlugin {
+6 -13
View File
@@ -1,13 +1,9 @@
pluginManagement { pluginManagement {
apply from: '../repo/scripts/cache-redirector.settings.gradle.kts'
repositories { repositories {
if (cacheRedirectorEnabled == 'true') { maven { url "https://maven.pkg.jetbrains.space/kotlin/p/kotlin/kotlin-dependencies" }
logger.info("Using cache redirector for settings.gradle pluginManagement") mavenCentral()
maven { gradlePluginPortal()
url "https://cache-redirector.jetbrains.com/plugins.gradle.org/m2"
}
} else {
gradlePluginPortal()
}
} }
} }
@@ -35,13 +31,10 @@ dependencyResolutionManagement {
buildscript { buildscript {
repositories { repositories {
if (cacheRedirectorEnabled == 'true') { maven { url "https://maven.pkg.jetbrains.space/kotlin/p/kotlin/kotlin-dependencies" }
maven { url "https://cache-redirector.jetbrains.com/maven.pkg.jetbrains.space/kotlin/p/kotlin/kotlin-dependencies" }
} else {
maven { url "https://maven.pkg.jetbrains.space/kotlin/p/kotlin/kotlin-dependencies" }
}
mavenCentral() mavenCentral()
} }
def buildGradlePluginVersion = ext["kotlin.build.gradlePlugin.version"] def buildGradlePluginVersion = ext["kotlin.build.gradlePlugin.version"]
dependencies { dependencies {
classpath("org.jetbrains.kotlin:kotlin-build-gradle-plugin:$buildGradlePluginVersion") classpath("org.jetbrains.kotlin:kotlin-build-gradle-plugin:$buildGradlePluginVersion")
@@ -28,7 +28,6 @@ dependencies {
} }
} }
apply(from = "$rootDir/gradle/cacheRedirector.gradle.kts")
project.configureJvmDefaultToolchain() project.configureJvmDefaultToolchain()
project.addEmbeddedConfigurations() project.addEmbeddedConfigurations()
project.configureJavaCompile() project.configureJavaCompile()
@@ -308,23 +308,30 @@ class CodeConformanceTest : TestCase() {
RepoAllowList( RepoAllowList(
// Please use cache-redirector for importing in tests // Please use cache-redirector for importing in tests
"https://maven.pkg.jetbrains.space/kotlin/p/kotlin/dev", root, "https://maven.pkg.jetbrains.space/kotlin/p/kotlin/dev", root,
setOf("gradle/cacheRedirector.gradle.kts") setOf("repo/scripts/cache-redirector.settings.gradle.kts")
), ),
RepoAllowList( RepoAllowList(
"https://cache-redirector.jetbrains.com/maven.pkg.jetbrains.space/kotlin/p/kotlin/dev", root, "https://cache-redirector.jetbrains.com/maven.pkg.jetbrains.space/kotlin/p/kotlin/dev", root,
setOf("gradle/cacheRedirector.gradle.kts") setOf("repo/scripts/cache-redirector.settings.gradle.kts")
), ),
RepoAllowList( RepoAllowList(
// Please use cache-redirector for importing in tests // Please use cache-redirector for importing in tests
"https://maven.pkg.jetbrains.space/kotlin/p/kotlin/eap", root, "https://maven.pkg.jetbrains.space/kotlin/p/kotlin/eap", root,
setOf("gradle/cacheRedirector.gradle.kts") setOf("repo/scripts/cache-redirector.settings.gradle.kts")
), ),
RepoAllowList( RepoAllowList(
"https://cache-redirector.jetbrains.com/maven.pkg.jetbrains.space/kotlin/p/kotlin/dev", root, "https://cache-redirector.jetbrains.com/maven.pkg.jetbrains.space/kotlin/p/kotlin/dev", root,
setOf("gradle/cacheRedirector.gradle.kts") setOf("repo/scripts/cache-redirector.settings.gradle.kts")
), ),
RepoAllowList("kotlin/ktor", root, setOf("gradle/cacheRedirector.gradle.kts")), RepoAllowList(
RepoAllowList("bintray.com", root, setOf("gradle/cacheRedirector.gradle.kts"), exclude = "jcenter.bintray.com") "kotlin/ktor", root,
setOf("repo/scripts/cache-redirector.settings.gradle.kts")
),
RepoAllowList(
"bintray.com", root,
setOf("repo/scripts/cache-redirector.settings.gradle.kts"),
exclude = "jcenter.bintray.com"
)
) )
data class RepoOccurance(val repo: String, val file: File) data class RepoOccurance(val repo: String, val file: File)
@@ -15,10 +15,7 @@ import static org.jetbrains.kotlin.konan.target.Architecture.*
buildscript { buildscript {
repositories { repositories {
if (UtilsKt.getCacheRedirectorEnabled(project)) mavenCentral()
maven { url 'https://cache-redirector.jetbrains.com/maven-central'}
else
mavenCentral()
maven { maven {
url project.bootstrapKotlinRepo url project.bootstrapKotlinRepo
@@ -85,18 +85,9 @@ val Project.testOutputFramework
val Project.testOutputExternal val Project.testOutputExternal
get() = (findProperty("testOutputExternal") as File).toString() get() = (findProperty("testOutputExternal") as File).toString()
val Project.cacheRedirectorEnabled
get() = findProperty("cacheRedirectorEnabled")?.toString()?.toBoolean() ?: false
val Project.compileOnlyTests: Boolean val Project.compileOnlyTests: Boolean
get() = hasProperty("test_compile_only") get() = hasProperty("test_compile_only")
fun Project.redirectIfEnabled(url: String): String = if (cacheRedirectorEnabled) {
val base = URL(url)
"https://cache-redirector.jetbrains.com/${base.host}/${base.path}"
} else
url
val validPropertiesNames = listOf( val validPropertiesNames = listOf(
"konan.home", "konan.home",
"org.jetbrains.kotlin.native.home", "org.jetbrains.kotlin.native.home",
+4 -19
View File
@@ -14,15 +14,12 @@
* limitations under the License. * limitations under the License.
*/ */
import kotlin.text.Regex
import org.jetbrains.kotlin.konan.target.* import org.jetbrains.kotlin.konan.target.*
import org.jetbrains.kotlin.konan.util.* import org.jetbrains.kotlin.konan.util.*
import org.jetbrains.kotlin.CopySamples import org.jetbrains.kotlin.CopySamples
import org.jetbrains.kotlin.CopyCommonSources import org.jetbrains.kotlin.CopyCommonSources
import org.jetbrains.kotlin.PlatformInfo import org.jetbrains.kotlin.PlatformInfo
import org.jetbrains.kotlin.KotlinBuildPusher import org.jetbrains.kotlin.KotlinBuildPusher
import org.jetbrains.kotlin.CollisionDetector
import org.jetbrains.kotlin.CollisionTransformer
import org.jetbrains.kotlin.cpp.CompilationDatabasePlugin import org.jetbrains.kotlin.cpp.CompilationDatabasePlugin
import org.jetbrains.kotlin.CompareDistributionSignatures import org.jetbrains.kotlin.CompareDistributionSignatures
import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
@@ -34,14 +31,8 @@ buildscript {
apply from: "gradle/kotlinGradlePlugin.gradle" apply from: "gradle/kotlinGradlePlugin.gradle"
repositories { repositories {
if (UtilsKt.getCacheRedirectorEnabled(project)) { mavenCentral()
maven { url "https://cache-redirector.jetbrains.com/maven-central" } jcenter()
maven { url "https://cache-redirector.jetbrains.com/jcenter" }
}
else {
mavenCentral()
jcenter()
}
gradlePluginPortal() gradlePluginPortal()
} }
@@ -101,10 +92,7 @@ ext {
allprojects { allprojects {
buildscript { buildscript {
repositories { repositories {
if (UtilsKt.getCacheRedirectorEnabled(project)) jcenter()
maven { url 'https://cache-redirector.jetbrains.com/jcenter' }
else
jcenter()
} }
} }
if (path != ":kotlin-native:dependencies") { if (path != ":kotlin-native:dependencies") {
@@ -112,10 +100,7 @@ allprojects {
} }
repositories { repositories {
if (UtilsKt.getCacheRedirectorEnabled(project)) mavenCentral()
maven { url 'https://cache-redirector.jetbrains.com/maven-central' }
else
mavenCentral()
maven { maven {
url project.bootstrapKotlinRepo url project.bootstrapKotlinRepo
} }
@@ -4,10 +4,7 @@ project.buildscript.repositories {
maven { maven {
url BootstrapKt.getBootstrapKotlinRepo(project) url BootstrapKt.getBootstrapKotlinRepo(project)
} }
if (UtilsKt.getCacheRedirectorEnabled(project)) mavenCentral()
maven { url 'https://cache-redirector.jetbrains.com/maven-central' }
else
mavenCentral()
} }
def kotlinRoot = ext.properties.containsKey("rootBuildDirectory") ? file("${ext.rootBuildDirectory}/..") : rootProject.projectDir def kotlinRoot = ext.properties.containsKey("rootBuildDirectory") ? file("${ext.rootBuildDirectory}/..") : rootProject.projectDir
File versionPropertiesFile = new File(kotlinRoot, "gradle/versions.properties") File versionPropertiesFile = new File(kotlinRoot, "gradle/versions.properties")
@@ -115,7 +115,7 @@ class HierarchicalMppIT : KGPBaseTest() {
fun testDependenciesInTests(gradleVersion: GradleVersion, @TempDir tempDir: Path) { fun testDependenciesInTests(gradleVersion: GradleVersion, @TempDir tempDir: Path) {
publishThirdPartyLib(withGranularMetadata = true, gradleVersion = gradleVersion, localRepoDir = tempDir) { publishThirdPartyLib(withGranularMetadata = true, gradleVersion = gradleVersion, localRepoDir = tempDir) {
kotlinSourcesDir("jvmMain").copyRecursively(kotlinSourcesDir("linuxX64Main")) kotlinSourcesDir("jvmMain").copyRecursively(kotlinSourcesDir("linuxX64Main"))
buildGradleKts.appendText("kotlin.linuxX64()") buildGradleKts.appendText("\nkotlin.linuxX64()")
} }
nativeProject( nativeProject(
@@ -406,11 +406,12 @@ class Kotlin2JsGradlePluginIT : AbstractKotlin2JsGradlePluginIT(false) {
} }
libBuildscript.appendText( libBuildscript.appendText(
""" """
kotlin.js().browser { |
dceTask { |kotlin.js().browser {
dceOptions.devMode = true | dceTask {
} | dceOptions.devMode = true
} | }
|}
""".trimMargin() """.trimMargin()
) )
@@ -228,9 +228,6 @@ class NewMultiplatformIT : BaseGradleIT() {
gradleBuildScript(libProjectName).takeIf { it.extension == "kts" }?.modify { gradleBuildScript(libProjectName).takeIf { it.extension == "kts" }?.modify {
it.replace(Regex("""\.version\(.*\)"""), "") it.replace(Regex("""\.version\(.*\)"""), "")
} }
gradleBuildScript(subproject = libProject.projectDir.name).modify {
it.lines().dropLast(5).joinToString(separator = "\n")
}
build( build(
"clean", "clean",
@@ -430,9 +427,6 @@ class NewMultiplatformIT : BaseGradleIT() {
gradleBuildScript(libProjectName).takeIf { it.extension == "kts" }?.modify { gradleBuildScript(libProjectName).takeIf { it.extension == "kts" }?.modify {
it.replace(Regex("""\.version\(.*\)"""), "") it.replace(Regex("""\.version\(.*\)"""), "")
} }
gradleBuildScript(subproject = libProject.projectDir.name).modify {
it.lines().dropLast(5).joinToString(separator = "\n")
}
build( build(
"clean", "clean",
@@ -714,7 +708,7 @@ class NewMultiplatformIT : BaseGradleIT() {
arrayOf( arrayOf(
it + "com/example/lib/TestCommonCode.class", it + "com/example/lib/TestCommonCode.class",
it + "com/example/lib/TestWithJava.class", it + "com/example/lib/TestWithJava.class",
it + "META-INF/new-mpp-lib-with-tests.kotlin_module" // Note: same name as in main it + "META-INF/new-mpp-lib-with-tests_test.kotlin_module"
) )
}, },
*kotlinClassesDir(sourceSet = "jvmWithoutJava/main").let { *kotlinClassesDir(sourceSet = "jvmWithoutJava/main").let {
@@ -729,7 +723,7 @@ class NewMultiplatformIT : BaseGradleIT() {
arrayOf( arrayOf(
it + "com/example/lib/TestCommonCode.class", it + "com/example/lib/TestCommonCode.class",
it + "com/example/lib/TestWithoutJava.class", it + "com/example/lib/TestWithoutJava.class",
it + "META-INF/new-mpp-lib-with-tests.kotlin_module" // Note: same name as in main it + "META-INF/new-mpp-lib-with-tests_test.kotlin_module"
) )
} }
) )
@@ -1057,9 +1051,6 @@ class NewMultiplatformIT : BaseGradleIT() {
libProject.setupWorkingDir() libProject.setupWorkingDir()
libProject.projectDir.copyRecursively(projectDir.resolve(libProject.projectDir.name)) libProject.projectDir.copyRecursively(projectDir.resolve(libProject.projectDir.name))
gradleBuildScript(libProject.projectDir.name).modify {
it.lines().dropLast(5).joinToString(separator = "\n")
}
projectDir.resolve("settings.gradle").appendText("\ninclude '${libProject.projectDir.name}'") projectDir.resolve("settings.gradle").appendText("\ninclude '${libProject.projectDir.name}'")
gradleBuildScript().modify { gradleBuildScript().modify {
it.replace("'com.example:sample-lib:1.0'", "project(':${libProject.projectDir.name}')") + it.replace("'com.example:sample-lib:1.0'", "project(':${libProject.projectDir.name}')") +
@@ -1277,9 +1268,6 @@ class NewMultiplatformIT : BaseGradleIT() {
setupWorkingDir() setupWorkingDir()
appProject.setupWorkingDir(false) appProject.setupWorkingDir(false)
appProject.projectDir.copyRecursively(projectDir.resolve("sample-app")) appProject.projectDir.copyRecursively(projectDir.resolve("sample-app"))
gradleBuildScript("sample-app").modify {
it.lines().dropLast(5).joinToString(separator = "\n")
}
gradleSettingsScript().writeText("include 'sample-app'") // disables feature preview 'GRADLE_METADATA', resets rootProject name gradleSettingsScript().writeText("include 'sample-app'") // disables feature preview 'GRADLE_METADATA', resets rootProject name
gradleBuildScript("sample-app").modify { gradleBuildScript("sample-app").modify {
@@ -409,16 +409,6 @@ internal fun BaseGradleIT.Project.embedProject(other: BaseGradleIT.Project, rena
} finally { } finally {
check(tempDir.deleteRecursively()) check(tempDir.deleteRecursively())
} }
if (projectName == other.projectName) {
val embeddedModuleDir = projectDir.resolve(embeddedModuleName)
embeddedModuleDir.walk().forEach {
if (it.name.contains("build.gradle")) {
it.modify { string ->
string.lines().dropLast(5).joinToString(separator = "\n")
}
}
}
}
testCase.apply { testCase.apply {
gradleSettingsScript().appendText("\ninclude(\"$embeddedModuleName\")") gradleSettingsScript().appendText("\ninclude(\"$embeddedModuleName\")")
@@ -1135,6 +1135,10 @@ class GeneralNativeIT : BaseGradleIT() {
""".trimIndent() """.trimIndent()
) )
gradleProperties().modify {
it.replace("cacheRedirectorEnabled=true", "cacheRedirectorEnabled=false")
}
build( build(
"build", "build",
options = defaultBuildOptions().copy( options = defaultBuildOptions().copy(
@@ -148,13 +148,16 @@ class NativePlatformLibsIT : BaseGradleIT() {
appendText("\nkotlin.native.linkArgs=-Xfoo=bar -Xbaz=qux") appendText("\nkotlin.native.linkArgs=-Xfoo=bar -Xbaz=qux")
} }
gradleBuildScript().modify(::transformBuildScriptWithPluginsDsl) gradleBuildScript().modify(::transformBuildScriptWithPluginsDsl)
gradleBuildScript().appendText(""" gradleBuildScript().appendText(
kotlin.linuxX64() { """
binaries.sharedLib { |
freeCompilerArgs += "-Xmen=pool" |kotlin.linuxX64() {
} | binaries.sharedLib {
} | freeCompilerArgs += "-Xmen=pool"
""".trimIndent()) | }
|}
""".trimMargin()
)
build("linkDebugSharedLinuxX64") { build("linkDebugSharedLinuxX64") {
assertSuccessful() assertSuccessful()
assertTasksExecuted( assertTasksExecuted(
@@ -499,15 +499,14 @@ internal fun Path.enableAndroidSdk() {
applyAndroidTestFixes() applyAndroidTestFixes()
} }
@OptIn(ExperimentalPathApi::class)
internal fun Path.enableCacheRedirector() { internal fun Path.enableCacheRedirector() {
// Path relative to the current gradle module project dir // Path relative to the current gradle module project dir
val redirectorScript = Paths.get("../../../gradle/cacheRedirector.gradle.kts") val redirectorScript = Paths.get("../../../repo/scripts/cache-redirector.settings.gradle.kts")
assert(redirectorScript.exists()) { assert(redirectorScript.exists()) {
"$redirectorScript does not exist! Please provide correct path to 'cacheRedirector.gradle.kts' file." "$redirectorScript does not exist! Please provide correct path to 'cache-redirector.settings.gradle.kts' file."
} }
val gradleDir = resolve("gradle").also { it.createDirectories() } val gradleDir = resolve("gradle").also { it.createDirectories() }
redirectorScript.copyTo(gradleDir.resolve("cacheRedirector.gradle.kts")) redirectorScript.copyTo(gradleDir.resolve("cache-redirector.settings.gradle.kts"))
val projectCacheRedirectorStatus = Paths val projectCacheRedirectorStatus = Paths
.get("../../../gradle.properties") .get("../../../gradle.properties")
@@ -519,45 +518,34 @@ internal fun Path.enableCacheRedirector() {
.also { if (!it.exists()) it.createFile() } .also { if (!it.exists()) it.createFile() }
.appendText( .appendText(
""" """
|
$projectCacheRedirectorStatus |$projectCacheRedirectorStatus
|
""".trimIndent() """.trimMargin()
) )
val projectDir = toFile() val settingsGradle = resolve("settings.gradle")
projectDir.walk().forEach { val settingsGradleKts = resolve("settings.gradle.kts")
when (it.name) { when {
"build.gradle" -> { Files.exists(settingsGradle) -> settingsGradle.modify {
it.appendText( """
""" |${it.substringBefore("pluginManagement {")}
|pluginManagement {
def cacheRedirectorFile = "${'$'}rootDir/gradle/cacheRedirector.gradle.kts" | apply from: 'gradle/cache-redirector.settings.gradle.kts'
if (new File(cacheRedirectorFile).exists()) { |${it.substringAfter("pluginManagement {")}
apply(from: cacheRedirectorFile) """.trimMargin()
} }
Files.exists(settingsGradleKts) -> settingsGradleKts.modify {
""".trimIndent() """
) |${it.substringBefore("pluginManagement {")}
} |pluginManagement {
| apply(from = "gradle/cache-redirector.settings.gradle.kts")
"build.gradle.kts" -> { |${it.substringAfter("pluginManagement {")}
it.appendText( """.trimMargin()
"""
val cacheRedirectorFile = "${'$'}rootDir/gradle/cacheRedirector.gradle.kts"
if (File(cacheRedirectorFile).exists()) {
apply(from = cacheRedirectorFile)
}
""".trimIndent()
)
}
} }
} }
} }
@OptIn(ExperimentalPathApi::class)
private fun Path.addHeapDumpOptions() { private fun Path.addHeapDumpOptions() {
val propertiesFile = resolve("gradle.properties") val propertiesFile = resolve("gradle.properties")
if (!propertiesFile.exists()) propertiesFile.createFile() if (!propertiesFile.exists()) propertiesFile.createFile()
+5
View File
@@ -0,0 +1,5 @@
## Description
This directory contains the scripts that should be applied before even settings evaluation
and cannot be convention plugins:
- [script](cache-redirector.settings.gradle.kts) to redirect all repositories to cache redirector service
@@ -1,17 +1,27 @@
import java.net.URI
/* /*
* Copyright 2010-2018 JetBrains s.r.o. and Kotlin Programming Language contributors. * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/ */
import org.gradle.api.Project // Apply this settings script in the project settings.gradle following way:
import org.gradle.api.artifacts.dsl.RepositoryHandler // pluginManagement {
import org.gradle.api.artifacts.repositories.MavenArtifactRepository // apply from: 'cache-redirector.settings.gradle.kts'
import java.net.URI // }
internal val Settings.cacheRedirectorEnabled: Provider<Boolean>
get() = providers
.gradleProperty("cacheRedirectorEnabled")
.forUseAtConfigurationTime()
.map { it.toBoolean() }
.orElse(false)
// Repository override section
/** /**
* The list of repositories supported by cache redirector should be synced with the list at https://cache-redirector.jetbrains.com/redirects_generated.html * The list of repositories supported by cache redirector should be synced with the list at https://cache-redirector.jetbrains.com/redirects_generated.html
* To add a repository to the list create an issue in ADM project (example issue https://youtrack.jetbrains.com/issue/IJI-149) * To add a repository to the list create an issue in ADM project (example issue https://youtrack.jetbrains.com/issue/IJI-149)
* Repositories in `buildscript` blocks are *NOT* substituted by this script and should be handled manually
*/ */
val cacheMap: Map<String, String> = mapOf( val cacheMap: Map<String, String> = mapOf(
"https://archive.kernel.org/centos-vault/7.0.1406/os/x86_64/Packages" to "https://cache-redirector.jetbrains.com/archive.kernel.org/centos-vault/7.0.1406/os/x86_64/Packages", "https://archive.kernel.org/centos-vault/7.0.1406/os/x86_64/Packages" to "https://cache-redirector.jetbrains.com/archive.kernel.org/centos-vault/7.0.1406/os/x86_64/Packages",
@@ -106,18 +116,14 @@ val aliases = mapOf(
"https://repo.maven.apache.org/maven2" to "https://repo1.maven.org/maven2" // Maven Central "https://repo.maven.apache.org/maven2" to "https://repo1.maven.org/maven2" // Maven Central
) )
val isTeamcityBuild = project.hasProperty("teamcity") || System.getenv("TEAMCITY_VERSION") != null
fun Project.cacheRedirectorEnabled(): Boolean = findProperty("cacheRedirectorEnabled")?.toString()?.toBoolean() == true
fun URI.maybeRedirect(): URI { fun URI.maybeRedirect(): URI {
val url = toString().trimEnd('/') val url = toString().trimEnd('/')
val dealiasedUrl = aliases.getOrDefault(url, url) val deAliasedUrl = aliases.getOrDefault(url, url)
val cacheUrlEntry = cacheMap.entries.find { (origin, _) -> dealiasedUrl.startsWith(origin) } val cacheUrlEntry = cacheMap.entries.find { (origin, _) -> deAliasedUrl.startsWith(origin) }
return if (cacheUrlEntry != null) { return if (cacheUrlEntry != null) {
val cacheUrl = cacheUrlEntry.value val cacheUrl = cacheUrlEntry.value
val originRestPath = dealiasedUrl.substringAfter(cacheUrlEntry.key, "") val originRestPath = deAliasedUrl.substringAfter(cacheUrlEntry.key, "")
URI("$cacheUrl$originRestPath") URI("$cacheUrl$originRestPath")
} else { } else {
this this
@@ -133,10 +139,60 @@ fun RepositoryHandler.redirect() = configureEach {
} }
} }
// Native compiler download url override section
fun Project.overrideNativeCompilerDownloadUrl() {
logger.info("Redirecting Kotlin/Native compiler download url")
extensions.extraProperties["kotlin.native.distribution.baseDownloadUrl"] =
"https://cache-redirector.jetbrains.com/download.jetbrains.com/kotlin/native/builds"
}
// Check repositories are overriden section
fun Project.addCheckRepositoriesTask() {
val checkRepoTask = tasks.register("checkRepositories") {
val isTeamcityBuildInput = providers.provider {
project.hasProperty("teamcity") || System.getenv("TEAMCITY_VERSION") != null
}.forUseAtConfigurationTime()
doLast {
val testName = "$name in ${project.displayName}"
val isTeamcityBuild = isTeamcityBuildInput.get()
if (isTeamcityBuild) {
testStarted(testName)
}
project.repositories.filterIsInstance<IvyArtifactRepository>().forEach {
@Suppress("SENSELESS_COMPARISON") if (it.url == null) {
logInvalidIvyRepo(testName, isTeamcityBuild)
}
}
project.repositories.findNonCachedRepositories().forEach {
logNonCachedRepo(testName, it, isTeamcityBuild)
}
project.buildscript.repositories.findNonCachedRepositories().forEach {
logNonCachedRepo(testName, it, isTeamcityBuild)
}
if (isTeamcityBuild) {
testFinished(testName)
}
}
}
tasks.configureEach {
if (name == "checkBuild") {
dependsOn(checkRepoTask)
}
}
}
fun URI.isCachedOrLocal() = scheme == "file" || fun URI.isCachedOrLocal() = scheme == "file" ||
host == "cache-redirector.jetbrains.com" || host == "cache-redirector.jetbrains.com" ||
host == "teamcity.jetbrains.com" || host == "teamcity.jetbrains.com" ||
host == "buildserver.labs.intellij.net" host == "buildserver.labs.intellij.net"
fun RepositoryHandler.findNonCachedRepositories(): List<String> { fun RepositoryHandler.findNonCachedRepositories(): List<String> {
val mavenNonCachedRepos = filterIsInstance<MavenArtifactRepository>() val mavenNonCachedRepos = filterIsInstance<MavenArtifactRepository>()
@@ -151,7 +207,7 @@ fun RepositoryHandler.findNonCachedRepositories(): List<String> {
} }
fun escape(s: String): String { fun escape(s: String): String {
return s.replace("[\\|'\\[\\]]".toRegex(), "\\|$0").replace("\n".toRegex(), "|n").replace("\r".toRegex(), "|r") return s.replace("[|'\\[\\]]".toRegex(), "\\|$0").replace("\n".toRegex(), "|n").replace("\r".toRegex(), "|r")
} }
fun testStarted(testName: String) { fun testStarted(testName: String) {
@@ -166,7 +222,11 @@ fun testFailed(name: String, message: String, details: String) {
println("##teamcity[testFailed name='%s' message='%s' details='%s']".format(escape(name), escape(message), escape(details))) println("##teamcity[testFailed name='%s' message='%s' details='%s']".format(escape(name), escape(message), escape(details)))
} }
fun Task.logNonCachedRepo(testName: String, repoUrl: String) { fun Task.logNonCachedRepo(
testName: String,
repoUrl: String,
isTeamcityBuild: Boolean
) {
val msg = "Repository $repoUrl in ${project.displayName} should be cached with cache-redirector" val msg = "Repository $repoUrl in ${project.displayName} should be cached with cache-redirector"
val details = "Using non cached repository may lead to download failures in CI builds." + val details = "Using non cached repository may lead to download failures in CI builds." +
" Check https://github.com/JetBrains/kotlin/blob/master/gradle/cacheRedirector.gradle.kts for details." " Check https://github.com/JetBrains/kotlin/blob/master/gradle/cacheRedirector.gradle.kts for details."
@@ -178,7 +238,10 @@ fun Task.logNonCachedRepo(testName: String, repoUrl: String) {
logger.warn("WARNING - $msg\n$details") logger.warn("WARNING - $msg\n$details")
} }
fun Task.logInvalidIvyRepo(testName: String) { fun Task.logInvalidIvyRepo(
testName: String,
isTeamcityBuild: Boolean
) {
val msg = "Invalid ivy repo found in ${project.displayName}" val msg = "Invalid ivy repo found in ${project.displayName}"
val details = "Url must be not null" val details = "Url must be not null"
@@ -189,49 +252,18 @@ fun Task.logInvalidIvyRepo(testName: String) {
logger.warn("WARNING - $msg: $details") logger.warn("WARNING - $msg: $details")
} }
val checkRepositories: TaskProvider<Task> = tasks.register("checkRepositories") { // Main configuration
doLast {
val testName = "$name in ${project.displayName}"
if (isTeamcityBuild) {
testStarted(testName)
}
project.repositories.filterIsInstance<IvyArtifactRepository>().forEach { if (cacheRedirectorEnabled.get()) {
@Suppress("SENSELESS_COMPARISON") if (it.url == null) { logger.info("Redirecting repositories for settings in ${settingsDir.absolutePath}")
logInvalidIvyRepo(testName)
}
}
project.repositories.findNonCachedRepositories().forEach { pluginManagement.repositories.redirect()
logNonCachedRepo(testName, it) buildscript.repositories.redirect()
}
project.buildscript.repositories.findNonCachedRepositories().forEach { gradle.beforeProject {
logNonCachedRepo(testName, it) buildscript.repositories.redirect()
} repositories.redirect()
overrideNativeCompilerDownloadUrl()
if (isTeamcityBuild) { addCheckRepositoriesTask()
testFinished(testName)
}
} }
} }
fun Project.overrideNativeCompilerDownloadUrl() {
logger.info("Redirecting Kotlin/Native compiler download url")
extensions.extraProperties["kotlin.native.distribution.baseDownloadUrl"] =
"https://cache-redirector.jetbrains.com/download.jetbrains.com/kotlin/native/builds"
}
tasks
.matching {
it.name == "checkBuild"
}
.configureEach {
dependsOn(checkRepositories)
}
if (cacheRedirectorEnabled()) {
logger.info("Redirecting repositories for $displayName")
repositories.redirect()
overrideNativeCompilerDownloadUrl()
}
+5 -17
View File
@@ -1,4 +1,6 @@
pluginManagement { pluginManagement {
apply from: 'repo/scripts/cache-redirector.settings.gradle.kts'
repositories { repositories {
def pluginRepo = System.getProperty("bootstrap.kotlin.repo") def pluginRepo = System.getProperty("bootstrap.kotlin.repo")
if (pluginRepo != null) { if (pluginRepo != null) {
@@ -6,15 +8,9 @@ pluginManagement {
url pluginRepo url pluginRepo
} }
} }
maven { url "https://maven.pkg.jetbrains.space/kotlin/p/kotlin/kotlin-dependencies" }
if (cacheRedirectorEnabled == 'true') { mavenCentral()
logger.info("Using cache redirector for settings.gradle pluginManagement") gradlePluginPortal()
maven { url "https://cache-redirector.jetbrains.com/plugins.gradle.org/m2" }
maven { url "https://cache-redirector.jetbrains.com/maven.pkg.jetbrains.space/kotlin/p/kotlin/kotlin-dependencies" }
} else {
gradlePluginPortal()
maven { url "https://maven.pkg.jetbrains.space/kotlin/p/kotlin/kotlin-dependencies" }
}
} }
plugins { plugins {
@@ -23,14 +19,6 @@ pluginManagement {
} }
buildscript { buildscript {
repositories {
if (cacheRedirectorEnabled == 'true') {
maven { url "https://cache-redirector.jetbrains.com/maven.pkg.jetbrains.space/kotlin/p/kotlin/kotlin-dependencies" }
} else {
maven { url "https://maven.pkg.jetbrains.space/kotlin/p/kotlin/kotlin-dependencies" }
}
mavenCentral()
}
def buildGradlePluginVersion = ext["kotlin.build.gradlePlugin.version"] def buildGradlePluginVersion = ext["kotlin.build.gradlePlugin.version"]
dependencies { dependencies {
classpath("org.jetbrains.kotlin:kotlin-build-gradle-plugin:${buildGradlePluginVersion}") classpath("org.jetbrains.kotlin:kotlin-build-gradle-plugin:${buildGradlePluginVersion}")