在Jenkins多分支管道作业中使用GitVersion

6
我们使用Jenkins CI,并最近尝试使用GitVersion自动生成SemVer版本号。然而,当将GitVersion与Multibranch Pipeline作业结合使用时(该作业会自动构建给定Git存储库的分支和PR),我们遇到了GitVersion仅支持一个远程的限制(由其NormalizeGitDirectory函数强制执行)。我们遇到的具体错误是:

System.ComponentModel.WarningException:检测到2个远程。在构建服务器上运行时,Git存储库应该只有一个(不多于一个)远程。

我们找到的唯一解决方案(如此处所述)是在SCM检出之后,在任何调用GitVersion的构建步骤之前手动删除“origin1”远程。
bat 'git remote remove origin1'

这种方法可以实现,但感觉像是一种hack,而且可能无法适用于任何fork源的PR。
是否有更好的解决方案?

1
我对Multibranch Pipeline工作流不熟悉,你的git仓库托管在哪里?通常像GitHub / VSTS等提供商会在pulls / <prnumber> / merge下创建refs,这是PR分支与目标分支预合并的结果。这意味着您只需指定pulls / <prnumber> / merge refspec即可导致其获取拉取请求并触发构建。您能否解释一下需要在单个构建中使用两个分支的情况,以便我可以推荐更好的解决方案? - Jake Ginnivan
1
@JakeGinnivan,我们的代码托管在GitHub企业版上。多分支流水线工作的目的是从Git仓库位置自动构建PR和分支。为此,需要添加一个refspec“+refs/pull//head:refs/remotes/origin/pr/”,以及默认的“+refs/heads/:refs/remotes/origin/”。目前看来,Git插件将其处理为两个单独的远程而不是一个具有多个refspecs的远程。 - Nick Jones
1个回答

1
似乎使用拉取请求需要两个远程仓库来跟踪构建结果(至少在我删除上游远程时无法收到拉取请求的结果)。使用当前的4.0.13 beta版本(和.12 beta)我尝试通过直接拉取解决它,但当直接使用时存在一个影响当前版本计算的错误(https://github.com/GitTools/GitVersion/issues/1390)。我的当前解决方法是在之前删除上游远程:
def remotes = bat(script: "@call git remote show", returnStdout: true).trim().readLines()
def hasUpstream = remotes.any { it == "upstream" }
def upstreamURL
if (hasUpstream) {
    echo "Remote 'upstream' detected -- ${env.BRANCH_NAME} is pull request, removing remote for further processing"
    upstreamURL = bat(script: "@call git remote get-url upstream", returnStdout: true).trim()
    bat "git remote remove upstream"
}

然后执行:
def command = "@call ${BuildInfo.GitVersion.Run} /updateassemblyinfo /ensureassemblyinfo /nofetch /verbosity debug"
def output = bat(script: command, returnStdout: true).trim()

在此之前添加它,并在此之后重新添加:
if (hasUpstream) {
    echo "Restoring 'upstream' remote using url: ${upstreamURL}"
    bat "git remote add -t master --tags upstream ${upstreamURL}"
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接