【问题标题】:jenkins pipeline get repository url variable under pipeline script from scmjenkins 管道从 scm 获取管道脚本下的存储库 url 变量
【发布时间】:2018-02-06 19:20:27
【问题描述】:

我正在使用位于我的 git 存储库中的 Jenkins 文件。 我已经使用 scm 中指向我的 jenkinsfile 的管道脚本配置了新作业。我正在尝试在我的 Jenkins 文件管道脚本中使用 git 模块,以便从我的 git repo 中提取我的数据而不配置 pre static 变量,并且只是使用已经配置的 scm 管道脚本下的存储库 URL 的变量我的工作 。 有一种方法可以获取变量 Repository URL 在我的 Jenkins 流水线脚本中不使用参数的情况下从这个插件。

我已经尝试了环境变量 GIT_URL 和其他来自 here 的与 git 相关的东西,但这没有用。

【问题讨论】:

标签: jenkins jenkins-pipeline


【解决方案1】:

您可以在scm 变量中找到有关 scm 的所有信息(如果您使用的是 git,则为 GitSCM 的实例)。 您可以通过这种方式获取存储库 URL

def repositoryUrl = scm.userRemoteConfigs[0].url  

但是,如果您只想签出该存储库,您可以简单地调用 checkout scm 而无需指定其他任何内容。见checkout step

【讨论】:

  • 我收到错误 'org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException' 但如果我必须批准这些方法,这是可行的.. 我仍在尝试寻找另一种方法之前什么都不批准
  • @dsaydon 我想没有批准是不可能的。为什么这对你来说是个问题?顺便说一句,考虑只使用checkout scm
  • 感谢您的帮助@vitalii-vitrenko。我找到了另一种方法(不是最好的方法)。我刚发了
  • 链接已损坏 - 相信现在就是这样:javadoc.jenkins.io/plugin/git/hudson/plugins/git/GitSCM.html
【解决方案2】:

post 我找到了一种方法,您可以使用 checkout scm 来获取 git repo url,如下所示:

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

checkout scm 会提取代码,我想避免这种情况。

所以我找到了另一种方式(不是漂亮的):

node('master'){

  try{
        GIT_REPO_URL = null
        command = "grep -oP '(?<=url>)[^<]+' /var/lib/jenkins/jobs/${JOB_NAME}/config.xml"
        GIT_REPO_URL = sh(returnStdout: true, script: command).trim();
        echo "Detected Git Repo URL: ${GIT_REPO_URL}"  
    }
    catch(err){
        throw err
        error "Colud not find any Git repository for the job ${JOB_NAME}"
  }

}

这对我有用。

【讨论】:

  • 我发现您的提案中的“/var/lib/jenkins”相当可怕。你不能为此使用环境变量 JENKINS_HOME 吗?
  • 不,因为在我的解决方案中,您需要相关工作的config.xml。买为什么可怕?
  • 对詹金斯使用硬编码路径会破坏您的代码,以防詹金斯被移动到其他位置。并且使用变量没有任何成本。
  • @RaúlSalinas-Monteagudo 你说得对! ,这只是一个实现的例子。你可以随心所欲地使用 Jenkins 魔法
【解决方案3】:

可能不是针对您的特定情况的直接解决方案,因为您正在使用 git。

但对于那些仍在使用SubversionSCM 使用 SVN 的人,可以使用获取存储库 URL

def repositoryUrl = scm.locations[0].remote

【讨论】:

    【解决方案4】:

    我相信最好的解决方案就像this 答案。 使用声明性管道的示例:

    pipeline {
      agent any;
      stages  {
        stage('test'){
          steps {
            script {
              def s = checkout scm;
              if      (s.GIT_URL != null) print s.GIT_URL
              else if (s.SVN_URL != null) print s.SVN_URL
              else print s
            }
          }
        }
      }
    }
    

    注意 - 这是一个完整的结帐。如果这不是可取的,我会尝试在结帐参数中处理(like here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-19
      • 2021-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多