有没有一种方法可以在Powershell脚本中访问TeamCity系统属性?

27

我正在尝试使用PowerShell运行程序在TeamCity中设置新的构建配置。然而,我无法找到一种方法来在构建脚本中访问TeamCity系统属性。我看到有提示说这是可能的,但找不到如何实现的文档。

我已尝试使用PowerShell变量语法$variable来访问系统属性。我还打印了内存中的所有变量,但没有发现可用的teamcity变量。

在PowerShell运行程序中是否有可能实现,并且如果可能,需要使用哪种语法来使其工作?


根据标题的要求,答案在这里 - Matthias
4个回答

40

TeamCity会设置环境变量,例如build.number(您可以在TeamCity中查看这些变量的列表)。

在PowerShell中,您可以使用"env"提供程序访问环境变量,例如:

$env:PATH

通过将“.”替换为“_”,可以访问TeamCity变量,因此可以将build.number变量访问为

TeamCity变量通过将"."替换为"_"来访问,因此build.number变量可以访问为

$env:build_number

谢谢,这个可行。我之前一直在尝试让系统属性起作用,但环境变量现在完全满足我的需求。我甚至不确定现在是否需要系统属性了。 - Paul
@Marcus 这个语法正确吗?复制 $env:system_teamcity_build_checkoutDir \ chromedriver.exe $env:system_teamcity_build_tempDir - alansiqueira27
看起来有些参数省略了“system”前缀。例如,%system.build.vcs.number% 实际上是 $env:build_vcs_number - Elfalem
1
这对我没有用。我的PowerShell源代码构建步骤中的$env:build_number始终为空。然而,Teamcity愿意直接将%build.number%替换为我想要的值。 - sirdank
"通过将“.”替换为“_”,可以访问TeamCity变量。这可能会误导人,因为有人会认为他应该在TC的Env变量中输入env.build.number,然后将其称为env.build_number。实际上,您必须将Env变量命名为env.build_number才能将其称为env.build_number。" - magicode118

17
根据TeamCity 文档所述,系统参数会传递给构建脚本运行程序,但并非所有构建脚本运行程序都知道如何处理它们。在使用PowerShell脚本运行程序时,如果使用脚本文件,则它们不会传播到您的脚本中。我想编写一个经过psake优化的构建运行程序来解决这个问题,但同时您可以执行以下操作之一:
  • 可以使用脚本源代码框中可用的参数扩展,将任何TeamCity构建属性明确映射到脚本参数中。例如:.\build.ps1 -someParam:%build.name%

  • 可以使用环境变量,在PowerShell中可以通过$env:NAME_IN_TEAMCITY语法显式访问,例如:$env:TEAMCITY_VERSION,或者循环并推入变量范围。

  • 可以访问TeamCity在构建期间提供的构建属性文件。该文件位于$env:TEAMCITY_BUILD_PROPERTIES_FILE,如果加载XML版本,则很容易循环遍历并将所有内容推入范围(当然,您得到的一切都是字符串)。我发布了一个关于如何做到这一点的gist(https://gist.github.com/piers7/6432985)。或者,如果使用Psake,则修改上面的脚本以返回您可以直接传递给Psake的hashtable。


6
可以做到。以下是如何将系统属性传递到PSake脚本的示例:

这是可能的。以下是将系统属性传递到PSake脚本的示例:

& .\psake.ps1 -parameters @{build_number=%build.number%; personal_build=%build.is.personal%}

如果您不使用Psake,可以像这样定义变量:
$build_number = %build.number%
< p > "%build.number%" 部分将被替换为TeamCity提供的数据。我认为,它只在源代码脚本输入模式下起作用。


谢谢你的答案。如果我在TeamCity中使用脚本输入模式,这将非常有用。 - Paul
我更喜欢这种方式,因为我的脚本可以与Teamcity或其他环境解耦。 - Aleš Roubíček

1
我创建了一个元运行器,它可以将系统参数传递给在PowerShell脚本中声明的参数。它不是完美的(如果您在源代码中放置“@”,它将会出错),但对于我所需要的功能而言它足够了,您可以在这里找到它:https://gist.github.com/anonymous/ef60ada3f48f0fb25093

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接