49

我正在为我们所有的项目定义一个通用的构建模板——我把它放在“根项目”级别(感谢 TeamCity 8 的这个新功能)。我们的一些项目会创建一个安装程序,该安装程序需要由运行 powershell 脚本的单独“构建步骤”生成。但是,我们的一些项目没有创建这个安装程序,因此不需要这个额外的构建步骤。

有没有办法根据构建参数有条件地执行构建步骤?我认为也许可以在这里利用“禁用构建步骤”功能,但我看不到通过参数定义步骤的启用/禁用状态的方法。

当然,我可以将此条件烘焙到执行安装程序生成的构建步骤中,但如果可以从 teamcity 内部处理它会更干净。

4

4 回答 4

17

我在很多场合都需要有条件的构建步骤,但遗憾的是,该功能目前不存在。http://youtrack.jetbrains.com/issue/TW-17939

您没有理由不能拥有许多构建配置使用的模板,然后只需禁用不需要创建安装程序的构建配置/项目中的构建步骤。在单个构建配置中禁用该步骤不会影响它所基于的父模板。

不像在 TC 中内置运行时/动态方法那样整洁,但我有时会使用它。我已经完成了 iwo 的建议。

于 2014-07-02T22:20:31.653 回答
11

似乎 TC 不支持在他们的级别执行条件运行器步骤,除了执行策略(仅当构建状态成功,如果所有先前的步骤成功完成,即使某些先前的步骤总是失败),但这不是你想要的。

因此,您似乎需要为您的安装程序生成器 powershell 构建步骤提供一个自定义系统构建参数,例如 system.Generate 这应该是一个布尔值(您可以将其隐藏、提示、基于配置参数获取其值等),然后在您的 powershell 运行器中,添加以下内容:

param([int]$Generate)
if ($Generate) {
  Write-Host "generating installer..."
   # call your func()
} else {
   Write-Host "skip installer"
}

在您的运行器配置中,添加 -Generate %system.Generate% 作为脚本参数(小心,而不是额外的命令参数!)。%system.Generate% 应根据其运行时值扩展为 1 或 0。

于 2013-09-14T10:38:12.577 回答
4

从 2020.1 开始,现在似乎支持此功能。

请参阅https://www.jetbrains.com/help/teamcity/what-s-new-in-teamcity-2020-1.html#WhatsNewinTeamCity2020.1-Conditionalbuildsteps

现在,您可以使用新的执行条件对构建步骤进行精细控制。运行构建时,只有在当前运行中满足您配置的所有先决条件时,TeamCity 才会执行每个步骤。

在高级构建步骤设置中,单击添加条件并为 TeamCity 服务器或代理提供的任何构建参数指定逻辑条件。您可以在示例条件中快速选择,例如:

  • 仅在默认分支中运行该步骤
  • 仅在发布分支中运行该步骤
  • 跳过个人构建中的步骤

或者,创建自定义条件,TeamCity 将自动建议支持的参数和值。提供了广泛的逻辑条件和参数。

于 2020-06-24T10:51:01.890 回答
0

我一直在研究这个用例,因为我有一个非常相似的问题要解决。到目前为止,我发现的最佳解决方案是 fwise 的答案中所述的解决方案 - 在模板中包含您可能需要的所有可能步骤,然后根据具体情况禁用每个项目的不需要的步骤。

因此,在您的情况下,您将在根级别包含“安装程序”构建步骤,但对于继承此模板且没有安装程序的任何项目禁用它。

对于单个可选步骤,这感觉是一种很好的方法,但不可否认,它不能很好地扩展到具有许多可选步骤的大型复杂模板。

我从这里的 TeamCity 文档中选择了这个:

  • 您可以根据需要重新排序构建步骤。请注意,如果您有从模板继承的构建配置,则无法重新排序继承的构建步骤。但是,您可以在任何位置以任何顺序插入自定义构建步骤(非继承),甚至在继承的构建步骤之前或之间。继承的构建步骤只能在原始模板中重新排序。
  • 您可以暂时或永久禁用构建步骤,即使它是从构建配置模板继承的。
于 2016-07-26T19:09:06.243 回答