无法从詹金斯管道中的 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 挂钩触发器获取有效负载的主要内容,如果未能解决你的问题,请参考以下文章

詹金斯:无法在管道阶段定义变量

如何从詹金斯管道中选择声纳质量门?

如何从Jenkins Blue Ocean部署到弹性豆茎?

詹金斯管道中的文件存在不适用于 $variant

从竹子触发詹金斯

詹金斯管道中的条件步骤/阶段