在 Github 上合并拉取请求后触发 Jenkins 构建。

12
这应该是Jenkins中一个简单的开箱即用配置,但我在互联网上没有找到任何直接的解决方案。我想要做的就是仅在我们的Github库中合并拉取请求时触发构建。
首先,Github将几乎所有与拉取请求相关的活动聚合到一个Webhook中(与Bitbucket不同,后者允许您区分操作)。

enter image description here

在Jenkins方面,我看到一些帖子指向通用Webhook插件,它允许您摄取Webhook的json并创建变量,但从这里看来,这些变量需要在脚本中使用才能触发/不触发构建。 Github Pull Request Build是另一个流行的插件,但同样没有明确说明“仅在合并PR时触发此构建”,甚至似乎没有提供查找Webhook json中特定值的选项。
除非还有其他插件,否则我没有找到最佳选项(即最少配置只需启动构建)是在Jenkins中为GITSCM轮询配置GitHub挂钩触发器,并在Github侧仅在推送事件上发送Webhook……但这不是我们正在寻找的确切行为。

enter image description here

现在这一切都是通过UI完成的,而且我已经有一段时间没有使用Jenkins了,也许声明性流水线基础设施已经超越了UI,但似乎这应该更加直观。是否有人能够解释他们找到的最简单的实现方式,使用Jenkins和Github仅在合并拉取请求到特定分支时触发构建?

5个回答

8
不再需要使用Webhooks,因为现在您可以使用GitHub Actions(假设您正在使用github.com,尽管Actions将从2020年9月开始提供GHE(GitHub Enterprise)的测试版)。如此线程所述,当合并拉取请求到master时,您可以在GitHub侧触发作业。
on:
  pull_request:
    branches:
      - master
    types: [closed]

jobs:
  <job id>:
    if: github.event.pull_request.merged == true
    steps: // the rest of the code

这项工作可以使用像为GitHub Actions触发Jenkins Job这样的GitHub Action,它将调用您的Jenkins并触发一个或多个Jenkins作业。

jobs:

  build:
    name: Build
    runs-on: ubuntu-latest
    steps:
    - name: trigger single Job
      uses: appleboy/jenkins-action@master
      with:
        url: "http://example.com"
        user: "example"
        token: ${{ secrets.TOKEN }}
        job: "foobar"

在与OP的讨论和参考GitHub Actions教程后,我确认:

  • Jenkins不需要使用Docker启动,只需通过其公共URL从GitHub中可访问;
  • "触发远程构建"需要在Jenkins上激活;
  • 需要为具有启动Jenkins作业权限的Jenkins用户生成令牌;
  • 必须在GitHub存储库的.github/workflows文件夹中创建一个名为triggerJenkinsBuild.yml(或任何其他名称)的文件,并包含上述两个YAML部分;
  • "url:"字段只是Jenkins实例的基本URL,没有额外的路径。

在 Jenkins 方面,“触发远程构建”需要启用吗? - NealR
这似乎只适用于 Jenkins 的 Docker 安装,是吗? - NealR
@NealR 是的,您需要启用“触发远程构建”。此 GitHub 操作使用一个 URL 来联系您的 Jenkins,因此无论是否使用 Docker,只要您的 Jenkins 可从 GitHub 访问,GitHub 就会在主分支上的 Pull Request 时调用它。 - VonC
让我们在聊天中继续这个讨论 - NealR
@NealR 我已经编辑了答案,加入了我们讨论的主要结论。请不要犹豫,在那个讨论中添加其他使用该 GitHub 动作的用户需要注意的错别字。 - VonC
显示剩余3条评论

7

我四处寻找答案,最后自己找到了解决方案。

假设您已经配置了Jenkins的Webhook,因此跳过这一步。思路是捕获合并状态,并仅在其为真时触发构建。

我使用Jenkins上的通用Webhook触发器和可选过滤器来实现此目的。

如果构建已合并,则此变量返回true。enter image description here

只有当此变量为true时才触发构建。 enter image description here


谢谢,这很有帮助,现在似乎对我有效。 - Kyle Stewart
很高兴能够帮助! - Omisha gupta

0

0
为了回答“仅在将拉取请求合并到特定分支时触发构建”的问题,最简单的方法是在Jenkins中使用通用Webhook触发器插件。此Webhook允许您将JSON负载对象用作环境变量。搜索“如何设置通用Webhook触发器插件”,一旦配置完成Webhook,请查看负载,您将找到许多不同的对象可用作管道中的变量。使用这些变量,您可以触发构建。使用https://jsonpath.curiousconcept.com/查找JSONPath。

0

您可以配置通用的Webhook触发器插件来解析来自GitHub的负载JSON。
首先,请确保您在GitHub Webhook配置中已勾选拉取请求。

在此输入图像描述

现在您可以在Webhook JSON中查找合并键,更多细节请参见此网址: https://developer.github.com/webhooks/event-payloads/#pull_request

首先,您需要检查操作键是否已关闭,然后检查合并键。 根据官方文档的说法,如果操作已关闭且合并键为false,则拉取请求已关闭且未合并提交。 如果操作已关闭且合并键为true,则拉取请求已合并。

现在,配置通用Webhook以从您的Jenkins管道中的负载读取操作和合并密钥,您可以按照此示例进行操作: https://github.com/jenkinsci/generic-webhook-trigger-plugin/blob/master/sandbox/multibranch.jenkinsfile

在您的流水线中,您可以使用这些键来检查是否要触发构建。

要在特定分支上触发合并构建,可以在Jenkins管道中使用环境变量, env.BRANCH_NAME 将告诉您从哪个分支获取提交。


我已经配置了通用Webhook触发器以查找有效载荷中的这些值,但是我应该如何使用它们? - NealR

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