在 TeamCity Kotlin DSL 中使用相同的步骤添加多个 BuildType

Prepend multiple BuildTypes with the same steps in TeamCity Kotlin DSL

假设我在一个项目中有多个构建类型:

object Project : Project ({
    // ....
    buildType(foo)
    buildType(bar)
    buildType(baz)
})

object foo() : BuildType ({
    // ....
    steps {
        script {
            scriptContent = "echo foo"
        }
    }
})

foo、bar 和 baz buildTypes 内部差异太大,无法转换为单个 class。

现在我需要在不修改 foo、bar 或 baz 源代码的情况下,在步骤部分前面加上两个额外的步骤:

script {
    scriptContent = "echo step 1"
}
script {
    scriptContent = "echo step 2"
}

所以,当我开始构建 foo 时,它会输出:

step 1
step 2
foo

这样成功实现了:​​

object Project : Project ({
    // ....
    buildType(commonSteps(foo))
    buildType(commonSteps(bar))
    buildType(commonSteps(baz))
})

fun commonSteps(buildType: BuildType): BuildType {
    val newSteps = arrayListOf(scriptStep("echo 123"), scriptStep("echo 321"))
    buildType.steps.items.addAll(0, newSteps)
    return buildType
}

fun scriptStep(scriptContent: String): ScriptBuildStep {
    val step = ScriptBuildStep()
    step.scriptContent = scriptContent
    return step
}