From 939a381f75aac584d9692bd1ef068f7bcbfface6 Mon Sep 17 00:00:00 2001 From: Osip Fatkullin Date: Mon, 23 Dec 2024 12:45:45 +0100 Subject: [PATCH 1/4] Create build-logic module, rename build-settings-logic for consistency --- build-logic/README.md | 22 +++++++++++++++++++ build-logic/build.gradle.kts | 20 +++++++++++++++++ build-logic/settings.gradle.kts | 21 ++++++++++++++++++ .../src/main/kotlin/ktorbuild.base.gradle.kts | 3 +++ .../ktorbuild/internal/VersionCatalogs.kt | 16 ++++++++++++++ .../build.gradle.kts | 5 +++++ .../settings.gradle.kts | 2 +- ...-resolution-management.settings.gradle.kts | 0 ...conventions-develocity.settings.gradle.kts | 0 .../src/main/kotlin/customization.kt | 0 .../src/main/kotlin/execute.kt | 0 .../src/main/kotlin/params.kt | 0 build.gradle.kts | 1 + buildSrc/settings.gradle.kts | 2 +- ktor-test-server/settings.gradle.kts | 2 +- settings.gradle.kts | 3 ++- 16 files changed, 93 insertions(+), 4 deletions(-) create mode 100644 build-logic/README.md create mode 100644 build-logic/build.gradle.kts create mode 100644 build-logic/settings.gradle.kts create mode 100644 build-logic/src/main/kotlin/ktorbuild.base.gradle.kts create mode 100644 build-logic/src/main/kotlin/ktorbuild/internal/VersionCatalogs.kt rename {gradle-settings-conventions => build-settings-logic}/build.gradle.kts (77%) rename {gradle-settings-conventions => build-settings-logic}/settings.gradle.kts (85%) rename {gradle-settings-conventions => build-settings-logic}/src/main/kotlin/conventions-dependency-resolution-management.settings.gradle.kts (100%) rename {gradle-settings-conventions => build-settings-logic}/src/main/kotlin/conventions-develocity.settings.gradle.kts (100%) rename {gradle-settings-conventions => build-settings-logic}/src/main/kotlin/customization.kt (100%) rename {gradle-settings-conventions => build-settings-logic}/src/main/kotlin/execute.kt (100%) rename {gradle-settings-conventions => build-settings-logic}/src/main/kotlin/params.kt (100%) diff --git a/build-logic/README.md b/build-logic/README.md new file mode 100644 index 00000000000..81e834808a0 --- /dev/null +++ b/build-logic/README.md @@ -0,0 +1,22 @@ +# build-logic + +Build logic shared between Ktor subprojects. + +This is similar to `buildSrc`, but uses [composite builds](https://docs.gradle.org/current/userguide/composite_builds.html) +to prevent projects from becoming out-of-date on any change in `buildSrc`. + +This project should be included in the root `settings.gradle.kts`: + +`/settings.gradle.kts` +```kotlin +includeBuild("build-logic") +``` + +`/build.gradle.kts` +```kotlin +plugins { + id("ktorbuild.base") +} +``` + +*The structure of this project is inspired by the structure used in [Dokka](https://github.com/Kotlin/dokka/tree/v2.0.0/build-logic/src/main/kotlin) and [Gradle](https://github.com/gradle/gradle/tree/v8.12.0/build-logic/jvm/src/main/kotlin).* diff --git a/build-logic/build.gradle.kts b/build-logic/build.gradle.kts new file mode 100644 index 00000000000..718c612986a --- /dev/null +++ b/build-logic/build.gradle.kts @@ -0,0 +1,20 @@ +/* + * Copyright 2014-2024 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license. + */ + +plugins { + `kotlin-dsl` +} + +dependencies { + implementation(libs.kotlin.gradlePlugin) + + // A hack to make version catalogs accessible from buildSrc sources + // https://github.com/gradle/gradle/issues/15383#issuecomment-779893192 + implementation(files(libs.javaClass.superclass.protectionDomain.codeSource.location)) +} + +// Should be synced with gradle/gradle-daemon-jvm.properties +kotlin { + jvmToolchain(21) +} diff --git a/build-logic/settings.gradle.kts b/build-logic/settings.gradle.kts new file mode 100644 index 00000000000..6781de068a1 --- /dev/null +++ b/build-logic/settings.gradle.kts @@ -0,0 +1,21 @@ +/* + * Copyright 2014-2024 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license. + */ + +pluginManagement { + includeBuild("../build-settings-logic") +} + +plugins { + id("conventions-dependency-resolution-management") +} + +dependencyResolutionManagement { + // Additional repositories for build-logic + @Suppress("UnstableApiUsage") + repositories { + gradlePluginPortal() + } +} + +rootProject.name = "build-logic" diff --git a/build-logic/src/main/kotlin/ktorbuild.base.gradle.kts b/build-logic/src/main/kotlin/ktorbuild.base.gradle.kts new file mode 100644 index 00000000000..9e90549e7c3 --- /dev/null +++ b/build-logic/src/main/kotlin/ktorbuild.base.gradle.kts @@ -0,0 +1,3 @@ +/* + * Copyright 2014-2024 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license. + */ diff --git a/build-logic/src/main/kotlin/ktorbuild/internal/VersionCatalogs.kt b/build-logic/src/main/kotlin/ktorbuild/internal/VersionCatalogs.kt new file mode 100644 index 00000000000..41c0616bea5 --- /dev/null +++ b/build-logic/src/main/kotlin/ktorbuild/internal/VersionCatalogs.kt @@ -0,0 +1,16 @@ +/* + * Copyright 2014-2024 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license. + */ + +package ktorbuild.internal + +import org.gradle.accessors.dm.LibrariesForLibs +import org.gradle.api.Project +import org.gradle.kotlin.dsl.the + +/** + * Accessor to make version catalog available in build-logic. + * See: https://github.com/gradle/gradle/issues/15383#issuecomment-779893192 + */ +internal val Project.libs: LibrariesForLibs + get() = rootProject.the() diff --git a/gradle-settings-conventions/build.gradle.kts b/build-settings-logic/build.gradle.kts similarity index 77% rename from gradle-settings-conventions/build.gradle.kts rename to build-settings-logic/build.gradle.kts index d5fd0a8bbe0..000686af2f1 100644 --- a/gradle-settings-conventions/build.gradle.kts +++ b/build-settings-logic/build.gradle.kts @@ -15,3 +15,8 @@ dependencies { implementation(libs.develocity) implementation(libs.develocity.commonCustomUserData) } + +// Should be synced with gradle/gradle-daemon-jvm.properties +kotlin { + jvmToolchain(21) +} diff --git a/gradle-settings-conventions/settings.gradle.kts b/build-settings-logic/settings.gradle.kts similarity index 85% rename from gradle-settings-conventions/settings.gradle.kts rename to build-settings-logic/settings.gradle.kts index 3b1dcfb46be..cb55d60d598 100644 --- a/gradle-settings-conventions/settings.gradle.kts +++ b/build-settings-logic/settings.gradle.kts @@ -10,4 +10,4 @@ dependencyResolutionManagement { } } -rootProject.name = "gradle-settings-conventions" +rootProject.name = "build-settings-logic" diff --git a/gradle-settings-conventions/src/main/kotlin/conventions-dependency-resolution-management.settings.gradle.kts b/build-settings-logic/src/main/kotlin/conventions-dependency-resolution-management.settings.gradle.kts similarity index 100% rename from gradle-settings-conventions/src/main/kotlin/conventions-dependency-resolution-management.settings.gradle.kts rename to build-settings-logic/src/main/kotlin/conventions-dependency-resolution-management.settings.gradle.kts diff --git a/gradle-settings-conventions/src/main/kotlin/conventions-develocity.settings.gradle.kts b/build-settings-logic/src/main/kotlin/conventions-develocity.settings.gradle.kts similarity index 100% rename from gradle-settings-conventions/src/main/kotlin/conventions-develocity.settings.gradle.kts rename to build-settings-logic/src/main/kotlin/conventions-develocity.settings.gradle.kts diff --git a/gradle-settings-conventions/src/main/kotlin/customization.kt b/build-settings-logic/src/main/kotlin/customization.kt similarity index 100% rename from gradle-settings-conventions/src/main/kotlin/customization.kt rename to build-settings-logic/src/main/kotlin/customization.kt diff --git a/gradle-settings-conventions/src/main/kotlin/execute.kt b/build-settings-logic/src/main/kotlin/execute.kt similarity index 100% rename from gradle-settings-conventions/src/main/kotlin/execute.kt rename to build-settings-logic/src/main/kotlin/execute.kt diff --git a/gradle-settings-conventions/src/main/kotlin/params.kt b/build-settings-logic/src/main/kotlin/params.kt similarity index 100% rename from gradle-settings-conventions/src/main/kotlin/params.kt rename to build-settings-logic/src/main/kotlin/params.kt diff --git a/build.gradle.kts b/build.gradle.kts index 6f3511658d1..469e2762e29 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -49,6 +49,7 @@ extra["nonDefaultProjectStructure"] = mutableListOf( apply(from = "gradle/compatibility.gradle") plugins { + id("ktorbuild.base") alias(libs.plugins.dokka) apply false alias(libs.plugins.binaryCompatibilityValidator) conventions.gradleDoctor diff --git a/buildSrc/settings.gradle.kts b/buildSrc/settings.gradle.kts index 6461f16acd9..c906077ad91 100644 --- a/buildSrc/settings.gradle.kts +++ b/buildSrc/settings.gradle.kts @@ -3,7 +3,7 @@ */ pluginManagement { - includeBuild("../gradle-settings-conventions") + includeBuild("../build-settings-logic") } plugins { diff --git a/ktor-test-server/settings.gradle.kts b/ktor-test-server/settings.gradle.kts index 735c50882a1..3e474f7face 100644 --- a/ktor-test-server/settings.gradle.kts +++ b/ktor-test-server/settings.gradle.kts @@ -3,7 +3,7 @@ */ pluginManagement { - includeBuild("../gradle-settings-conventions") + includeBuild("../build-settings-logic") } plugins { diff --git a/settings.gradle.kts b/settings.gradle.kts index bb6907f8c5f..38cb1258345 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -3,7 +3,7 @@ */ pluginManagement { - includeBuild("gradle-settings-conventions") + includeBuild("build-settings-logic") } plugins { @@ -14,6 +14,7 @@ plugins { rootProject.name = "ktor" +includeBuild("build-logic") includeBuild("ktor-test-server") include(":ktor-server") From 54fb9dadcf54f9e012b398b87d5138900251012b Mon Sep 17 00:00:00 2001 From: Osip Fatkullin Date: Mon, 23 Dec 2024 15:12:07 +0100 Subject: [PATCH 2/4] Define the project version in base plugin --- .../src/main/kotlin/ktorbuild.base.gradle.kts | 4 +++ .../main/kotlin/ktorbuild/internal/Version.kt | 26 +++++++++++++++++++ build.gradle.kts | 19 +++----------- buildSrc/src/main/kotlin/JvmConfig.kt | 10 +++---- .../build.gradle.kts | 6 ++--- 5 files changed, 40 insertions(+), 25 deletions(-) create mode 100644 build-logic/src/main/kotlin/ktorbuild/internal/Version.kt diff --git a/build-logic/src/main/kotlin/ktorbuild.base.gradle.kts b/build-logic/src/main/kotlin/ktorbuild.base.gradle.kts index 9e90549e7c3..32211a663b3 100644 --- a/build-logic/src/main/kotlin/ktorbuild.base.gradle.kts +++ b/build-logic/src/main/kotlin/ktorbuild.base.gradle.kts @@ -1,3 +1,7 @@ /* * Copyright 2014-2024 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license. */ + +import ktorbuild.internal.resolveVersion + +version = resolveVersion() diff --git a/build-logic/src/main/kotlin/ktorbuild/internal/Version.kt b/build-logic/src/main/kotlin/ktorbuild/internal/Version.kt new file mode 100644 index 00000000000..6440b3bc449 --- /dev/null +++ b/build-logic/src/main/kotlin/ktorbuild/internal/Version.kt @@ -0,0 +1,26 @@ +/* + * Copyright 2014-2024 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license. + */ + +package ktorbuild.internal + +import org.gradle.api.Project + +/** + * Resolves the version for the current project based on the defined properties. + * Properties "releaseVersion" and "eapVersion" are passed on CI as build parameters: + * ``` + * ./gradlew build -PreleaseVersion=3.0.0 + * ``` + */ +internal fun Project.resolveVersion(): String { + val projectVersion = version.toString().removeSuffix("-SNAPSHOT") + val releaseVersion = findProperty("releaseVersion")?.toString() + val eapVersion = findProperty("eapVersion")?.toString() + + return when { + releaseVersion != null -> releaseVersion + eapVersion != null -> "$projectVersion-eap-$eapVersion" + else -> projectVersion + } +} diff --git a/build.gradle.kts b/build.gradle.kts index 469e2762e29..6db284f8241 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -7,23 +7,9 @@ import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension import org.jetbrains.kotlin.gradle.tasks.KotlinCompilationTask import org.jetbrains.kotlin.konan.target.HostManager -val releaseVersion: String? by extra -val eapVersion: String? by extra -val version = (project.version as String).let { if (it.endsWith("-SNAPSHOT")) it.dropLast("-SNAPSHOT".length) else it } - -extra["configuredVersion"] = when { - releaseVersion != null -> releaseVersion - eapVersion != null -> "$version-eap-$eapVersion" - else -> project.version -} - -println("The build version is ${extra["configuredVersion"]}") - extra["globalM2"] = "${project.file("build")}/m2" extra["publishLocal"] = project.hasProperty("publishLocal") -val configuredVersion: String by extra - apply(from = "gradle/verifier.gradle") val internalProjects = listOf( @@ -55,9 +41,12 @@ plugins { conventions.gradleDoctor } +println("Build version: ${project.version}") + subprojects { + apply(plugin = "ktorbuild.base") + group = "io.ktor" - version = configuredVersion extra["hostManager"] = HostManager() setupTrainForSubproject() diff --git a/buildSrc/src/main/kotlin/JvmConfig.kt b/buildSrc/src/main/kotlin/JvmConfig.kt index 351345000f6..2513ebc0c65 100644 --- a/buildSrc/src/main/kotlin/JvmConfig.kt +++ b/buildSrc/src/main/kotlin/JvmConfig.kt @@ -1,5 +1,5 @@ /* - * Copyright 2014-2024 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license. + * Copyright 2014-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license. */ import internal.libs @@ -71,15 +71,13 @@ fun Project.configureJvm() { configureJavaToolchain(compileJdk, testJdk) } - val configuredVersion: String by rootProject.extra tasks.named("jvmJar") { manifest { attributes( - "Implementation-Title" to name, - "Implementation-Version" to configuredVersion + "Implementation-Title" to project.name, + "Implementation-Version" to project.version, + "Automatic-Module-Name" to project.javaModuleName(), ) - val name = project.javaModuleName() - attributes("Automatic-Module-Name" to name) } } } diff --git a/ktor-server/ktor-server-plugins/ktor-server-default-headers/build.gradle.kts b/ktor-server/ktor-server-plugins/ktor-server-default-headers/build.gradle.kts index b1ac14591d0..bbee1c61878 100644 --- a/ktor-server/ktor-server-plugins/ktor-server-default-headers/build.gradle.kts +++ b/ktor-server/ktor-server-plugins/ktor-server-default-headers/build.gradle.kts @@ -2,7 +2,7 @@ * Copyright 2014-2024 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license. */ -import java.time.* +import java.time.Year description = "" @@ -16,10 +16,8 @@ kotlin { } } -val configuredVersion: String by rootProject.extra - val generateKtorVersionFile by tasks.registering { - val ktorVersion = configuredVersion + val ktorVersion = project.version inputs.property("ktor_version", ktorVersion) val year = Year.now().toString() From 329cdb11f2d560041bbdc1b9054d65d834a43089 Mon Sep 17 00:00:00 2001 From: Osip Fatkullin Date: Mon, 23 Dec 2024 12:21:04 +0100 Subject: [PATCH 3/4] Move dokka configuration to a precompiled script plugin --- build-logic/build.gradle.kts | 1 + .../main/kotlin/ktorbuild.dokka.gradle.kts | 26 +++++++++++++++++++ build.gradle.kts | 20 +------------- gradle/libs.versions.toml | 2 +- 4 files changed, 29 insertions(+), 20 deletions(-) create mode 100644 build-logic/src/main/kotlin/ktorbuild.dokka.gradle.kts diff --git a/build-logic/build.gradle.kts b/build-logic/build.gradle.kts index 718c612986a..6b44376cfdd 100644 --- a/build-logic/build.gradle.kts +++ b/build-logic/build.gradle.kts @@ -8,6 +8,7 @@ plugins { dependencies { implementation(libs.kotlin.gradlePlugin) + implementation(libs.dokka.gradlePlugin) // A hack to make version catalogs accessible from buildSrc sources // https://github.com/gradle/gradle/issues/15383#issuecomment-779893192 diff --git a/build-logic/src/main/kotlin/ktorbuild.dokka.gradle.kts b/build-logic/src/main/kotlin/ktorbuild.dokka.gradle.kts new file mode 100644 index 00000000000..86c45d0075b --- /dev/null +++ b/build-logic/src/main/kotlin/ktorbuild.dokka.gradle.kts @@ -0,0 +1,26 @@ +/* + * Copyright 2014-2024 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license. + */ + +import ktorbuild.internal.libs +import org.jetbrains.dokka.gradle.DokkaMultiModuleTask + +plugins { + id("org.jetbrains.dokka") +} + +dependencies { + dokkaPlugin(libs.dokka.plugin.versioning) +} + +if (project == rootProject) { + tasks.withType().configureEach { + val version = project.version + val dokkaOutputDir = "../versions" + val id = "org.jetbrains.dokka.versioning.VersioningPlugin" + val config = """{ "version": "$version", "olderVersionsDir":"$dokkaOutputDir" }""" + + outputDirectory = project.layout.projectDirectory.dir("$dokkaOutputDir/$version") + pluginsMapConfiguration = mapOf(id to config) + } +} diff --git a/build.gradle.kts b/build.gradle.kts index 6db284f8241..cb3f01a7bef 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -2,7 +2,6 @@ * Copyright 2014-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license. */ -import org.jetbrains.dokka.gradle.DokkaMultiModuleTask import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension import org.jetbrains.kotlin.gradle.tasks.KotlinCompilationTask import org.jetbrains.kotlin.konan.target.HostManager @@ -36,7 +35,6 @@ apply(from = "gradle/compatibility.gradle") plugins { id("ktorbuild.base") - alias(libs.plugins.dokka) apply false alias(libs.plugins.binaryCompatibilityValidator) conventions.gradleDoctor } @@ -88,23 +86,7 @@ filterSnapshotTests() fun configureDokka() { allprojects { - plugins.apply("org.jetbrains.dokka") - - val dokkaPlugin by configurations - dependencies { - dokkaPlugin(rootProject.libs.dokka.plugin.versioning) - } - } - - val dokkaOutputDir = "../versions" - - tasks.withType().configureEach { - val id = "org.jetbrains.dokka.versioning.VersioningPlugin" - val config = """{ "version": "$configuredVersion", "olderVersionsDir":"$dokkaOutputDir" }""" - val mapOf = mapOf(id to config) - - outputDirectory.set(file(projectDir.toPath().resolve(dokkaOutputDir).resolve(configuredVersion))) - pluginsMapConfiguration.set(mapOf) + plugins.apply("ktorbuild.dokka") } rootProject.plugins.withType { diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index a375c9fb687..c42e0754f45 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -128,6 +128,7 @@ kotlinx-io-core = { module = "org.jetbrains.kotlinx:kotlinx-io-core", version.re kotlinx-browser = { module = "org.jetbrains.kotlinx:kotlinx-browser", version.ref = "kotlinx-browser" } +dokka-gradlePlugin = { module = "org.jetbrains.dokka:dokka-gradle-plugin", version.ref = "dokka" } dokka-plugin-versioning = { module = "org.jetbrains.dokka:versioning-plugin", version.ref = "dokka" } netty-handler = { module = "io.netty:netty-handler", version.ref = "netty" } @@ -233,7 +234,6 @@ gradleDoctor = { module = "com.osacky.doctor:doctor-plugin", version.ref = "grad [plugins] binaryCompatibilityValidator = { id = "org.jetbrains.kotlinx.binary-compatibility-validator", version.ref = "binaryCompatibilityValidator" } -dokka = { id = "org.jetbrains.dokka", version.ref = "dokka" } kover = { id = "org.jetbrains.kotlinx.kover", version.ref = "kover" } doctor = { id = "com.osacky.doctor", version.ref = "gradleDoctor" } From 81850bd4b09250364d5ba03f0c4a38122ffd0b84 Mon Sep 17 00:00:00 2001 From: Osip Fatkullin Date: Fri, 17 Jan 2025 12:46:05 +0100 Subject: [PATCH 4/4] Define the group in gradle.properties --- build.gradle.kts | 1 - gradle.properties | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index cb3f01a7bef..83407d7185c 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -44,7 +44,6 @@ println("Build version: ${project.version}") subprojects { apply(plugin = "ktorbuild.base") - group = "io.ktor" extra["hostManager"] = HostManager() setupTrainForSubproject() diff --git a/gradle.properties b/gradle.properties index 8219494ec09..de065b41d2b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,6 +6,7 @@ kotlin.code.style=official # config +group=io.ktor version=3.1.0-SNAPSHOT ## Performance