使用 TeamCity 2020.2.4
构建作业有多个 VCS 根设置,由“源代码”和“实用脚本”组成。
“实用脚本”始终位于同一分支(主分支);但是,“源代码”要么位于 master(又名:默认)要么位于release/### 分支中。
“源代码”根有:
Default branch: refs/heads/master
Branch specification:
+:refs/heads/(master)
+:refs/heads/(release/*)
目前有 2 个版本,一个用于主版本(运行时间较长的版本),一个用于发布版本(执行一系列额外步骤来准备发布)。
最初希望隐藏显示的“master”默认分支,因此遵循 TeamCity 自己的文档(https://www.jetbrains.com/help/teamcity/branch-filter.html#Branch+Filter+Format )这意味着我可以调整分支过滤器:
+:*
-:<default>
(还有一些文章提到这个作为答案,但已经有很多年了)
但是这样做时,最终会出现错误:
Failed to collect changes, error: Builds in default branch are disabled in build configuration
看起来触发器运行得很好,但在手动构建中事情确实出现了问题。
甚至尝试过使用默认+提示参数覆盖
teamcity.build.branch
,但没有这样的运气。
见过将其包装在另一项工作中的情况,但是直接做 TC 所说的应该可能的事情有点hacky。
找到了解决方案,在这里发布以帮助下一个人......
因此,尽管 TeamCity 在版本控制设置中提到了“分支过滤器”的“逻辑分支名称”,但实际上可以提供完整的分支名称。
因此可以使用“refs/heads/master”。这实际上似乎允许 VCS 根之一继续使用它的默认/主,同时允许第二个根的其他选项。
例如:
VCS 根 #1 配置:
Default: refs/heads/master
Spec:
+:refs/heads/(master)
+:refs/heads/(release/*)
VCS 根 #1 配置:
Default: refs/heads/master
Spec: (empty)
当做不同的工作时,分支过滤器会这样设置:
“仅限大师”:
+:refs/heads/master
+:release/*
-:master
“仅发布”:
+:refs/heads/master
+:<default>
+:master
值得注意的是,尽管“master”是默认的,但仍然需要实际指定两者......第一遍可能看起来不直观,但它就是这样 - 并且它有效。
我在 TeamCity v2023.11.4 中得到相同的行为。
“分支过滤器”字段必须包含完整的 git 路径,而不仅仅是逻辑分支名称:
如果您在 VCS 根中有此分支规范:
+:refs/heads/(mybranch)
那么您必须在构建配置的版本控制设置中包含此分支过滤器:
+:mybranch
+:refs/heads/mybranch