【问题标题】:Parameterize my repo url by parsing webhook request body/JSONpath通过解析 webhook 请求正文/JSONpath 参数化我的 repo url
【发布时间】:2020-11-04 13:28:39
【问题描述】:

我正在使用 Git 中的 webhook 进行多分支管道 Jenkins 设置和构建。这里我选择了 Git 分支源作为 - Git。

当我在 git 中推送任何更改时,webhook 会创建一个包含所有推送事件详细信息的请求正文。如何从中解析“git_http_url”值(这将有我的 git repo url)。然后我可以在詹金斯控制台中将此值用作 ${myrepourl} 。基本上我想避免对 repo url 进行硬编码,它应该动态地使用这个参数。

请指导。

![webhook 请求正文截图][2]][2] [![附上我的詹金斯控制台分支源][1]][1] [1]:https://i.stack.imgur.com/sdb0l.png [2]:https://i.stack.imgur.com/icPP9.png

【问题讨论】:

标签: jenkins jenkins-pipeline jsonpath multibranch-pipeline git-webhooks


【解决方案1】:

这看起来不是一个很好的主意。我将首先解释原因,概述替代方案,最后提出一个如果您坚持这样做可能仍然有效的解决方案。

当您配置管道时,您需要为它提供 Jenkinsfile。它可以粘贴在配置中(“管道脚本”),或者您可以提供一个路径,以便 Jenkins 可以执行结帐(“来自 SCM 的管道脚本”)。执行前者时,您有一个 Jenkinsfile,因此不同的分支无法更改它(因此错过了拥有多分支的意义)。在执行后者时,即使您可以参数化 git repo,您​​仍然需要提供路径(因为它不会到达 github 通知中)。此外,我可以使用我的 repo 触发您的构建,但您的管道很可能无论如何都无法正确构建我的 repo。因此,您的管道只能构建您的存储库,此时有点不清楚为什么您坚持不为您的特定管道提供它专门知道如何构建的特定存储库的路径。

大多数需要通过 Github 进行多分支管道的人使用专门为此目的编写的插件之一,例如Github Multibranch 插件或 Github 组织。这些插件自己完成所有工作:它们注册通知、处理它们并开始构建。他们还会为您更新 Github 中的构建状态。

最后,如果你坚持自己处理 Github 通知,你可以使用 Generic Webhook Trigger 插件,它允许你通过POST-ing 到带有令牌的指定 URL 来触发作业。这可能如下所示:

pipeline {
    agent { node { label 'master'} }
    triggers {
        GenericTrigger(causeString: 'Generic Cause', 
            genericVariables: [
                [key: 'DATA', value: '$'], //JSONPath expression meaning "everything"
                [key: 'GITHUB_URL', value: '$.project.git_http_url']
            ], 
            printContributedVariables: false, // change to 'true' to see all the available variables in the console
            printPostContent: false, // change to 'true' to see the dump of the POST data
            silentResponse: false,
            token: 'my_token')
    }

根据第一个配置行,发布的任何 JSON 都将被展平并转换为管道变量,并带有您定义的前缀(在本例中为“DATA_”)。例如。 Github 有效负载中 project 字段内的字段 git_http_url 将在管道中定义并作为 DATA_project_git_http_url 提供给您。根据第二个配置行,它也将作为GITHUB_URL 提供。

您可以使用例如测试您的管道

curl -XPOST -H "Content-Type: application/json" 'http://<jenkins>/generic-webhook-trigger/invoke?token=my_token' --data '{"hello": "world"}'

在这种情况下,贡献变量将为DATA_hello,其值为world。 (GITHUB_URL 变量自然不会被定义。)

如果你想把它变成真正的 Github webhook 处理器,你需要确保 Github 通知到达&lt;jenkins&gt;/generic-webhook-trigger/invoke?token=my_token。我们为此使用nginx,但还有许多其他选项。

【讨论】:

  • 但是我应该在多分支管道配置中放入什么 - 项目存储库?
  • 如果您选择其他选项,您应该将“git_http_url”的值放在 webhook 内容中,即以“http”开头并以“.git”结尾的内容。如果你选择最后一个选项,你应该使用“通用管道”,而不是多分支。
  • 但我的意图是在项目存储库部分中放置一个像 $project.git_http_url 这样的变量,以便它自动获取存储库 url (http://...... .git)时间 webhook 触发构建。在每次提交中,webhook 请求正文都会检测到 repo url 并将其存储在名为“git_http_url”的变量中,所以有没有一种方法可以让我使用该变量名而不是整个 url 本身。
猜你喜欢
  • 2023-04-09
  • 1970-01-01
  • 2012-07-01
  • 2018-02-17
  • 2020-07-09
  • 2021-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多