如何从GitHub拉取请求触发Jenkins 2.0流水线作业

32
看起来GitHubPullRequestBuilder与Jenkins v2.0管道作业不兼容。
如何配置管道作业以从GitHub pull request事件触发?关于此主题的文档很少,我找不到任何示例。还是更好地在GitHub中创建web-hook以在PR事件上触发管道作业?
4个回答

47

我曾经遇到了类似的问题。这是解决方法:

前置条件

  • Jenkins ver. 2+ (我使用的是 Jenkins 2.60)
  • Github(或 Github 企业版)账户
  • 你的 Github 和 Jenkins 必须能够相互通信。

在 Github 上

  1. 创建一个具有相关权限的Github个人访问令牌(PAT)。
  2. 对于你的 repo,创建一个 webhook:
    • URL 设置为 YourJenkinsURL/github-webhook/
    • 选择“让我选择单独的事件”,并勾选“拉取请求”
  3. 在你的 repo 根目录下添加一个 Jenkinsfile。为了测试目的,你可以将内容设置为如下的基本示例:
    pipeline {
        agent any
        stages {
            stage('Test') {
                steps {
                    echo 'Hello World ...'
                }
            }
        }
    }

在 Jenkins 上

  1. 安装 GitHub Pull Request Builder 插件。(你还需要安装“Github”插件,但通常作为 Jenkins ver 2+ 的一部分自动安装)
  2. Jenkins - 凭据:
    • 将 github 个人访问令牌(PAT)添加为“秘密文本”凭据。
    • 将 github 用户名和密码添加为“用户名 - 密码”凭据。
  3. 管理 Jenkins - 系统配置:
    • Github - Github 服务器:这是 Github 插件的一部分。添加一个 Github 服务器。“API URL”默认为 https://api.github.com。如果你使用的是企业版 Github,请替换成企业版 Github URL,后面加上 /api/v3。选择 PAT 选项作为凭据。测试连接。“管理挂钩”被勾选。
  4. GitHub Pull Request Builder:将“GitHub Server API URL”设置为Github Server部分指定的相同网址。将“Shared Secret”留空。设置凭据时,使用“用户名-密码”凭据。测试凭证以确保其正常工作。在我的设置中,“自动管理webhook”已选中。
  5. 流水线任务
    • 使用“Pipeline”选项创建一个新项目。注意:这是基本的Pipeline任务,不是多分支Pipeline。
    • 常规部分:勾选“Github项目” - 项目URL:输入您的github仓库URL
    • 构建触发器:勾选“GitHub Pull Request Builder”
      • 对于“GitHub API凭证”,请选择您在“管理Jenkins - 配置系统”屏幕中为GitHub拉取请求生成器设置的选项
      • 对于管理员列表:添加您的用户名
      • 勾选“使用github hooks进行构建触发”
    • Pipeline:
      1. 选择“从SCM获取Pipeline脚本”。请注意,这假定您的存储库的根文件夹将包含一个“Jenkinsfile”
      2. SCM:选择“Git”
      3. 存储库 - 输入存储库详细信息。对于凭据,请使用“用户名-密码”凭据。
      4. 单击“高级”并添加refspec:+refs/pull/*:refs/remotes/origin/pr/*
      5. 分支 - 应为${sha1}
      6. 脚本路径:默认设置为,保持不变。
      7. 轻量级检出 - 取消勾选此项 (https://github.com/jenkinsci/ghprb-plugin/issues/507)

就这样。您已经全部设置好了。在您的repo的主分支上创建PR现在应该会触发Jenkins Pipeline任务。

一些观察

  • 从github重新发送PR的webhook负载不会触发流水线,但在github上打开一个新PR甚至重新打开已关闭的PR都会触发流水线作业。
  • 在流水线作业配置中,如果您选择“流水线脚本”并将您的流水线脚本粘贴在那里,该作业不会触发!!!

我们不能使用多分支管道来做同样的事情吗?因为我想要操作的分支不是主分支。@Deepak Rao - PasinduJay
构建触发器:检查“GitHub拉取请求构建器”,但我没有看到那个选项。该插件已安装,因为其他未使用Jenkinsfile的项目上存在该选项。有什么想法吗? - edthethird
1
感谢您提供详细和文档完备的答案。这拯救了今天,我认为这应该是被接受的答案。 - Jeet

3
简要来说,流程可以如下所示:
  1. 您需要将管道作为代码编写并保存在名为Jenkinsfile的文件中,该文件位于项目的根目录下。该代码应描述项目如何构建。有关示例,请参见此处:https://jenkins.io/doc/pipeline/examples/

  2. 然后,您应该在Jenkins中创建一个新的“多分支管道项目”项。您应该设置这样的扫描步骤1的存储库。

  3. 现在,每当您在步骤1的存储库上打开新的PR分支时,该分支将被检出,并根据其中包含的Jenkinsfile指令进行构建。如果您想要更多地设置构建和何时进行构建的条件,则可以进行更多的设置。

注:

  1. “多分支管道项目”的示例文档:https://jenkins.io/doc/book/pipeline-as-code/(向下滚动到“多分支管道项目”)

  2. 请注意,当在PR上进行评论后,使插件构建PR无效。有关此问题的讨论在此处:https://github.com/jenkinsci/gitlab-plugin/issues/298。虽然有解决方法(在该讨论中也有描述),但设置起来相当混乱。


2
使用Pipeline与GitHub拉取请求的最简单方式是将脚本放入您的存储库中,名称为Jenkinsfile,然后安装GitHub分支源插件。文档

这只能用于组织成员的 PR,还是也适用于来自外部贡献者的 PR? - elopio
@elopio,该插件具有启用/禁用来自同一存储库以及外部存储库的PR构建选项。虽然不完全符合您的要求,但可能足够接近。 - David Pärsson
1
有一个官方的 jenkinsci/workflow-demo Docker 镜像,可以用来测试 PRs 和 Jenkinsfile。我在想是否可能在 PRs 上有那些漂亮的红色和绿色的检查,这是完全可能的(示例在此):) 这里还有一篇关于多分支工作流的有用文章 - GabLeRoux
2
虽然这确实允许您构建PR分支,但据我所知,没有办法获取旧插件曾经提供的有关PR的信息:https://wiki.jenkins-ci.org/display/JENKINS/GitHub+pull+request+builder+plugin#GitHubpullrequestbuilderplugin-EnvironmentVariables - grahamrhay
@grahamrhay,有一些可比较的信息可用,例如CHANGE_TITLE环境变量。请参阅env文档以获取可用变量。 - Jesse Glick

0

在 GitHub 上生成 Pull request 后自动触发 Jenkins 作业的步骤如下:

  1. 在 GitHub 上创建 Webhook,即 http:///generic-webhook-trigger/invoke
  2. 内容类型:application/json
  3. 选择 Pull Request 作为事件,现在 GitHub 配置部分完成。

Jenkins 作业配置

  1. 在 Jenkins 中下载通用 Webhook 触发器

  2. 在 Jenkins 上进行 Git Hub 配置

Git Hub 配置

7.在 Jenkins 上选择通用 Webhook 触发器 8.Jenkins 上的通用 Webhook 触发器配置并按照第9步操作

9.执行第7步后,Jenkins 作业将会被触发 10.第8步需要从 Pull request Payload 中获取信息 11.在通用 Webhook 触发器中配置分支以从 Pull Request 获取分支详细信息

谢谢


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