如何基于TeamCity Kotlin DSL中的现有步骤创建自定义构建步骤?

Mar*_*fin 4 teamcity dsl kotlin

我使用TeamCity Kotlin DSL 2018.1来设置构建配置.我的settings.kts文件如下所示:

version = "2018.1"

project {
    buildType {
        id("some-id")
        name = "name"
        steps {
            ant {
                name = "Step1"
                targets = "target1"
                mode = antFile { path = "/some/path" }
                workingDir = "/some/dir"
                jdkHome = "some_jdk"
            }
            ant {
                name = "Step2"
                targets = "target2"
                mode = antFile { path = "/some/path" }
                workingDir = "/some/dir"
                jdkHome = "some_jdk"
            }
            ...
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

它按预期工作,但我想避免一遍又一遍地为每个步骤编写相同的重复参数.

我试着编写函数,它将构造预填充默认值的构建步骤:

fun customAnt(init: AntBuildStep.() -> kotlin.Unit): AntBuildStep {
    val ant_file = AntBuildStep.Mode.AntFile()
    ant_file.path = "/some/path"

    val ant = AntBuildStep()
    ant.mode = ant_file
    ant.workingDir = "/some/dir"
    ant.jdkHome = "some_jdk"
    return ant
}
project {
    buildType {
        id("some-id")
        name = "name"
        steps {
            customAnt {
                name = "Step1"
                targets = "target1"
            }
            customAnt {
                name = "Step2"
                targets = "target2"
            }
            ...
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

它编译但不起作用:TeamCity只是忽略以这种方式定义的构建步骤.

遗憾的是,官方文档不包含有关自定义和扩展DSL的任何信息.可能,我对Kotlin的() -> Unit构造做错了,但是找不到究竟是什么问题.

Mar*_*fin 5

我知道了.

实际上,我很亲密.以下代码正如我所希望的那样工作:

version = "2018.1"

fun BuildSteps.customAnt(init: AntBuildStep.() -> Unit): AntBuildStep {
    val ant_file = AntBuildStep.Mode.AntFile()
    ant_file.path = "/some/path"

    val result = AntBuildStep(init)
    result.mode = ant_file
    result.workingDir = "/some/dir"
    result.jdkHome = "some_jdk"
    step(result)
    return result
}

project {    
    buildType {
        steps {
            customAnt {
                name = "step1"
                targets = "target1"
            }
            customAnt {
                name = "step2"
                targets = "target2"
            }
            ...
        }
    }
}
Run Code Online (Sandbox Code Playgroud)