触发器选项设置特定的构建参数?

时间:2012-04-04 08:53:50

标签: teamcity teamcity-7.0

我正在寻找一种方法将一些特定的构建参数附加到预定的触发器。

我们的想法是不断构建我们产品的调试版本。不过,我们的夜间构建必须是发布版本。我们大多数项目的构建配置完全相同。它甚至已经有一个配置参数。所以我需要的是一个允许为单个构建参数指定覆盖的触发器。这会将构建配置减少一半。

有没有办法实现这个目标?

5 个答案:

答案 0 :(得分:10)

现在不行,您可以关注this issue

答案 1 :(得分:6)

我使用的方法是创建“Deploy :: Dev D1 :: Run all integration tests”构建。然后,我在每个集成服务构建上创建一个构建触发器。

我为集成服务构建创建了一个名为“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']"
    }
}

所以现在我可以通过触发器运行集成测试,当我直接运行它时,它会提示我在哪个环境下运行集成测试。

答案 2 :(得分:2)

我遇到了同样的问题,并投票赞成了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请求访问triggering-build(祖先):

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版本7.X.我使用TeamCity版本9.X执行此操作,并且无法使用以前的版本进行尝试。我不知道我的帖子中提到的REST API调用在以前的版本中是否类似。
  • 在此解决方案中,祖先的构建配置(触发构建的配置)和子构建配置(触发的配置)位于同一项目中。我没有在2个不同的项目中使用构建配置进行测试:我希望“触发器”标签能够提供有关祖先项目的信息。如果有人能做这个测试会很好。

我希望这个解决方案有所帮助!

答案 3 :(得分:1)

我向最后一个构建步骤添加了请求

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%

http://confluence.jetbrains.com/display/TCD8/REST+API

答案 4 :(得分:0)

这不是一般的解决方案,但是在某些情况下(例如,如果您要确定构建是通过计划触发器还是其他方法启动的),解决方法是检查预定义参数teamcity.build.triggeredBy

此参数设置为与构建概述页面上标签“ Triggered by:”旁边显示的字符串相同的字符串。例如,“计划触发器”,“ Git”或用户的全名。 (还有一个teamcity.build.triggeredBy.username参数,但仅在后一种情况下设置)。

此方法的局限性在于,例如,您无法区分为同一构建配置定义的两个单独的计划触发器。但是在那种情况下,您也可以求助于当前时间。