使用Jenkins流水线构建GitHub拉取请求

11

这似乎是GH和Jenkins中较为重要但不太被理解和记录的功能之一,这似乎与CI的目的背道而驰...

我正在尝试在Jenkins中设置一个简单的工作流,“当打开拉取请求时启动构建”。我已经浏览了数十篇帖子,其中一些已有数年历史,但仍然没有找到实际可行的解决方案。我正在使用GH 2.15.4和Jenkins 2.89.3,以及GH Pull Request Builder插件。我尝试设置管道任务和自由风格项目,遵循各种“如何”帖子和文档。没有预期的结果,甚至差距很大。我设法让一些功能正常工作,但不是没有进行大量试错实验。这并不让我感到非常满意。Webhooks同样无用,无法完成所需的任务,因为无论如何配置都似乎无法激活Jenkins中的工作。

首先,是否有任何参考或文档可以解释Jenkins自动创建的以下状态检查是什么:

continuous-integration/jenkins/branch

continuous-integration/jenkins/pr-head

continuous-integration/jenkins/pr-merge

显然没有办法删除或编辑这些……它们只是由Jenkins“出现”。我看到过一些讨论,但有些解释彼此矛盾,所以它们可能已经过时、不准确等。我想知道“每个东西的作用”,这样我就知道哪些应该作为PR状态检查的一部分。

任何指针都将不胜感激!


你可以尝试在Jenkins中创建一个日志记录器,监视“org.jenkinsci.plugins.ghprb”,以查看您的拉取请求出了什么问题。 - ecn
2个回答

7
我同意,这个问题很棘手,因为Jenkins及其插件在这些年里发生了许多变化。让我告诉您我是如何完成您所要求的操作的。我将发布所有版本号(大多数是最新版本)。
Jenkins版本: 2.176.1(java -jar /usr/share/jenkins/jenkins.war --version)
插件:
- github 1.29.4 - github-api 1.9 - github-branch-source 2.5.3 - github-pullrequest 0.2.5 - pipeline-github-lib 1.0
此外,我使用Blue Ocean界面,可能会影响一些事情(谁知道呢)。
- blueocean 1.17.0 - blueocean-git-pipeline 1.17.0 - blueocean-github-pipeline 1.17.0
Github Webhooks
首先,为您的系统设置Webhooks。 这是Github Webhooks的好指南 转到您的Github存储库,然后单击“设置”选项卡。然后在左侧菜单中选择“Webhooks”:
我的Jenkins设置的URL是https://jenkinsci.dorian.com。因此,在“有效载荷URL”框中,我放入了https://jenkinsci.dorian.com/github-webhook/ 我将设置保留为“application / json”和“发送所有内容”和“活动”
Webhooks区域有一个方便的“最近交付”部分,可以向您显示您的Webhooks是否到达Jenkins。起初,我的URL不正确,所以旁边有红色的X。现在,它们都是绿色的复选标记。 Github访问令牌 许多指南建议您向Jenkins提供个人访问令牌以与您的存储库通信。要做到这一点,转到右上角的帐户头像,选择“设置” ->“开发人员设置” ->“个人访问令牌” ->“生成令牌”。
在“选择范围”下,如果您只想让它工作,请选择列表中的每个复选框,并为描述输入任何内容。
我选择了:
- repo:status - write:repo_hook - read:repo_hook - admin:org_hook
单击保存,您将看到您的秘密密钥。将其复制到安全的地方(我们很快会用到它)。
现在是Jenkins配置的难点。尝试安装我列出的所有插件。
转到Jenkins-Manage Jenkins->Configure System
找到Github部分,然后点击添加Github服务器。
名称:Github Api URL:https://api.github.com 管理挂钩:true

在凭据下,点击“添加”。您将进入一个菜单。选择“Secret Text”

  • 范围:全局
  • 秘密:粘贴之前获取的访问令牌
  • ID:(我留空了)
  • 描述:DorianGithubCreds

