如何查看Jenkins管道的Pull-Request?

时间:2018-03-05 15:35:21

标签: git jenkins github jenkins-pipeline

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

总体思路:

  1. 提供分支名称作为输入。
  2. 使用GitHub-API查找从具有该名称的分支创建的多个项目的Pull-Requests。
  3. 从多个存储库中创建(浅)克隆,检出指定的Pull-Requests。
  4. 请注意,我尝试从Pull-Request触发构建本身。 触发Job只是一个普通的Pipeline脚本。 所以checkout scm不适用于我的情况。 我很乐意从Pull-Requests中触发这个。 Jenkins的许多Multi-Branch插件虽然没有帮助我,因为他们只假设一个存储库是构建的一部分。

    到目前为止,我大多避免从git步骤调用sh,因为这会让我接近抛弃任何和所有Jenkins-Git集成。

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

    这是否在checkout方法的范围内? 可能,我正在寻找的是直接与Jenkins的JGit客户端进行交互,此时我也可以使用sh命令......

4 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

基于this doc关于获取拉取请求的信息。

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

lastName

这是怎么回事:

  • 首先,您获取PullRequest的引用
  • 然后您结帐到FETCH_HEAD
  • 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}"]]]) 是避免在Jenkins代理上使用detached HEAD

干杯!

答案 2 :(得分:0)

受先前回复和消息来源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')

答案 3 :(得分:0)

如果您正在使用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}"]]])