【问题标题】:Unable to get the payload from GitHub web hook trigger in jenkins pipeline无法从詹金斯管道中的 GitHub Web 挂钩触发器获取有效负载
【发布时间】: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 网络钩子触发器获取有效负载?

【问题讨论】:

    标签: jenkins github jenkins-pipeline github-webhook jenkins-github-plugin


    【解决方案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 - 感谢您的编辑。我是这个平台的新手,仍在学习细节。
      猜你喜欢
      • 2022-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多