在 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']
然后,在主构建配置中我有:
创建了 RepoBranch
参数并将其设置为 %dep.Setup.RepoBranch%
。
在第二个 repo 的 VCS Root 配置页面中,将 Default branch
设置为 %RepoBranch%
如果我触发构建,快照依赖项工作正常,我看到 RepoBranch
配置参数已在安装构建配置和主构建配置中更新。
然而,第二个仓库的 master
分支仍在被签出并使用,而不是 RepoBranch
参数指定的分支名称。
这似乎是因为构建中实际使用的 teamcity.build.vcs.branch.RepoName
和 teamcity.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。
我有一对 Git 存储库,用于 TeamCity 构建配置。如果在第一个 repo 中触发构建,我需要 运行 一个命令来确定第二个 repo 中的哪个分支应该用于构建(这很重要,需要调用 Git中心 API).
但是,这不能作为构建步骤完成(那时 VCS 分支已经确定),因此主构建配置对另一个构建配置(称为 Setup
) 运行s 命令并修改名为 RepoBranch
的配置参数,方法是将以下内容输出到标准输出(例如):
##teamcity[setParameter name='RepoBranch' value='refs/pull/12/merge']
然后,在主构建配置中我有:
创建了
RepoBranch
参数并将其设置为%dep.Setup.RepoBranch%
。在第二个 repo 的 VCS Root 配置页面中,将
Default branch
设置为%RepoBranch%
如果我触发构建,快照依赖项工作正常,我看到 RepoBranch
配置参数已在安装构建配置和主构建配置中更新。
然而,第二个仓库的 master
分支仍在被签出并使用,而不是 RepoBranch
参数指定的分支名称。
这似乎是因为构建中实际使用的 teamcity.build.vcs.branch.RepoName
和 teamcity.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。