如何在Kotlin for TeamCity的自定义构建步骤中隐藏参数?

时间:2016-10-14 19:02:43

标签: configuration teamcity kotlin dsl

我正在尝试使用配置为Kotlin的代码来设置TeamCity。我正在为buildsteps编写包装器,所以我可以隐藏默认的暴露配置,只显示重要的参数。这样我就可以阻止类的用户更改会导致构建错误的值。

我想要这个:

steps {
    step {
        name = "Restore NuGet Packages"
        type = "jb.nuget.installer"
        param("nuget.path", "%teamcity.tool.NuGet.CommandLine.3.3.0%")        
        param("nuget.updatePackages.mode", "sln")
        param("nuget.use.restore", "restore")
        param("sln.path", "path_to_solution") //parameter here
        param("toolPathSelector", "%teamcity.tool.NuGet.CommandLine.3.3.0%")
}

......就是这样:

MyBuildSteps.buildstep1("path_to_solution")

这是步骤的功能签名:

public final class BuildSteps {
    public final fun step(base: BuildStep?, init: BuildStep.() -> Unit ): Unit { /* compiled code */ }
}

这就是我的尝试:

class MyBuildSteps {
fun restoreNugetPackages(slnPath: String): kotlin.Unit {
    var step: BuildStep = BuildStep {
        name = "Restore NuGet Packages"
        type = "jb.nuget.installer"
    }

    var stepParams: List = Parametrized {
        param("build-file-path", slnPath)
        param("msbuild_version", "14.0")
        param("octopus_octopack_package_version", "1.0.0.%build.number%")
        param("octopus_run_octopack", "true")
        param("run-platform", "x86")
        param("toolsVersion", "14.0")
        param("vs.version", "vs2015")
    }

    return {
        step.name
        step.type
        stepParams
    } //how do I return this?
  }
}

非常感谢任何建议!

1 个答案:

答案 0 :(得分:2)

我假设您要将step {...}封装到带有参数buildstep1的函数slnPath中。

使用此功能签名并将step {...}部分复制粘贴到内部。添加您认为合适的任何参数:

fun BuildSteps.buildstep1(slnPath: String) {
    step {
        name = "Restore NuGet Packages"
        type = "jb.nuget.installer"
        param("nuget.path", "%teamcity.tool.NuGet.CommandLine.3.3.0%")        
        param("nuget.updatePackages.mode", "sln")
        param("nuget.use.restore", "restore")
        param("sln.path", slnPath) // your parameter here
        param("toolPathSelector", "%teamcity.tool.NuGet.CommandLine.3.3.0%")
    }
}

这就是全部!使用它而不是step {...}构造:

steps {
    buildstep1("path_to_solution")
}

此函数可以在配置文件中的任何位置声明(我通常将它们放在底部)或单独的.kts文件中并导入(理论上)。