如果存在针对该 SHA1 的构建,则阻止 TeamCity 构建快进合并到 master

Prevent TeamCity building on fast-forward merge to master if build exists for that SHA1

结合使用 TeamCity 和 git。
目前,TeamCity 设置为“master”作为默认分支。

通常,开发在另一个分支上进行(例如“dev”)- TeamCity 设置为监视“dev”上的更改并自动构建。

如果 DEADBEEF-SOME-SHA 已由 TeamCity 在“dev”上构建并标记为构建 1.2.3.4,我们将 git SHA1 快进合并到“master",TeamCity 仍然执行构建 - 所以我们最终将 DEADBEEF-SOME-SHA 标记为 1.2.3.4 和 1.2.3.5。

据我了解,将“dev”设置为默认分支可以防止这种情况发生。
如果同一 SHA1 的构建已经成功,是否还有其他方法可以阻止 TeamCity 执行构建?

请注意,如果我们直接推送到 master(并且 SHA1 在其他分支上不存在/尚未构建)我仍然希望看到一个构建。

如果可能的话,我想完全在 TeamCity 中实现 - 没有额外的 scripts/writing 文件等 .

您可以查询特定 SHA1 的构建...但是您

所以我会做的是:

  • 在每个作业结束时构建的 sha1 写入专用文件夹(所有代理均可访问)
  • 仅当 sha1 文件不存在时才触发新作业。

也许我漏掉了什么:

如果提交在您的仓库中被标记,在开始新构建之前,您可以检查头部提交是否尚未被标记:

# if you use exclusively lightweigth tags :
git show-refs --tags | grep $(git rev-parse HEAD)
# also check that the tag looks like a build tag, e.g : refs/tags/1.2.3.4
   | grep "refs/tags/[1-9.]*$"

# if you use annotated tags :
git show-refs --tags --dereference | grep $(git rev-parse HEAD)
# the grepped line may look like : refs/tags/1.2.3.4^{}
   | grep -E "refs/tags/[1-9.]*(\^\{\})?$"

如果您只是想限制自动触发构建的分支,请为 VCS 触发器设置分支过滤器:

项目设置 => 触发器 => VCS 触发器(编辑)=> 分支过滤器

将分支过滤器设置为

+:dev 

然后(即使 "master" 是默认分支)构建只会在 dev 上自动触发。仍然可以在其他分支上执行临时构建(假设 VCS root 允许)