在TeamCity

时间:2016-06-15 09:22:55

标签: git teamcity

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

但是,这不能作为构建步骤完成(到那时VCS分支已经确定),因此主构建配置对另一个构建配置(称为Setup)具有快照依赖性。运行该命令并通过将以下内容输出到stdout(例如)来修改名为RepoBranch的配置参数:

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

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:2)

经过大量实验,结果证明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。