如何使用Jenkins Pipeline检查Pull-Request?

12

我想构建一个集成多个代码库的流水线。

总体思路:

  1. 提供分支名称作为输入。
  2. 使用 GitHub-API 查找跨多个项目创建的从该名称分支创建的拉取请求。
  3. 从多个代码库中进行(浅)克隆,检出指定的拉取请求。

请注意,我并尝试从拉取请求本身触发构建。 触发作业只是一个普通的流水线脚本。 因此,在我这种情况下,checkout scm 不适用。 能够从拉取请求中触发会很好。 Jenkins 的许多多分支插件都不能帮我解决问题,因为它们假设只有一个代码库参与构建。

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

如何才能直接使用 Pipeline 的 checkout 方法来检出一个拉取请求呢?

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

4个回答

7
原来可以通过在checkout配置对象上设置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的Pipeline Syntax Snippet Generator,选择名为“checkout: Check out from version control”的示例步骤,选择Git作为SCM,在“Additional Behaviours”下点击“Add”以查看可能性列表。例如,添加名为“Calculate changelog against a specific branch”的行为,这样您就可以设置PR的源分支和目标分支,从而相应地生成变更集(即哪些文件已更改,这可以在管道步骤中使用条件)。 - dlauzon

4

基于这份文档关于获取pull request的内容。

假设你将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代理上出现分离的HEAD
干杯!

4

如果你正在使用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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接