我正在寻找一种将某些特定构建参数附加到计划触发器的方法。
我们的想法是我们不断构建我们产品的调试版本。不过,我们的夜间构建必须是发布构建。我们大多数项目的构建配置都是完全相同的。它甚至已经有一个配置参数。所以我只需要一个触发器,它允许为单个构建参数指定覆盖。这会将构建配置减少一半以维持。
有没有办法做到这一点?
我正在寻找一种将某些特定构建参数附加到计划触发器的方法。
我们的想法是我们不断构建我们产品的调试版本。不过,我们的夜间构建必须是发布构建。我们大多数项目的构建配置都是完全相同的。它甚至已经有一个配置参数。所以我只需要一个触发器,它允许为单个构建参数指定覆盖。这会将构建配置减少一半以维持。
有没有办法做到这一点?
不是现在,你可以关注这个问题。
我使用的方法是创建一个“部署 :: Dev D1 :: 运行所有集成测试”构建。然后,我在每个集成服务构建上创建一个构建触发器。
我为集成服务构建创建了一个名为“env:OctopusEnvironment”的参数。将值设置为空。我喜欢使用提示和显示:
select display='prompt' label='OctopusEnvironment' data_13='Production' data_12='CI' data_11='Local - Hassan' data_10='Local - Mustafa' description='OctopusEnvironment' data_02='Test T1' data_01='Dev D1' data_04='Local - Taliesin' data_03='Continuous Deployment CI 1' data_06='Local - Paulius' data_05='Local - Ravi' data_08='Local - Venkata' data_07='Local - Marko' data_09='Local - Ivan'
在每个集成服务构建中,我添加了这个 powershell 步骤:
$octopusEnvironment = ($env:OctopusEnvironment).Trim()
Write-Host "Octopus environment = '$octopusEnvironment'"
if ($octopusEnvironment.Length -lt 1) {
Write-Host "Auto detecting octopus environment"
$trigger = '%teamcity.build.triggeredBy%' -split '::'
if ($trigger.Length -gt 2){
$environment = $trigger[1].Trim()
Write-Host "##teamcity[setParameter name='env.OctopusEnvironment' value='$environment']"
}
}
所以现在我可以通过触发器运行集成测试,当我直接运行它时,它会提示我在哪个环境上运行集成测试。
我遇到了同样的问题,并投票支持 Evgeny 提到的问题。正如 sergiussergius 所提到的,我们认为的一个解决方案是在构建步骤序列中添加最后一步,通过使用 REST API 传递自定义构建参数来手动触发下一个构建配置。但在这种情况下,我们丢失了构建链信息。使用 TeamCity 9.x,在 REST API 上尝试一些东西,我可以实现一个解决方案,它可以从触发(子)构建中检索触发(祖先)构建及其参数。我们要做的第一件事是使用 TeamCity 设置的环境变量获取当前构建:
https://<host>/httpAuth/app/rest/builds/number:<env.BUILD_NUMBER>,buildType:(name:<env.TEAMCITY_BUILDCONF_NAME>,project:<env.TEAMCITY_PROJECT_NAME>)
在来自 REST API 的响应中,我们有一个/build/triggered标记,其中包含有关触发器的信息。看起来像这样
<triggered type="unknown" details="##triggeredByBuildType='<triggering-build-configuration-internalId>' triggeredByBuild='<triggering-build-number>'" date="20160105T190642+0700"/>
对我们来说看起来像btxxx。从中,我们可以使用对 REST API 的以下请求访问触发构建(祖先):
https://<host>/httpAuth/app/rest/builds/number:<triggering-build-number>'4,buildType:(internalId:<triggering-build-configuration-internalId>1,project:name:<env.TEAMCITY_PROJECT_NAME>)
从响应中,我们可以获取祖先构建的参数值,并使用以下方法在当前构建中设置它:
echo "##teamcity[setParameter name='env.ENV_AAA' value='aaaaaaaaaa']")
笔记:
我希望这个解决方案可能会有所帮助!
这不是一个通用的解决方案,但在某些情况下(例如,如果您想确定构建是由计划触发器还是其他方法启动),一种解决方法是检查预定义的参数teamcity.build.triggeredBy
。
此参数设置为与构建概述页面上标签“触发者:”旁边显示的相同字符串。例如,“计划触发器”、“Git”或用户的全名。(还有一个teamcity.build.triggeredBy.username
参数,但只在后一种情况下设置)。
这种方法的局限性在于,例如,您无法区分为同一构建配置定义的两个单独的计划触发器。但在这种情况下,您也可以求助于检查当前时间。
我在最后一个构建步骤中添加了请求
curl -i -u "%login%:%pass%" -H "Content-type: text/plain" -X PUT -d "v1" http://tc.server/httpAuth/app/rest/buildTypes/id:%buildConfigurationId%/parameters/env.%SOME_PARAMETER%