我试图让prebuild merge在multibranch管道中工作,我想避免在我的管道脚本中硬编码git url。
似乎scm step必须以某种方式存储url,但我无法弄清楚如何访问它。
答案 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下,getUserRemoteConfigs
和getUrl
方法都会抛出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
文件)