Skip to content

Commit

Permalink
Cherry pick promotion changes from master
Browse files Browse the repository at this point in the history
  • Loading branch information
blindpirate committed Oct 7, 2022
1 parent 365383d commit ba204dd
Show file tree
Hide file tree
Showing 24 changed files with 414 additions and 114 deletions.
34 changes: 34 additions & 0 deletions .teamcity/src/main/kotlin/common/Jvm.kt
@@ -0,0 +1,34 @@
/*
* Copyright 2022 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package common

interface Jvm {
val version: JvmVersion
val vendor: JvmVendor
}

data class DefaultJvm(
override val version: JvmVersion,
override val vendor: JvmVendor
) : Jvm

object BuildToolBuildJvm : Jvm {
override val version: JvmVersion
get() = JvmVersion.java11
override val vendor: JvmVendor
get() = JvmVendor.openjdk
}
7 changes: 7 additions & 0 deletions .teamcity/src/main/kotlin/common/Os.kt
Expand Up @@ -68,3 +68,10 @@ enum class Os(

fun javaHome(jvmVersion: JvmVersion, vendor: JvmVendor) = "%${name.toLowerCase()}.$jvmVersion.$vendor.64bit%"
}

enum class Arch(val suffix: String, val nameOnLinuxWindows: String, val nameOnMac: String) {
AMD64("64bit", "amd64", "x86_64"),
AARCH64("aarch64", "aarch64", "aarch64");

fun asName() = name.lowercase().toCapitalized()
}
41 changes: 37 additions & 4 deletions .teamcity/src/main/kotlin/common/VersionedSettingsBranch.kt
Expand Up @@ -2,18 +2,51 @@ package common

import jetbrains.buildServer.configs.kotlin.v2019_2.DslContext

data class VersionedSettingsBranch(val branchName: String) {
data class VersionedSettingsBranch(val branchName: String, val enableTriggers: Boolean) {

companion object {
val MASTER = VersionedSettingsBranch("master")
private
const val MASTER_BRANCH = "master"

private
const val RELEASE_BRANCH = "release"

private
const val EXPERIMENTAL_BRANCH = "experimental"

private
val mainBranches = setOf(MASTER_BRANCH, RELEASE_BRANCH)

fun fromDslContext(): VersionedSettingsBranch {
val branch = DslContext.getParameter("Branch")
// TeamCity uses a dummy name when first running the DSL
if (branch.contains("placeholder-1")) {
return MASTER
return VersionedSettingsBranch(MASTER_BRANCH, true)
}
return VersionedSettingsBranch(branch.toLowerCase())
return VersionedSettingsBranch(branch.lowercase(), mainBranches.contains(branch.lowercase()))
}
}

val isMaster: Boolean
get() = branchName == MASTER_BRANCH
val isRelease: Boolean
get() = branchName == RELEASE_BRANCH
val isExperimental: Boolean
get() = branchName == EXPERIMENTAL_BRANCH

fun vcsRootId() = "Gradle${branchName.toCapitalized()}"

fun promoteNightlyTaskName() = nightlyTaskName("promote")
fun prepNightlyTaskName() = nightlyTaskName("prep")

fun promoteMilestoneTaskName(): String = when {
isRelease -> "promoteReleaseMilestone"
else -> "promoteMilestone"
}

private fun nightlyTaskName(prefix: String): String = when {
isMaster -> "${prefix}Nightly"
isRelease -> "${prefix}ReleaseNightly"
else -> "${prefix}PatchReleaseNightly"
}
}
27 changes: 27 additions & 0 deletions .teamcity/src/main/kotlin/common/extensions.kt
Expand Up @@ -36,6 +36,7 @@ import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.script
import jetbrains.buildServer.configs.kotlin.v2019_2.failureConditions.BuildFailureOnText
import jetbrains.buildServer.configs.kotlin.v2019_2.failureConditions.failOnText
import jetbrains.buildServer.configs.kotlin.v2019_2.ui.add
import java.util.Locale

fun BuildSteps.customGradle(init: GradleBuildStep.() -> Unit, custom: GradleBuildStep.() -> Unit): GradleBuildStep =
GradleBuildStep(init)
Expand Down Expand Up @@ -169,3 +170,29 @@ fun Dependencies.compileAllDependency(compileAllId: String) {
artifactRules = "build-receipt.properties => incoming-distributions"
}
}

fun BuildType.paramsForBuildToolBuild(buildJvm: Jvm = BuildToolBuildJvm, os: Os, arch: Arch = Arch.AMD64) {
params {
param("env.BOT_TEAMCITY_GITHUB_TOKEN", "%github.bot-teamcity.token%")
param("env.GRADLE_CACHE_REMOTE_PASSWORD", "%gradle.cache.remote.password%")
param("env.GRADLE_CACHE_REMOTE_URL", "%gradle.cache.remote.url%")
param("env.GRADLE_CACHE_REMOTE_USERNAME", "%gradle.cache.remote.username%")

param("env.JAVA_HOME", javaHome(buildJvm, os, arch))
param("env.GRADLE_OPTS", "-Xmx1536m -XX:MaxPermSize=384m")
param("env.ANDROID_HOME", os.androidHome)
param("env.ANDROID_SDK_ROOT", os.androidHome)
param("env.GRADLE_INTERNAL_REPO_URL", "%gradle.internal.repository.url%")
if (os == Os.MACOS) {
// Use fewer parallel forks on macOs, since the agents are not very powerful.
param("maxParallelForks", "2")
}
if (os == Os.LINUX || os == Os.MACOS) {
param("env.LC_ALL", "en_US.UTF-8")
}
}
}

fun String.toCapitalized() = this.replaceFirstChar { if (it.isLowerCase()) it.titlecase(Locale.getDefault()) else it.toString() }

fun javaHome(jvm: Jvm, os: Os, arch: Arch = Arch.AMD64) = "%${os.name.lowercase()}.${jvm.version}.${jvm.vendor}.${arch.suffix}%"
1 change: 0 additions & 1 deletion .teamcity/src/main/kotlin/configurations/Gradleception.kt
Expand Up @@ -3,7 +3,6 @@ package configurations
import common.Os.LINUX
import common.buildToolGradleParameters
import common.customGradle
import common.gradleWrapper
import common.requiresNotEc2Agent
import jetbrains.buildServer.configs.kotlin.v2019_2.BuildSteps
import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.GradleBuildStep
Expand Down
1 change: 0 additions & 1 deletion .teamcity/src/main/kotlin/configurations/SmokeTests.kt
Expand Up @@ -4,7 +4,6 @@ import common.JvmCategory
import common.Os.LINUX
import common.cleanAndroidUserHome
import common.requiresNotEc2Agent
import jetbrains.buildServer.configs.kotlin.v2019_2.buildFeatures.parallelTests
import model.CIBuildModel
import model.Stage

Expand Down
18 changes: 16 additions & 2 deletions .teamcity/src/main/kotlin/promotion/BasePromotionBuildType.kt
Expand Up @@ -16,7 +16,9 @@

package promotion

import common.BuildToolBuildJvm
import common.Os
import common.paramsForBuildToolBuild
import common.requiresNotEc2Agent
import common.requiresOs
import jetbrains.buildServer.configs.kotlin.v2019_2.AbsoluteId
Expand All @@ -38,9 +40,21 @@ abstract class BasePromotionBuildType(vcsRootId: String, cleanCheckout: Boolean
requiresNotEc2Agent()
}

paramsForBuildToolBuild(BuildToolBuildJvm, Os.LINUX)

params {
param("env.GRADLE_INTERNAL_REPO_URL", "%gradle.internal.repository.url%")
param("env.GRADLE_ENTERPRISE_ACCESS_KEY", "%ge.gradle.org.access.key%;%e.grdev.net.access.key%")
password("env.GRADLE_ENTERPRISE_ACCESS_KEY", "%ge.gradle.org.access.key%;%e.grdev.net.access.key%")
password("env.ORG_GRADLE_PROJECT_botGradleGitHubToken", "%github.bot-gradle.token%")
}

features {
// https://www.jetbrains.com/help/teamcity/shared-resources.html#Viewing+Shared+Resources+Usage
// https://blog.jetbrains.com/teamcity/2013/05/explaining-the-shared-resources-plugin/
// we only allow 1 promotion job running at the same time to avoid website xml conflicts
feature {
type = "JetBrains.SharedResources"
param("locks-param", "WebsiteReleasesXml writeLock")
}
}
}
}
@@ -0,0 +1,71 @@
/*
* Copyright 2019 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package promotion

import common.gradleWrapper
import jetbrains.buildServer.configs.kotlin.v2019_2.BuildSteps
import jetbrains.buildServer.configs.kotlin.v2019_2.RelativeId
import vcsroots.gradlePromotionMaster

abstract class BasePublishGradleDistribution(
// The branch to be promoted
val promotedBranch: String,
val prepTask: String,
val triggerName: String,
val gitUserName: String = "bot-teamcity",
val gitUserEmail: String = "bot-teamcity@gradle.com",
val extraParameters: String = "",
vcsRootId: String = gradlePromotionMaster,
cleanCheckout: Boolean = true
) : BasePromotionBuildType(vcsRootId, cleanCheckout) {

init {
artifactRules = """
**/build/git-checkout/subprojects/base-services/build/generated-resources/build-receipt/org/gradle/build-receipt.properties
**/build/distributions/*.zip => promote-build-distributions
**/build/website-checkout/data/releases.xml
**/build/git-checkout/build/reports/integTest/** => distribution-tests
**/smoke-tests/build/reports/tests/** => post-smoke-tests
**/build/version-info.properties => version-info.properties
""".trimIndent()

dependencies {
snapshot(RelativeId("Check_Stage_${this@BasePublishGradleDistribution.triggerName}_Trigger")) {
synchronizeRevisions = false
}
}

steps {
buildStep(
this@BasePublishGradleDistribution.extraParameters,
this@BasePublishGradleDistribution.gitUserName,
this@BasePublishGradleDistribution.gitUserEmail,
this@BasePublishGradleDistribution.triggerName,
this@BasePublishGradleDistribution.prepTask,
"checkNeedToPromote"
)
}
}
}

fun BuildSteps.buildStep(extraParameters: String, gitUserName: String, gitUserEmail: String, triggerName: String, prepTask: String, stepTask: String) {
gradleWrapper {
name = "Promote"
tasks = "$prepTask $stepTask"
gradleParams = """-PcommitId=%dep.${RelativeId("Check_Stage_${triggerName}_Trigger")}.build.vcs.number% $extraParameters "-PgitUserName=$gitUserName" "-PgitUserEmail=$gitUserEmail" %additional.gradle.parameters% """
}
}
12 changes: 10 additions & 2 deletions .teamcity/src/main/kotlin/promotion/PromotionProject.kt
@@ -1,6 +1,9 @@
package promotion

import common.BuildToolBuildJvm
import common.Os
import common.VersionedSettingsBranch
import common.javaHome
import jetbrains.buildServer.configs.kotlin.v2019_2.Project

class PromotionProject(branch: VersionedSettingsBranch) : Project({
Expand All @@ -10,10 +13,13 @@ class PromotionProject(branch: VersionedSettingsBranch) : Project({
buildType(SanityCheck)
buildType(PublishNightlySnapshot(branch))
buildType(PublishNightlySnapshotFromQuickFeedback(branch))
buildType(PublishNightlySnapshotFromQuickFeedbackStepCheckReady(branch))
buildType(PublishNightlySnapshotFromQuickFeedbackStepUpload(branch))
buildType(PublishNightlySnapshotFromQuickFeedbackStepPromote(branch))
buildType(PublishBranchSnapshotFromQuickFeedback)
buildType(PublishMilestone(branch))

if (branch == VersionedSettingsBranch.MASTER) {
if (branch.isMaster) {
buildType(StartReleaseCycle)
buildType(StartReleaseCycleTest)
} else {
Expand All @@ -28,10 +34,12 @@ class PromotionProject(branch: VersionedSettingsBranch) : Project({
password("env.DOTCOM_DEV_DOCS_AWS_SECRET_KEY", "%dotcomDevDocsAwsSecretKey%")
param("env.DOTCOM_DEV_DOCS_AWS_ACCESS_KEY", "AKIAX5VJCER2X7DPYFXF")
password("env.ORG_GRADLE_PROJECT_sdkmanToken", "%sdkmanToken%")
param("env.JAVA_HOME", "%linux.java11.openjdk.64bit%")
param("env.JAVA_HOME", javaHome(BuildToolBuildJvm, Os.LINUX))
param("env.ORG_GRADLE_PROJECT_artifactoryUserName", "%gradle.internal.repository.build-tool.publish.username%")
password("env.ORG_GRADLE_PROJECT_infrastructureEmailPwd", "%infrastructureEmailPwd%")
param("env.ORG_GRADLE_PROJECT_sdkmanKey", "8ed1a771bc236c287ad93c699bfdd2d7")
param("env.PGP_SIGNING_KEY", "%pgpSigningKey%")
param("env.PGP_SIGNING_KEY_PASSPHRASE", "%pgpSigningPassphrase%")
}

buildTypesOrder = arrayListOf(
Expand Down
Expand Up @@ -17,12 +17,14 @@
package promotion

import jetbrains.buildServer.configs.kotlin.v2019_2.ParameterDisplay
import jetbrains.buildServer.configs.kotlin.v2019_2.RelativeId
import vcsroots.gradlePromotionBranches

object PublishBranchSnapshotFromQuickFeedback : PublishGradleDistribution(
object PublishBranchSnapshotFromQuickFeedback : PublishGradleDistributionFullBuild(
promotedBranch = "%branch.to.promote%",
triggerName = "QuickFeedback",
task = "promoteSnapshot",
prepTask = "prepSnapshot",
promoteTask = "promoteSnapshot",
extraParameters = "-PpromotedBranch=%branch.qualifier% ",
vcsRootId = gradlePromotionBranches
) {
Expand All @@ -34,7 +36,7 @@ object PublishBranchSnapshotFromQuickFeedback : PublishGradleDistribution(
val triggerName = this.triggerName

params {
param("branch.qualifier", "%dep.Gradle_Master_Check_Stage_${triggerName}_Trigger.teamcity.build.branch%")
param("branch.qualifier", "%dep.${RelativeId("Check_Stage_${triggerName}_Trigger")}.teamcity.build.branch%")
text(
"branch.to.promote",
"%branch.qualifier%",
Expand Down
71 changes: 0 additions & 71 deletions .teamcity/src/main/kotlin/promotion/PublishGradleDistribution.kt

This file was deleted.

0 comments on commit ba204dd

Please sign in to comment.