点击保存。然后,从凭据列表中选择DorianGithubCreds。

要进行测试,请点击“测试连接”。我的返回结果为“用户dnrahamim的凭据已验证”,速率限制为4998

现在转到Github Pull Request Builder

  • Github服务器API URL:https://api.github.com
  • Jenkins URL覆盖:(留空)
  • 共享密钥:(留空)
  • 凭证:DorianGithubCreds
  • 自动管理Webhooks:true
  • 其他所有内容都为空

配置作业

转到应该构建您的存储库的作业 在左侧菜单中选择“配置”

在项目-> Github组织下

  • 凭证:DorianGithubCreds
  • 所有者:Dorian
  • 行为:
    • 发现分支
      • 策略:排除作为PR的分支
    • 从源发现拉取请求
      • 策略:将拉取请求与当前目标分支修订合并
    • 从分支发现拉取请求
      • 策略:将拉取请求与当前目标分支修订合并
      • 信任:来自具有管理或写入权限的用户
  • 项目识别器
    • 管道Jenkinsfile
      • 路径:Jenkinsfile(我的Jenkinsfile位于项目根目录中)
  • 构建策略:(故意空白)

通知

现在,当我发起拉取请求时,或每当我发布对拉取请求的更改时,Jenkins会为该分支运行新的构建。

Github中的拉取请求本身还在底部列出了其“状态检查”。当构建处于挂起状态时,状态检查为黄色。如果成功,它会得到绿色的勾号。如果失败,则会得到红色的X。

我最初遇到的问题是,我有一个旧的Jenkins服务器,它也配置了管理Github Webhooks和构建Pull Requests。它的构建失败了,因此它的通知是唯一成功到达我的Pull Request的。我通过阻止旧的Jenkins服务器构建我的最新分支来解决了这个问题。一旦旧的Jenkins服务器停止构建,新的Jenkins服务器的通知就能够传递到Github。
总之,这就是我有意配置的所有内容。请尝试使用我的配置并查看是否适用于您。如果我漏掉了什么,请告诉我。
配置Jenkins与Github的难点在于,虽然有许多指南,但建议经常相互冲突,并且很多已经过时(有时甚至官方文档也已过时)。
尽管如此,这里还是提供一些资源:
  1. 这是一个有关Github Webhooks的好指南
  2. Github关于与Jenkins集成CI的白皮书(它没有详细解释,但提供了很好的概述)
  3. Github拉取请求构建器插件
  4. 半官方SO帖子,用于在Github仓库上显示构建状态

0

GitHub有“添加Webhook”功能,可以在存储库设置--> Webhooks部分中访问。这有4个输入 1. Payload URl - 输入Jenkins url 2. Content Type - application/json 3. Secret - 如果要配置密钥,则此项是可选的 4. 您想触发此Webhook的事件是哪些?-选择“让我选择单个事件”选项 一堆复选框选项可见,请勾选“Pull requests”选项。当打开拉取请求时,此选项将向Jenkins发送请求

下一步是在Jenkins中创建一个作业,该作业将侦听GitHub事件并启动构建


唯一的问题是 - 无论我使用什么Jenkins URL,例如,“http://(Jenkins-IP):(port)/ghprbhook/”,它都无法启动相应的Jenkins作业。 GitHub webhook和Jenkins之间存在某种断开连接。 Webhook最初能够连接到Jenkins并在首次创建时返回成功代码,但当打开拉取请求时,它从未触发Jenkins作业。 - Mike Goddard
我们遇到了同样的问题,想知道你是否找到了解决方案? - Abhijith Prabhakar
负载URI在Github推送和拉取请求中是不同的。1. 拉取请求URI是<JENKINS_URL>/github-pull-request-hook/,2. 推送事件URI是<JENKINS_URL>/github-webhook。请参考Github Webhook Multibranch - Girish

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