diff --git a/.teamcity/CentralDeployment.kt b/.teamcity/CentralDeployment.kt new file mode 100644 index 00000000..f4ca075a --- /dev/null +++ b/.teamcity/CentralDeployment.kt @@ -0,0 +1,162 @@ +/* + * Copyright 2016-2025 JetBrains s.r.o. + * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file. + */ + +import jetbrains.buildServer.configs.kotlin.* +import jetbrains.buildServer.configs.kotlin.buildSteps.gradle +import jetbrains.buildServer.configs.kotlin.triggers.finishBuildTrigger + +fun deploymentProject() = Project { + this.id("Deployment") + this.name = "Deployment" + + params { + param("teamcity.ui.settings.readOnly", "true") + } + + val startDeploymentTask = startDeployment() + + val copyToCentralTask = copyToCentral(startDeploymentTask) + + val deployTasks = buildList { + Platform.entries.forEach { + add(deployToCentral(it, startDeploymentTask)) + } + } + + deployTasks.forEach { deploy -> + copyToCentralTask.dependsOnSnapshot(deploy, onFailure = FailureAction.CANCEL) + } + + buildTypesOrder = listOf(startDeploymentTask, *deployTasks.toTypedArray()) + listOf(copyToCentralTask) +} + +fun Project.startDeployment() = BuildType { + id("StartDeployment") + this.name = "Start Deployment [RUN THIS ONE]" + type = BuildTypeSettings.Type.DEPLOYMENT + + params { + text( + "Version", + "", + display = ParameterDisplay.PROMPT, + allowEmpty = false + ) + select( + "Repository", + "central", + options = listOf("central", "sonatype"), + display = ParameterDisplay.PROMPT + ) + } + + commonConfigure() +}.also { buildType(it) } + +fun Project.deployToCentral(platform: Platform, startDeployment: BuildType) = buildType("DeployCentral", platform) { + type = BuildTypeSettings.Type.DEPLOYMENT + enablePersonalBuilds = false + maxRunningBuilds = 1 + params { + //param(versionSuffixParameter, "${startDeployment.depParamRefs["VERSION"]}") + param(releaseVersionParameter, "${startDeployment.depParamRefs["Version"]}") + param("system.publication_repository", "${startDeployment.depParamRefs["Repository"]}") + } + + vcs { + cleanCheckout = true + } + + val taskNames = buildList { + add("clean") + when (platform) { + Platform.Linux -> { + addAll( + listOf( + "publishAndroidNativeArm32PublicationToCentralRepository", + "publishAndroidNativeArm64PublicationToCentralRepository", + "publishAndroidNativeX64PublicationToCentralRepository", + "publishAndroidNativeX86PublicationToCentralRepository", + "publishLinuxArm64PublicationToCentralRepository", + "publishLinuxX64PublicationToCentralRepository" + ) + ) + } + + Platform.Windows -> { + add("publishMingwX64PublicationToCentralRepository") + } + + Platform.MacOS -> { + addAll( + listOf( + // metadata + "publishKotlinMultiplatformPublicationToCentralRepository", + // web + "publishJsPublicationToCentralRepository", + "publishWasmJsPublicationToCentralRepository", + "publishWasmWasiPublicationToCentralRepository", + // jvm + "publishJvmPublicationToCentralRepository", + // native + "publishIosArm64PublicationToCentralRepository", + "publishIosSimulatorArm64PublicationToCentralRepository", + "publishIosX64PublicationToCentralRepository", + "publishMacosArm64PublicationToCentralRepository", + "publishMacosX64PublicationToCentralRepository", + "publishTvosArm64PublicationToCentralRepository", + "publishTvosSimulatorArm64PublicationToCentralRepository", + "publishTvosX64PublicationToCentralRepository", + "publishWatchosArm32PublicationToCentralRepository", + "publishWatchosArm64PublicationToCentralRepository", + "publishWatchosDeviceArm64PublicationToCentralRepository", + "publishWatchosSimulatorArm64PublicationToCentralRepository", + "publishWatchosX64PublicationToCentralRepository" + ) + ) + } + } + } + + steps { + gradle { + name = "Deploy ${platform.buildTypeName()} Binaries" + jdkHome = "%env.$jdk%" + jvmArgs = "-Xmx1g" + gradleParams = + "--info --stacktrace -P$versionSuffixParameter=WHAT -P$releaseVersionParameter=%$releaseVersionParameter%" + tasks = taskNames.joinToString(" ") + buildFile = "" + gradleWrapperPath = "" + } + } +}.dependsOnSnapshot(startDeployment) + +fun Project.copyToCentral(startDeployment: BuildType) = BuildType { + id("CopyToCentral") + this.name = "Deploy To Central" + type = BuildTypeSettings.Type.DEPLOYMENT + + templates(AbsoluteId("KotlinTools_DeployToCentral")) + + params { + param("DeployVersion", startDeployment.depParamRefs["Version"].ref) + param("ArtifactPrefix", "kotlinx-collections-immutable") + } + + requirements { + doesNotMatch("teamcity.agent.jvm.os.name", "Windows") + } + + dependsOnSnapshot(startDeployment) + + triggers { + finishBuildTrigger { + buildType = "${startDeployment.id}" + successfulOnly = true + branchFilter = "+:*" + } + } +}.also { buildType(it) } diff --git a/.teamcity/additionalConfiguration.kt b/.teamcity/additionalConfiguration.kt index d5043b78..420a088d 100644 --- a/.teamcity/additionalConfiguration.kt +++ b/.teamcity/additionalConfiguration.kt @@ -9,6 +9,7 @@ import jetbrains.buildServer.configs.kotlin.buildFeatures.commitStatusPublisher fun Project.additionalConfiguration() { subProject(benchmarksProject(knownBuilds.buildVersion)) + subProject(deploymentProject()) knownBuilds.buildAll.features { commitStatusPublisher { @@ -21,4 +22,4 @@ fun Project.additionalConfiguration() { } } } -} \ No newline at end of file +} diff --git a/build.gradle.kts b/build.gradle.kts index 88d2c31a..c1e51464 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -9,7 +9,7 @@ buildscript { } plugins { - id("kotlinx.team.infra") version "0.4.0-dev-85" + id("kotlinx.team.infra") version "0.4.0-dev-86" id("org.jetbrains.kotlinx.binary-compatibility-validator") version "0.17.0" } @@ -18,9 +18,14 @@ infra { include(":kotlinx-collections-immutable") libraryRepoUrl = "https://github.com/Kotlin/kotlinx.collections.immutable" - sonatype { - libraryStagingRepoDescription = project.name + if (project.findProperty("publication_repository") == "central") { + central {} + } else { + sonatype { + libraryStagingRepoDescription = project.name + } } + } }