在 TeamCity 中通过快照依赖设置 VCS 分支

Setting VCS branch via snapshot dependency in TeamCity

我有一对 Git 存储库,用于 TeamCity 构建配置。如果在第一个 repo 中触发构建,我需要 运行 一个命令来确定第二个 repo 中的哪个分支应该用于构建(这很重要,需要调用 Git中心 API).

但是,这不能作为构建步骤完成(那时 VCS 分支已经确定),因此主构建配置对另一个构建配置(称为 Setup) 运行s 命令并修改名为 RepoBranch 的配置参数,方法是将以下内容输出到标准输出(例如):

##teamcity[setParameter name='RepoBranch' value='refs/pull/12/merge']

然后,在主构建配置中我有:

  1. 创建了 RepoBranch 参数并将其设置为 %dep.Setup.RepoBranch%

  2. 在第二个 repo 的 VCS Root 配置页面中,将 Default branch 设置为 %RepoBranch%

如果我触发构建,快照依赖项工作正常,我看到 RepoBranch 配置参数已在安装构建配置和主构建配置中更新。

然而,第二个仓库的 master 分支仍在被签出并使用,而不是 RepoBranch 参数指定的分支名称。

这似乎是因为构建中实际使用的 teamcity.build.vcs.branch.RepoNameteamcity.git.build.vcs.branch.RepoName 配置参数仍然是 refs/heads/master。这是因为我可能将第二个回购协议的分支规范字段设置为 +:refs/heads/master 吗?如何正确设置?

经过大量实验,事实证明 TeamCity 强制所有具有快照依赖项的构建配置使用完全相同的 VCS 版本。即使初始构建配置不包含您要为其更改分支的 VCS 根也是如此,所以我猜 TeamCity 已经决定默认分支将用于除一个以外的所有 VCS 根这触发了构建。

最后,唯一的解决方案似乎是回到单一的构建配置,然后在开始时添加一个构建步骤,在必要时切换分支(需要客户端检查源)。如果使用 SSH 身份验证,TeamCity SSH agent 构建功能可用于验证必要的 git(或 svn)命令。

考虑到其他构建步骤可能会使用包含分支名称和主要版本的各种 TeamCity 配置参数,初始构建步骤应通过将以下值输出到 stdout 来覆盖这些参数:

// Override all TeamCity parameters which contain the branch name printfn "##teamcity[setParameter name='teamcity.build.vcs.branch.%s' value='%s']" repoName branchName printfn "##teamcity[setParameter name='teamcity.git.build.vcs.branch.%s' value='%s']" repoName branchName // Override all TeamCity parameters which contain the SHA printfn "##teamcity[setParameter name='build.vcs.number.%s' value='%s']" repoName sha printfn "##teamcity[setParameter name='system.build.vcs.number.%s' value='%s']" repoName sha printfn "##teamcity[setParameter name='env.BUILD_VCS_NUMBER_%s' value='%s']" repoName sha

其中 branchName 是在名为 repoName 的回购上切换到的新分支,sha 是该分支头的 SHA。