Teamcity 只触发一个分支的标签

Teamcity only trigger tags from one branch

我的团队在 CI 中使用 TeamCity,我对它有点陌生。

我们正在使用 git 标签来帮助进行版本控制,但是我遇到了一个问题。

到目前为止,我设法做到了,当创建新标签时,TeamCity 触发器中的构建,但问题是它会触发任何分支和任何标签。 有没有办法让构建仅在 SPECIFIC BRANCH 上创建 TAGS 时触发?

我只希望在 master 分支上创建标签时触发构建。

感谢您的帮助。

Git 中作为对象的标签不绑定到任何特定分支 - 它们只是指向某些修订版。标签甚至可以指向那些不属于任何分支的修订(分离的 HEAD)。因此,我怀疑TeamCity判断是否在分支中创建Git标签以进行监控在技术上具有挑战性。

但是,您可以通过为 Git 标签建立一些命名规则来解决这个问题。例如,在 master 分支上创建的标签应称为 release/somethingmain/something。在这种情况下,Branch specification 字段中的值可以缩小到 +:refs/tags/release/*.

为分支的任何提交触发构建通常比以这种方式使用标签更简单。例如,在 gitflow 中,对 master 的唯一提交应该是代表新版本的合并,因此如果您使用该约定,您可以简单地监视 master 以触发构建。

如果你想使用标签,其实有两种选择。

正如 Yan Sklyarenko 所建议的,简单的选择是在标签上使用命名约定。当然,有人可能将错误的标签放在错误的位置,这要么是一个功能(它很灵活),要么是一个错误(错误导致生产构建浪费)。那里有一个 "hidden magic" 的元素。但这至少是一个易于实现的选项。

直接或多或少地做你所要求的更难的方法是在任何标签上触发构建,然后包括一个构建步骤,除非发现该标签是 "on the master branch".

现在我将 "on the master branch" 放在引号中,因为正如 Sklyarenko 先生指出的那样,它对 git 中的分支和标签的结构方式有些松散。真的,您会说,您想了解 "on commits reachable from master" 的新标签。事实上,您的意思可能是 "reachable from master using first-parent pointers only"。也就是说

       D
      / \
A -- B - E -- F <--(master)
 \
  C <--(branch)

如果我们标记 C,则无法从 master 访问。 ("Reachable" 表示通过父指针,因此您只能沿着图表上向左的线。)

D 可从 master 访问,但如果完成 "normally" DE 的第二个父级。因此,如果我们说 "reachable by first-parent pointers",则 ABEF 符合条件 - 这可能就是您所说的 "on master" 的意思。

我知道在 TC 中进行这种检查的唯一方法是使用脚本化构建步骤;那么你需要一个 git 命令来提供信息,这个标签是否符合标准?你可以使用这个:

git rev-list --first-parent master |grep -q $(git rev-parse <tagname>)

(其中 <tagname> 是标签的名称)它将 return 0 当且仅当标签满足条件。

鉴于您使用标签的方式,您可能还想检查相关标签是否是 master 上的最新标签。也就是说,如果你有

A -- B -- C -- D <--(master)
          ^
          tag-1.0

如果有人标记 D,您可能只想构建 ,而不是他们标记 AB 或 [=21] =](因为您在 C 已经有一个标签)。在这种情况下,您可以检查是否

git describe --tags --first-parent --abbrev=0 master

return是您的新标签的名称。