【问题标题】:Trigger option to set specific build parameters?触发选项来设置特定的构建参数?
【发布时间】:2012-04-17 23:16:05
【问题描述】:

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

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

有没有办法做到这一点?

【问题讨论】:

    标签: teamcity teamcity-7.0


    【解决方案1】:

    暂时没有,你可以关注this issue

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 漂亮的小powershell suff。但这不能成为 JetBrains 人员在 Teamcity 本身中没有此功能的借口。
      【解决方案3】:

      我遇到了同样的问题,并投票支持 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 个不同的项目中使用构建配置进行测试:我希望“触发器”标签提供有关祖先项目的信息。如果有人能做这个测试就好了。

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

      【讨论】:

      • 显然,在自动构建触发上设置自定义参数的内置功能将在下一个版本中出现(在“仅”保留 12 年后)。同时,您的解决方案确实有很大帮助!谢啦。确实是非常巧妙的解决方法。
      【解决方案4】:

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

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

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

      【讨论】:

        【解决方案5】:

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

        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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-04-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多