如何在Jenkins管道或Multibranch管道中获取SCM URL?

时间:2016-07-07 20:46:13

标签: git jenkins branching-and-merging jenkins-pipeline

我试图让prebuild merge在multibranch管道中工作,我想避免在我的管道脚本中硬编码git url。

似乎scm step必须以某种方式存储url,但我无法弄清楚如何访问它。

2 个答案:

答案 0 :(得分:20)

你是对的,scm对象确实拥有你需要的信息。

在Pipeline项目(或Multibranch Pipeline项目)中使用git作为源控件时,scm全局变量将是GitSCM的实例。这意味着`scm.getUserRemoteConfigs()'将返回UserRemoteConfig个实例的列表。这些实例具有git remote的名称,url和refspec。您可以遍历该列表以查找匹配的遥控器,或者如果您确定只有一个网址,则可以选择第一个。

def scmUrl = scm.getUserRemoteConfigs()[0].getUrl()

注意

  • RejectedAccessException - 在{Manage Jenkins - > In下,getUserRemoteConfigsgetUrl方法都会抛出org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException,直到您手动批准它们为止-process Script Approval“。我发现这样做的唯一方法是尝试运行脚本,让它抛出访问异常,批准导致异常的一个方法,并重复每个方法,直到不再引发访问异常。令人高兴的是,该设置是服务器范围的,因此每个jenkins控制器只需执行一次,而不是每个管道作业。

  • GitHub - 在使用 GitHub -sourced多分支管道进行测试时,getUserRemoteConfigs返回了两个UserRemoteConfig实例,一个用于常规分支,另一个用于拉要求。这些都有相同的网址,所以没什么大不了的,但要记住一些事情。例如,在使用基于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)
    ]"
    

答案 1 :(得分:17)

受到@BitwiseMan回答的评论的启发,我找到了一种(hacky)方法来获取没有RejectedAccessException的URL:

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

请注意,必须在checkout scm之后完成。基本上,您必须在签出的git存储库中(即其中包含.git/config文件)

相关问题