【问题标题】:How do I get the SCM URL inside a Jenkins Pipeline or Multibranch Pipeline?如何在 Jenkins 流水线或多分支流水线中获取 SCM URL?
【发布时间】:2016-11-10 07:59:05
【问题描述】:

我正在尝试让预构建合并在多分支管道中工作,并且我希望避免在我的管道脚本中对 git url 进行硬编码。

似乎 scm 步骤必须以某种方式存储 url,但我不知道如何访问它。

【问题讨论】:

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


    【解决方案1】:

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

    当在管道项目(或多分支管道项目)中使用 git 作为源代码控制时,scm 全局变量将是 GitSCM 的一个实例。这意味着`scm.getUserRemoteConfigs()' 将返回UserRemoteConfig 实例的列表。这些实例具有 git 远程的名称、url 和 refspec。您可以遍历该列表以找到匹配的遥控器,或者如果您确定只有一个 url,则只使用第一个。

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

    注意事项

    • RejectedAccessException - getUserRemoteConfigsgetUrl 方法都将抛出 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 问题,但增加了构建脚本的复杂性。
    • jenkins 从哪里得到那个 https URL? git remote -v 按预期输出 SSH URL。我对子模块更新等琐碎的事情需要巨大的解决方法感到相当失望。多分支管道根本没有准备好迎接黄金时段......
    • 撰写本文时,在我的 Jenkins 实例上,所需的“已批准签名”如下:method hudson.plugins.git.GitSCM getUserRemoteConfigsmethod hudson.plugins.git.UserRemoteConfig getUrl
    • 如果你像我一样来到这里寻找颠覆的解决方案,请使用scm.getLocations()[0].getURL()github.com/jenkinsci/subversion-plugin/blob/master/src/main/…
    【解决方案2】:

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

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

    请注意,必须在checkout scm 之后进行。基本上,您必须在一个签出的 git 存储库中(即其中有 .git/config 文件)

    【讨论】:

    • 这行得通。在我的情况下,我使用它来避免在 maven 项目的 pom.xml 中配置 url。我想说以这种方式自动发现 url 比必须在 maven 项目中维护 url 更简单(如果错误可能会产生令人困惑的错误)。
    • 还可以捕获“checkout scm”的输出,如下所示:stackoverflow.com/a/48567672/2896799
    • 如果你使用它,将“sh”替换为“powershell”,它在 Windows 下也能正常工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-11
    • 1970-01-01
    • 2021-09-29
    • 2013-02-17
    • 2015-09-09
    • 2021-10-31
    • 2017-12-21
    相关资源
    最近更新 更多