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)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文件)