在 TeamCity metarunner 中传递值

Passing values within a TeamCity metarunner

我有一个整合两个跑步者的 TeamCity 元跑步者。第一个跑步者做了一堆 Powershell 的东西来获得正确的 Octopus 版本来部署,它工作正常。第二个跑步者尝试部署它。

<build-runners>
    <runner name="Get project release for current branch" type="jetbrains_powershell">
    <parameters>
      <param name="jetbrains_powershell_bitness" value="x86" />
      <param name="jetbrains_powershell_execution" value="PS1" />
      <param name="jetbrains_powershell_minVersion" value="4.0" />
      <param name="jetbrains_powershell_script_code"><![CDATA[

#Do some powershell stuff here to get the right release
$ProjectRelease="1.2.3.45"
Write-Output "##teamcity[setParameter name='ProjectRelease' value='$ProjectRelease']"
Start-Sleep -s 10
]]></param>
      <param name="jetbrains_powershell_script_mode" value="CODE" />
      <param name="teamcity.step.mode" value="default" />
    </parameters>
  </runner>
  <runner name="Deploy Project" type="octopus.deploy.release">
    <parameters>
      <param name="octopus_additionalcommandlinearguments" value="--specificmachines=%AgentList%" />
      <param name="octopus_deployto" value="%Octopus.EnvironmentName%" />
      <param name="octopus_host" value="%system.Octopus-prod_ServerUrl%" />
      <param name="octopus_project_name" value="%ProjectName%" />
      <param name="octopus_releasenumber" value="%ProjectRelease%" />
      <param name="octopus_version" value="3.0+" />
      <param name="octopus_waitfordeployments" value="true" />
      <param name="secure:octopus_apikey" value="zxx318ab49dce685b0ae65d94a963ff326672f51fb87c685575c3b6ed4f6eb8a569" />
      <param name="teamcity.step.mode" value="default" />
    </parameters>
  </runner>
</build-runners>

所以您可以看到 %ProjectRelease% 设置为 1.2.3.45,然后可以在后续构建步骤中使用此值 - 一切都很好。但是对于第二名,在线:

<param name="octopus_releasenumber" value="%ProjectRelease%" />

%ProjectRelease% 仍然等于默认值("To be populated" 而不是“1.2.3.45”)。如何将此值传递给 Deploy Project runner?

好的,所以我找到了解决这个问题的方法,但它有点老套。

通过将 ProjectRelease 命名为 env.ProjectRelease(并且不要忘记将其添加为参数)它变成了一个实时更新的环境参数,因此会起作用。

显然是行:

Write-Output "##teamcity[setParameter name='ProjectRelease' value='$ProjectRelease']"

...直到整个脚本完成后才设置参数。如果有比这更优雅的解决方案,请告诉我!

您应该能够在 xml 中为整个 metarunner 设置参数。

例如:

<?xml version="1.0" encoding="UTF-8"?>
    <meta-runner name="YourMetaRunnerName">
      <description>YourMetaRunner Description </description>
      <settings>
        <parameters>
          <!-- meta-runner parameters accessible in all build runners 
below -->
          <param name="ProjectRelease"value="Release.1.2.3.45"/>

然后您将能够在 MetaRunner 中的后续构建运行器中使用这些参数。这应该是一个更封闭的解决方案。