【问题标题】:How to check out a Pull-Request with Jenkins Pipeline?如何使用 Jenkins Pipeline 查看 Pull-Request?
【发布时间】:2018-08-13 07:37:44
【问题描述】:

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

总体思路:

  1. 提供分支名称作为输入。
  2. 使用 GitHub-API 在多个项目中查找 Pull-Request,这些项目是从具有该名称的分支创建的。
  3. 从多个存储库创建(浅)克隆,检查指定的 Pull-Request。

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

到目前为止,我大多避免在 sh 步骤中调用 git,因为这会使我接近丢弃所有 Jenkins-Git-integration。

如果可以的话,我如何使用 Pipeline checkout 方法直接签出 Pull-Request?

这甚至在checkout 方法的范围内吗? 也许,我正在寻找的是直接与 Jenkins 的 JGit 客户端交互,此时我不妨使用sh 命令...

【问题讨论】:

    标签: git jenkins github jenkins-pipeline


    【解决方案1】:

    事实证明,这可以通过在结帐配置对象上设置 refspec 属性来实现:

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

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

    【讨论】:

    • 要查看更多 Jenkins 签出详细信息/选项,您可以使用 Jenkins 的流水线语法片段生成器,选择名为“checkout: Check out from version control”的示例步骤,选择“Git”作为 SCM,在“其他行为”下,单击“添加”以查看可能性列表。例如。添加名为“针对特定分支计算变更日志”的行为,您将能够设置 PR 的源分支和目标分支,因此变更集(即更改了哪些文件,可用于管道步骤中的条件)将相应地生成。
    【解决方案2】:

    如果您使用的是 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】:

      基于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_HEAD
      • LocalBranch 是避免在 Jenkins 代理上使用 detached HEAD 所必需的

      干杯!

      【讨论】:

        【解决方案4】:

        受之前的回复和来源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')
        

        【讨论】:

          猜你喜欢
          • 2017-04-08
          • 1970-01-01
          • 1970-01-01
          • 2021-02-06
          • 1970-01-01
          • 1970-01-01
          • 2016-06-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多