通过 TeamCity 9 中的参数值覆盖依赖项属性

Override dependencies properties by parameters value in TeamCity 9

在 TeamCity 9 中,我有两个构建配置:A、B,它们依赖于 A(快照依赖性)。有时 A 单独开始,有时与 B 连锁。 当 A 被 B 触发时,我想将 A 的 build.number 更改为(例如)0.<build.counter of B>

根据docs

Since TeamCity 9.0, there is a possibility to override the dependencies parameters by redefining them in the dependent build. For example, build configuration A depends on B and B depends on C; A has the ability to change parameters in any of its dependencies using the following format:

reverse.dep.<btID>.<property name>

好的,我在B中创建了配置参数:reverse.dep.A.build.number=0.%build.counter%。 因此,当我启动构建链时,我假设 A 的 build.number 将更改为 0.123(例如,build.counter[ B 的 =31=] 等于 123),但 字符串 0.%build.counter% 已传递给 A,A 使用自己的 属性 build.counter

如何准确传递 TeamCity 参数值?

到 "A" 构建开始时,"B" 构建仍在队列中,因此没有可用的构建编号。 %build.number%参数无法解析,按字面意思传递。

尝试创建 "C" 配置并为其添加快照依赖项(来自 A 和 B)。将 A 和 B 中的版本号格式设置为 %dep.C.system.build.number% 这样您就可以让 A 和 B 共享同一个计数器。

考虑问题
无法使用 reverse.dep. 语法将值传递给依赖项构建。

reverse.dep parameters values are passed down the dependency chain as is.

(来自这里:https://youtrack.jetbrains.com/issue/TW-40772


考虑问题

  1. 创建配置"C"
  2. 从 "A" 使用 "Do not run new build if there is a suitable one" 选项
  3. 添加到 "C" 快照依赖项
  4. 从 "B" 添加到 "C" 快照依赖项 没有 相同的选项。
  5. 通过 reverse.dep.A.use_C_number=true 将参数从 "B" 传递到 "A",因此 "A" 知道要使用哪个计数器。
  6. 在 "A" 的脚本(新建步骤)中使用此参数,例如 (PowerShell):

    # Gets build.number of "C"
    $C_num = "%dep.C.build.number%"
    
    # Gets 'use_C_number' parameter
    $use_C_number = "%use_C_number%"
    
    # Change current build.number if needed
    if ($use_C_number -eq "true") {
      Host-Write "##teamcity[buildNumber '1.2.3.$C_num']"
    }
    

在这种情况下,"C" 将仅由 "B" 而不是 "A" 触发,因为 "A" 将始终使用 "suitable" 构建 "C"("C" 没有附加 VCS 根)。
注意:它应该至少是 "C" 的一个完成版本。
注意:我不确定在所有情况下 "suitable" 构建,因为在 TeamCity 跟踪器中 documentation is not clear for situation with no VCS root attached to build configuration, but it works. In any case there is a question

所以,C的build.counter只有在"B"排队时才会递增。 当 "A" 单独启动时,它使用默认 build.number.

P.S。感谢 Nikita Skvortsov 将我作为解决方案的目标。