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

Isa*_*nek 12 git branching-and-merging jenkins jenkins-pipeline

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

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

Bit*_*Man 20

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

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

def scmUrl = scm.getUserRemoteConfigs()[0].getUrl()
Run Code Online (Sandbox Code Playgroud)

笔记

  • RejectedAccessException - 在"管理Jenkins - >进程内脚本批准"下,getUserRemoteConfigs和getUrl方法将org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException一直抛出,直到您手动批准它们.我发现这样做的唯一方法是尝试运行脚本,让它抛出访问异常,批准导致异常的一个方法,并重复每个方法,直到不再引发访问异常.令人高兴的是,该设置是服务器范围的,因此每个jenkins控制器只需执行一次,而不是每个管道作业.

  • GitHub - 在使用GitHub -sourced multibranch管道进行测试时,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)
    ]"
    
    Run Code Online (Sandbox Code Playgroud)

  • 你的回答也让我意识到通过解析```.git/config```文件可以获得url.这样可以避免RejectedAccessException问题,但会增加构建脚本的复杂性. (4认同)
  • 在撰写本文时,在我的Jenkins实例上,所需的"Approved Signatures"如下所示:`method hudson.plugins.git.GitSCM getUserRemoteConfigs`` method hudson.plugins.git.UserRemoteConfig getUrl` (4认同)

akh*_*khy 16

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

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

请注意,必须在之后完成checkout scm.基本上,你必须在一个签出的git仓库(即其中有.git/config文件)

  • 也可以捕获“checkout scm”的输出,如下所示:/sf/answers/3399737071/ (2认同)