我的团队正在使用TeamCity for CI,我对此很陌生。
我们正在使用git标记来帮助进行版本控制,但是我遇到了一个问题。
到目前为止,我设法做到了,因此在TeamCity触发器中创建新标签时会触发该触发器,但是问题是它会触发任何分支和任何触发器。 仅当在特定分支上创建了TAGS时,才有办法使构建触发吗?
我只希望在主分支上创建标签时触发构建。
谢谢您的帮助。
答案 0 :(得分:1)
在Git中作为对象的标签没有绑定到任何特定的分支-它们只是指向某些修订版。标签甚至可以指向那些不属于任何分支(分离的HEAD)的修订。因此,我怀疑TeamCity判断是否在分支中创建 来监视Git标签在技术上具有挑战性。
但是,您可以通过为Git标签建立一些命名规则来解决此问题。例如,在master
分支上创建的标签应称为release/something
或main/something
。在这种情况下,Branch specification
字段中的值可以缩小到+:refs/tags/release/*
。
答案 1 :(得分:1)
通常更容易触发对分支的任何提交的构建,而不是通过这种方式使用标签。例如,在gitflow
中,对master
的唯一提交应该是代表新版本的合并,因此,如果使用该约定,则只需监视master
即可触发构建。
如果要使用标签,实际上有两种选择。
如Yan Sklyarenko所建议的那样,简单的选择是在标签上使用命名约定。当然,有人可能将错误的标签放在错误的位置,这可能是功能(灵活)或错误(错误导致生产构建浪费)。那里有一种“隐藏的魔法”元素。但这至少是一个易于实现的选项。
直接或多或少地执行您要查询的内容的更困难的方法是,触发任何标签上的构建,然后包括一个中止构建的步骤,除非发现该标签位于“ {{1 }}分支”。
现在我用引号将“放在master
分支上,因为正如Sklyarenko先生所指出的,它在git中如何构造分支和标签有些松散。确实,您会说,您想了解“在master
可以到达的提交上”的新标记。实际上,您可能的意思是“仅可使用第一个父级指针从master
进行访问”。就是说
master
如果我们标记 D
/ \
A -- B - E -- F <--(master)
\
C <--(branch)
,则无法从C
到达。 (“可到达”的意思是通过父指针,因此您只能沿着图表的左侧行。)
master
可以到达 D
,但是如果“正常进行”,则master
是D
的第二父级。因此,如果我们说“可通过第一位父母的指针到达”,那么E
,A
,B
和E
就有资格-这可能就是您在“ { {1}}”。
我知道在TC中进行这种检查的唯一方法是执行脚本化的构建步骤。因此,您需要一个git命令来提供信息,此标记是否符合条件?您可以使用:
F
(其中master
是标签的名称),如果标签符合条件,它将返回git rev-list --first-parent master |grep -q $(git rev-parse <tagname>)
。
鉴于您如何使用标签,您可能还需要检查相关标签是否为<tagname>
上的最新标签。也就是说,如果您有
0
如果有人标记master
,而不是标记A -- B -- C -- D <--(master)
^
tag-1.0
,D
或A
,则您可能只想构建 (因为您在B
处已经有标签)。在这种情况下,您可以检查是否
C
返回新标签的名称。