0

我已经使用以下设置配置了一个 Github Web 挂钩:有效负载 URL:https:///github-webhook/ 内容类型:application/x-www-form-urlencoded 事件:推送、拉取请求

我拥有的 Jenkins 作业是一个启用了以下功能的管道作业:Build Trigger: GitHub hook trigger for GITScm polling

通过上述配置,我看到响应事件,即;在 GitHub 中 push/PR,jenkins 作业被成功触发。在 GitHub 中,在 Web 挂钩的最近交付项下,我看到了有效负载的详细信息和成功的 200 响应。

我正在尝试在 Jenkins Pipeline 中获取有效负载以进行进一步处理。我需要一些详细信息,例如:PR URL/PR 编号、参考类型、分支名称等,以便在 Jenkins 管道中进行条件处理。

我尝试访问“有效负载”变量(如其他堆栈溢出帖子和周围可用的文档中所述)并将其作为管道的一部分打印,但我还没有运气。

所以我的问题是,如何在我的 Jenkins Pipeline 中从 GitHub Web 挂钩触发器获取有效负载?

4

2 回答 2

0

不确定这是否可能。

使用我们使用的 GitHub 插件(Pipeline Github),PR 编号存储在变量CHANGE_ID. 给定 PR 编号,PR URL 很容易生成。分支名称存储在变量中BRANCH_NAME。在拉取请求的情况下,全局变量pullRequest会填充大量数据

可以使用他们的 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.")
        }
    }
}
于 2021-07-21T19:58:37.510 回答
0

您需要Content type: application/json在 GitHub 的 webhook 中进行选择。然后,您将能够访问 GitHub 发送的有效负载中的任何变量,如下所示:$. pull_request.url例如,对于 pr url。

于 2021-09-05T23:36:59.063 回答