在 Github 中合并拉取请求时触发 Jenkins 构建
Trigger Jenkins build when pull request is merged in Github
这在 Jenkins 中应该是一个简单的、开箱即用的配置,但我没有在互联网上找到任何直接的东西。我想要做的就是仅当我合并到我们的 Github 回购中的拉取请求时触发构建。
首先,Github 将拉取请求周围的几乎所有 activity 聚合到一个 webhook 中(相对于 bitbucket,它允许您区分操作)。
在 Jenkins 方面,我看到帖子指向 Generic Webhook Plugin,它允许您摄取 webhook 的 json 并创建变量,但是从这里看起来需要那些在脚本中使用以 trigger/not 触发构建。
Github Pull Request Build 是另一个流行的插件,但同样没有明确说明“仅在合并 PR 时触发此构建”,甚至似乎提供了在 webhook 中查找特定值的选项json.
除非有其他插件,否则我还没有找到最好的选择(即开始构建的最少配置)是在 Jenkins 和Github 端仅在推送事件时发送 webhook...但这不是我们正在寻找的确切行为。
现在这一切都是通过 UI 完成的,自从我使用 Jenkins 以来已经有一段时间了,所以声明性管道基础设施可能已经通过了 UI,但看起来这应该更直观。有人可以解释他们发现的最简单的实现,使用 Jenkins 和 Github,仅在拉取请求合并到特定分支时触发构建吗?
您可以配置通用 webhook 触发器插件来解析来自 github 的负载 json。
首先确保您已在 github webhook 配置中选中 Pull requests
现在您可以在 webhook json 中查找合并的密钥,此处提供了更多详细信息 url:https://developer.github.com/webhooks/event-payloads/#pull_request
首先,您需要检查操作键是否已关闭,然后检查合并键。根据官方文档 如果操作已关闭且合并键为假,则拉取请求已关闭且未合并提交。如果操作已关闭且合并键为真,则拉取请求已合并。
现在配置通用 webhook 以从你的 jenkins 管道中的有效负载中读取它们的操作和合并密钥你可以按照这个例子:https://github.com/jenkinsci/generic-webhook-trigger-plugin/blob/master/sandbox/multibranch.jenkinsfile
在您的管道中,您可以使用这些键来检查是否要触发构建。
为了在特定分支上触发合并构建,您可以在 jenkins 管道中使用环境变量 env.BRANCH_NAME
会告诉您从哪个分支获得提交
不再需要 webhook,因为您现在 GitHub Actions (assuming you are using github.com
, although the Actions are coming with GHE, GitHub Enterprise, in Beta, starting Sept. 2020).
如 on this thread 所述,您可以在 GitHub 端触发作业,当在 master
上合并拉取请求时:
on:
pull_request:
branches:
- master
types: [closed]
jobs:
<job id>:
if: github.event.pull_request.merged == true
steps: // the rest of the code
然后该作业可以使用 GitHub 操作,例如 Trigger Jenkins Job for GitHub Actions,它将调用您的 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"
discussion with the OP and following the GitHub Actions tutorial之后,我确认:
- Jenkins 不必从 Docker 开始,它只需要从 GitHub 通过其 public URL;
可寻址
- 需要在 Jenkins 上激活“触发远程构建”;
- 需要为有权启动 Jenkins 作业的 Jenkins 用户生成令牌;
- 必须在 GitHub 存储库的文件夹
.github/workflows
中创建文件 triggerJenkinsBuild.yml
(或您想要的任何其他名称),其中包含上述两个 YAML 部分;
- “
url:
”字段只是 Jenkins 实例的基础 URL,没有额外的路径。
到处找,然后自己想出了这个解决方案
我假设您已经为 jenkins 配置了 webhook,因此跳过它。这个想法是捕获合并状态,只有在它为真时才触发构建。
我在 jenkins 上使用通用 webhook 触发器和可选过滤器来实现这一点。
如果构建已合并,则此变量 returns 为真。
并且仅当此变量为真时才触发构建
要回答“仅当拉取请求合并到特定分支时才触发构建?”问题,最简单的方法是使用 Jenkins 中的 Generic Webhook Trigger Plugin。此 webhook 允许您使用 JSON 负载对象作为环境变量。搜索“How to setup Generic Webhook Trigger Plugin”,完成 Webhook 配置后,查看有效负载,您会发现许多不同的对象用作管道中的变量。使用这些变量,您可以触发构建。使用此 https://jsonpath.curiousconcept.com/ 找到 JSON路径。
您可以使用 github 操作来触发 jenkins 管道
https://github.com/features/actions
https://github.com/marketplace/actions/trigger-jenkins-job
这在 Jenkins 中应该是一个简单的、开箱即用的配置,但我没有在互联网上找到任何直接的东西。我想要做的就是仅当我合并到我们的 Github 回购中的拉取请求时触发构建。
首先,Github 将拉取请求周围的几乎所有 activity 聚合到一个 webhook 中(相对于 bitbucket,它允许您区分操作)。
在 Jenkins 方面,我看到帖子指向 Generic Webhook Plugin,它允许您摄取 webhook 的 json 并创建变量,但是从这里看起来需要那些在脚本中使用以 trigger/not 触发构建。
Github Pull Request Build 是另一个流行的插件,但同样没有明确说明“仅在合并 PR 时触发此构建”,甚至似乎提供了在 webhook 中查找特定值的选项json.
除非有其他插件,否则我还没有找到最好的选择(即开始构建的最少配置)是在 Jenkins 和Github 端仅在推送事件时发送 webhook...但这不是我们正在寻找的确切行为。
现在这一切都是通过 UI 完成的,自从我使用 Jenkins 以来已经有一段时间了,所以声明性管道基础设施可能已经通过了 UI,但看起来这应该更直观。有人可以解释他们发现的最简单的实现,使用 Jenkins 和 Github,仅在拉取请求合并到特定分支时触发构建吗?
您可以配置通用 webhook 触发器插件来解析来自 github 的负载 json。
首先确保您已在 github webhook 配置中选中 Pull requests
现在您可以在 webhook json 中查找合并的密钥,此处提供了更多详细信息 url:https://developer.github.com/webhooks/event-payloads/#pull_request
首先,您需要检查操作键是否已关闭,然后检查合并键。根据官方文档 如果操作已关闭且合并键为假,则拉取请求已关闭且未合并提交。如果操作已关闭且合并键为真,则拉取请求已合并。
现在配置通用 webhook 以从你的 jenkins 管道中的有效负载中读取它们的操作和合并密钥你可以按照这个例子:https://github.com/jenkinsci/generic-webhook-trigger-plugin/blob/master/sandbox/multibranch.jenkinsfile
在您的管道中,您可以使用这些键来检查是否要触发构建。
为了在特定分支上触发合并构建,您可以在 jenkins 管道中使用环境变量 env.BRANCH_NAME
会告诉您从哪个分支获得提交
不再需要 webhook,因为您现在 GitHub Actions (assuming you are using github.com
, although the Actions are coming with GHE, GitHub Enterprise, in Beta, starting Sept. 2020).
如 on this thread 所述,您可以在 GitHub 端触发作业,当在 master
上合并拉取请求时:
on:
pull_request:
branches:
- master
types: [closed]
jobs:
<job id>:
if: github.event.pull_request.merged == true
steps: // the rest of the code
然后该作业可以使用 GitHub 操作,例如 Trigger Jenkins Job for GitHub Actions,它将调用您的 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"
discussion with the OP and following the GitHub Actions tutorial之后,我确认:
- Jenkins 不必从 Docker 开始,它只需要从 GitHub 通过其 public URL; 可寻址
- 需要在 Jenkins 上激活“触发远程构建”;
- 需要为有权启动 Jenkins 作业的 Jenkins 用户生成令牌;
- 必须在 GitHub 存储库的文件夹
.github/workflows
中创建文件triggerJenkinsBuild.yml
(或您想要的任何其他名称),其中包含上述两个 YAML 部分; - “
url:
”字段只是 Jenkins 实例的基础 URL,没有额外的路径。
到处找,然后自己想出了这个解决方案
我假设您已经为 jenkins 配置了 webhook,因此跳过它。这个想法是捕获合并状态,只有在它为真时才触发构建。
我在 jenkins 上使用通用 webhook 触发器和可选过滤器来实现这一点。
如果构建已合并,则此变量 returns 为真。
并且仅当此变量为真时才触发构建
要回答“仅当拉取请求合并到特定分支时才触发构建?”问题,最简单的方法是使用 Jenkins 中的 Generic Webhook Trigger Plugin。此 webhook 允许您使用 JSON 负载对象作为环境变量。搜索“How to setup Generic Webhook Trigger Plugin”,完成 Webhook 配置后,查看有效负载,您会发现许多不同的对象用作管道中的变量。使用这些变量,您可以触发构建。使用此 https://jsonpath.curiousconcept.com/ 找到 JSON路径。
您可以使用 github 操作来触发 jenkins 管道
https://github.com/features/actions https://github.com/marketplace/actions/trigger-jenkins-job