29

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

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

有没有办法做到这一点?

4

5 回答 5

10

不是现在,你可以关注这个问题

于 2012-04-04T13:48:56.613 回答
6

我使用的方法是创建一个“部署 :: 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']"
    }
}

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

于 2015-07-03T13:01:29.817 回答
4

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

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

于 2016-01-13T15:48:06.093 回答
2

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

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

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

于 2018-08-10T07:38:46.967 回答
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

于 2014-10-10T17:51:29.260 回答