代码之家  ›  专栏  ›  技术社区  ›  Thomas Hirsch

如何使用Jenkins管道检查Pull请求?

  •  9
  • Thomas Hirsch  · 技术社区  · 8 年前

    我想构建一个集成多个存储库的管道。

    总体思路:

    1. 提供分支名称作为输入。
    2. 使用GitHub API跨多个项目查找请求,这些项目是从具有该名称的分支创建的。
    3. 从多个存储库进行(浅层)克隆,检查指定的拉取请求。

    请注意,我是 试图从拉请求触发构建本身。 触发作业只是一个普通的管道脚本。 所以 checkout scm 不适用于我的情况。 我很高兴能从Pull请求中触发这个。 Jenkins的许多多分支插件对我没有帮助,因为它们假设只有一个存储库是构建的一部分。

    到目前为止,我基本上没有打电话 git 来自 sh 第二步,因为这将使我接近放弃任何和所有Jenkins Git集成。

    如果有的话,我该如何使用管道 checkout 直接签出请求的方法?

    这是否在 结账 方法 也许,我想要的是直接与Jenkins的JGit客户机进行交互,在这一点上,我也可以使用 上海 命令。。。

    4 回复  |  直到 8 年前
        1
  •  6
  •   Thomas Hirsch    8 年前

    事实证明,可以通过在签出配置对象上设置refspec属性来实现这一点:

    checkoutConfig.with {
        branches = [[ name: 'pr/4711' ]]
        userRemoteConfigs[0].refspec = '+refs/pull/*/head:refs/remotes/origin/pr/*'
    }
    

    另请参见: https://gist.github.com/piscisaureus/3342247

        2
  •  3
  •   Shivankur Pal    7 年前

    如果您正在使用bitbucket:

    checkout([$class: 'GitSCM', branches: [[name: 'FETCH_HEAD']], 
    doGenerateSubmoduleConfigurations: false, extensions: [
                        [$class: 'LocalBranch'],
                        [$class: 'CleanBeforeCheckout']], 
                        submoduleCfg: [], userRemoteConfigs:  [
                        [refspec: "refs/pull-requests/${prNumber}/from:pr/${prNumber}", 
           credentialsId: "${credentialId}",url: "${cloneurl}"]]])
    
        3
  •  1
  •   Yurii Rochniak    7 年前

    基于 this doc 关于获取拉取请求。

    假设您将PR编号作为参数传递:

    checkout([$class: 'GitSCM', branches: [[name: "FETCH_HEAD"]],
      extensions: [[$class: 'LocalBranch']],
      userRemoteConfigs: [[refspec: "+refs/pull/${params.PR_NUMBER}/head:refs/remotes/origin/PR-${params.PR_NUMBER}", url: "https://${GITHUB_TOKEN}@github.com/${YOUR_REPO}"]]])
    

    这里发生了什么:

    • 首先,获取PullRequests的引用
    • 然后签出到FETCH\u HEAD
    • LocalBranch 需要避免 detached HEAD 关于Jenkins探员

    干杯

        4
  •  1
  •   EddardOmeka    7 年前

    灵感来自之前的回应和来源 https://www.git-tower.com/learn/git/faq/detached-head-when-checkout-commit 我编写了一个简单的共享库管道步骤:

    checkoutPullRequest。groovy公司

    Void call(String prNbr, String repo) {
        checkout([$class: 'GitSCM',
            branches: [[name: "FETCH_HEAD"]],
            doGenerateSubmoduleConfigurations: false,
            extensions: [[$class: 'LocalBranch'], [$class: 'RelativeTargetDirectory', relativeTargetDir: "${repo}"]],
            userRemoteConfigs: [[refspec: "+refs/pull/${prNbr}/head:refs/remotes/origin/PR-${prNbr} +refs/heads/master:refs/remotes/origin/master",
                                url: "https://${env.GITHUB_TOKEN}@github.com/githubusername/${repo}"]]
        ])
    }
    

    因此,在管道Jenkinsfile中,您可以使用

    checkoutPullRequest('926', 'appgitrepo')