【发布时间】:2016-11-10 07:59:05
【问题描述】:
我正在尝试让预构建合并在多分支管道中工作,并且我希望避免在我的管道脚本中对 git url 进行硬编码。
似乎 scm 步骤必须以某种方式存储 url,但我不知道如何访问它。
【问题讨论】:
标签: git jenkins branching-and-merging jenkins-pipeline
我正在尝试让预构建合并在多分支管道中工作,并且我希望避免在我的管道脚本中对 git url 进行硬编码。
似乎 scm 步骤必须以某种方式存储 url,但我不知道如何访问它。
【问题讨论】:
标签: git jenkins branching-and-merging jenkins-pipeline
你是对的,scm 对象确实有你需要的信息。
当在管道项目(或多分支管道项目)中使用 git 作为源代码控制时,scm 全局变量将是 GitSCM 的一个实例。这意味着`scm.getUserRemoteConfigs()' 将返回UserRemoteConfig 实例的列表。这些实例具有 git 远程的名称、url 和 refspec。您可以遍历该列表以找到匹配的遥控器,或者如果您确定只有一个 url,则只使用第一个。
def scmUrl = scm.getUserRemoteConfigs()[0].getUrl()
RejectedAccessException - getUserRemoteConfigs 和 getUrl 方法都将抛出 org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException,直到您在“管理 Jenkins -> 进程内脚本批准”下手动批准它们。我发现这样做的唯一方法是尝试运行脚本,让它抛出访问异常,批准导致异常的一个方法,然后对每个方法重复,直到不再抛出访问异常。令人高兴的是,该设置是服务器范围的,因此您只需为每个 jenkins 控制器执行一次,而不是为每个管道作业执行此操作。
GitHub - 在使用源自 GitHub 的多分支管道进行测试时,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)
]"
【讨论】:
.git/config 文件可以获得该网址。这样做的好处是避免了 RejectedAccessException 问题,但增加了构建脚本的复杂性。
git remote -v 按预期输出 SSH URL。我对子模块更新等琐碎的事情需要巨大的解决方法感到相当失望。多分支管道根本没有准备好迎接黄金时段......
method hudson.plugins.git.GitSCM getUserRemoteConfigsmethod hudson.plugins.git.UserRemoteConfig getUrl
scm.getLocations()[0].getURL()。 github.com/jenkinsci/subversion-plugin/blob/master/src/main/…
受@BitwiseMan 回答的评论的启发,我找到了一种(hacky)方法来获取没有 RejectedAccessException 的 URL:
checkout scm
def url = sh(returnStdout: true, script: 'git config remote.origin.url').trim()
请注意,必须在checkout scm 之后进行。基本上,您必须在一个签出的 git 存储库中(即其中有 .git/config 文件)
【讨论】: