Git 如何在Jenkins管道或多分支管道中获取SCM URL?

Git 如何在Jenkins管道或多分支管道中获取SCM URL?,git,jenkins,branching-and-merging,jenkins-pipeline,Git,Jenkins,Branching And Merging,Jenkins Pipeline,我正在尝试让预构建合并在多分支管道中工作,我希望避免在管道脚本中硬编码git url 似乎scm步骤必须以某种方式存储url,但我不知道如何访问它。您是对的,scm对象确实包含您需要的信息 在管道项目(或多分支管道项目)中将git用作源代码管理时,scm全局变量将是的实例。这意味着'scm.getUserRemoteConfigs()'将返回实例列表。这些实例具有git remote的名称、url和refspec。您可以迭代该列表以查找匹配的远程服务器,或者如果您确定只有一个url,则只使用第一

我正在尝试让预构建合并在多分支管道中工作,我希望避免在管道脚本中硬编码git url


似乎scm步骤必须以某种方式存储url,但我不知道如何访问它。

您是对的,
scm
对象确实包含您需要的信息

在管道项目(或多分支管道项目)中将git用作源代码管理时,
scm
全局变量将是的实例。这意味着'scm.getUserRemoteConfigs()'将返回实例列表。这些实例具有git remote的名称、url和refspec。您可以迭代该列表以查找匹配的远程服务器,或者如果您确定只有一个url,则只使用第一个远程服务器

def scmUrl = scm.getUserRemoteConfigs()[0].getUrl()
笔记
  • RejectedAccessException-getUserRemoteConfigs和
    getUrl
    方法都将抛出
    org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException
    ,直到您在“管理Jenkins->过程中脚本批准”下手动批准它们。我发现的唯一方法是尝试运行脚本,让它抛出一个访问异常,批准导致异常的一个方法,然后对每个方法重复,直到不再抛出访问异常。幸运的是,该设置是服务器范围的,因此每个jenkins控制器只需执行一次,而不是每个管道作业

  • GitHub-在使用源于GitHub的多分支管道进行测试时,
    getUserRemoteConfigs
    返回两个UserRemoteConfig实例,一个用于常规分支,另一个用于请求。它们有相同的url,所以没什么大不了的,但要记住一些东西。例如,在使用基于HTTPS的连接的项目中:

    echo scm.getUserRemoteConfigs()
    
    "[
        +refs/heads/*:refs/remotes/origin/* => https://github.com/bitwiseman/project.git (origin),
        +refs/pull/*/head:refs/remotes/origin/pr/* => https://github.com/bitwiseman/project.git (origin)
    ]"
    

受@BitwiseMan回复中的一条评论的启发,我找到了一种(黑客)方法,可以在不被拒绝的情况下获取URL:

checkout scm
def url = sh(returnStdout: true, script: 'git config remote.origin.url').trim()

请注意,必须在
签出scm
后执行此操作。基本上,您必须在一个签出的git存储库中(即其中包含
.git/config
文件)

谢谢,这正是我要找的。您的回答还让我意识到,通过解析
.git/config
文件,可以使用url。这有助于避免RejectedAccessException问题,但会增加构建脚本的复杂性。jenkins从哪里获得https URL
git remote-v
按预期输出SSH URL。我很失望像子模块更新这样的琐碎事情需要巨大的解决办法。Multibranch pipeline在黄金时段根本没有做好准备……在我写这篇文章的时候,在我的Jenkins实例中,“批准的签名”所需信息如下:
method hudson.plugins.git.GitSCM getUserRemoteConfigs
method hudson.plugins.git.UserRemoteConfig getUrl
如果您像我一样来这里寻找subversion的解决方案,请使用
scm.getLocations()[0].getUrl()
。这很有效。在我的例子中,我使用它来避免在maven项目的pom.xml中配置url。我想说,以这种方式自动发现url比在maven项目中维护url要简单得多(如果url是错误的,可能会出现令人困惑的错误)。还可以捕获“checkout scm”的输出,如图所示:如果您使用它,它将在Windows下通过将“sh”替换为“powershell”来工作。