【问题标题】:Teamcity only trigger tags from one branchTeamcity 仅从一个分支触发标签
【发布时间】:2018-07-04 00:34:59
【问题描述】:

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

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

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

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

感谢您的帮助。

【问题讨论】:

  • 使用Branch filter:

标签: git version-control continuous-integration teamcity


【解决方案1】:

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

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

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

直接或多或少地执行您所要求的更难的方法是在任何标签上触发构建,然后包含一个中止的构建步骤,除非发现该标签位于“master分支”。

现在我将“在master 分支上”放在引号中,因为正如 Sklyarenko 先生所指出的那样,它在 git 中如何构建分支和标签的说法有点松散。真的,您会说,您想了解“可从master 访问的提交”的新标签。事实上,您可能的意思是“仅使用第一父级指针从master 可访问”。也就是说

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

如果我们标记C,则无法从master 访问。 (“可到达”是指通过父指针,因此您只能沿着图上的左侧行。)

D 可以从master 访问,但如果事情“正常”完成,DE 的第二个父级。因此,如果我们说“可通过第一父指针访问”,那么 ABEF 符合条件 - 这可能就是您所说的“在 master”上的意思。

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

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

(其中&lt;tagname&gt; 是标签的名称)如果标签符合条件,将返回0

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

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

如果有人标记D,而不是标记ABC(因为您已经有标记C )。在这种情况下,您可以检查是否

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

返回新标签的名称。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-09
      • 2014-09-18
      • 1970-01-01
      • 2014-11-18
      • 2023-03-11
      • 2013-12-21
      • 1970-01-01
      相关资源
      最近更新 更多