无法从詹金斯管道中的 GitHub Web 挂钩触发器获取有效负载
Posted
技术标签:
【中文标题】无法从詹金斯管道中的 GitHub Web 挂钩触发器获取有效负载【英文标题】:Unable to get the payload from GitHub web hook trigger in jenkins pipeline 【发布时间】:2021-09-23 18:49:41 【问题描述】:我已经使用以下设置配置了一个 Github 网络挂钩: 有效载荷 URL:https:///github-webhook/ 内容类型:application/x-www-form-urlencoded 事件:推送、拉取请求
我拥有的 Jenkins 作业是启用了以下功能的管道作业: 构建触发器:GITScm 轮询的 GitHub 钩子触发器
通过上述配置,我看到响应事件 ie;在 GitHub 中 push/PR,jenkins 作业被成功触发。在 GitHub 中,在 Web 挂钩的“最近交付”下,我看到了有效负载的详细信息和 200 的成功响应。
我正在尝试在 Jenkins Pipeline 中获取有效负载以进行进一步处理。我需要一些详细信息,例如:PR URL/PR 编号、参考类型、分支名称等,以便在 Jenkins 管道中进行条件处理。
我尝试访问“有效负载”变量(如其他堆栈溢出帖子和周围可用的文档中所述)并将其作为管道的一部分打印,但我还没有运气。
所以我的问题是,如何在我的 Jenkins 管道中从 GitHub 网络钩子触发器获取有效负载?
【问题讨论】:
【参考方案1】:不确定这是否可行。
通过我们使用的 GitHub 插件(Pipeline Github),PR 编号存储在变量 CHANGE_ID
中。
给定 PR 编号,PR URL 很容易生成。分支名称存储在变量BRANCH_NAME
中。在拉取请求的情况下,全局变量pullRequest
填充with lots of data。
可以使用他们的 API 从 Github 获取缺失的信息。这是一个检查 PR 是否“落后”的示例,您可以根据自己的具体要求对其进行修改:
def checkPrIsNotBehind(String repo)
withCredentials([usernamePassword(credentialsId: "<...>",
passwordVariable: 'TOKEN',
usernameVariable: 'USER')])
def headers = ' -H "Content-Type: application/json" -H "Authorization: token $TOKEN" '
def url = "https://api.github.com/repos/<...>/<...>/pulls/$env.CHANGE_ID"
def head_sha = sh (label: "Check PR head SHA",
returnStdout: true,
script: "curl -s $url $headers | jq -r .head.sha").trim().toUpperCase()
println "PR head sha is $head_sha"
headers = ' -H "Accept: application/vnd.github.v3+json" -H "Authorization: token $TOKEN" '
url = "https://api.github.com/repos/<...>/$repo/compare/$pullRequest.base...$head_sha"
def behind_by = sh (label: "Check PR commits behind",
returnStdout: true,
script: "curl -s $url $headers | jq -r .behind_by").trim().toUpperCase()
if (behind_by != '0')
currentBuild.result = "ABORTED"
currentBuild.displayName = "#$env.BUILD_NUMBER-Out of date"
error("The head ref is out of date. Please update your branch.")
【讨论】:
【参考方案2】:您需要在 GitHub 的 webhook 中选择 Content type: application/json
。然后,您将能够访问 GitHub 发送的有效负载中的任何变量,如下所示:$. pull_request.url
用于 pr url,例如。
【讨论】:
@bad_coder - 感谢您的编辑。我是这个平台的新手,仍在学习细节。以上是关于无法从詹金斯管道中的 GitHub Web 挂钩触发器获取有效负载的主要内容,如果未能解决你的问题,请参考以下文章