GitHub WebHooks失败的通知?

时间:2015-10-23 11:52:08

标签: git github github-enterprise

我的公司使用GitHub Enterprise在更新某些受保护的分支时自动更新生产和测试服务器。

当有人发送推送事件时,有效负载将被传送到各个服务器,每个服务器运行一个小型Web服务器以接收此类有效负载。然后,Web服务器检查有效负载的“ref”元素,以查看更新的分支是否与服务器对应。

例如,当有人将推送事件发送到development分支时,这是WebHook提供给两个服务器prod01和dev01的有效负载的开始。

{
  "ref": "refs/heads/development",
  "before": "e9f64fa5a4bec5f68faf9533050097badf1c4c1f",
  "after": "e86956f39a26e85b850b81643332def33e7f15c6",
  "created": false,
  "deleted": false,
...
}

prod01服务器检查production分支是否已更新。它不是,因此该服务器上没有任何反应。服务器dev01检查相同的有效负载以查看development分支是否已更新。它是(“ref”:“refs / heads / development”),因此dev01运行以下命令。

git -C /path/to/dev01/repo reset --hard
git -C /path/to/dev01/repo clean -f
git -C /path/to/dev01/repo pull origin development

当正确传递有效负载时,GitHub Enterprise会返回此信息。

Working payload

但有时Web服务器没有在prd01或dev01上运行,所以我们得到了这个。

Failed payload: "We couldn't deliver this payload: Service Timeout"

发生这种情况时,我们更新存储库并期望服务器具有相同更改的工作流程不起作用。

如何通知有效负载失败?如果可能的话,我宁愿不设置某些内容来轮询Web服务器或轮询错误的状态。除此之外,任何检查有效负载状态(RESTful?)的解决方案都要比检查Web服务器是否仍在运行更好,因为有效负载可能仍然因其他原因而失败。

编辑:我在内部进行了检查,看起来我们可能会设置一个当前的监控服务来检查每台服务器上Web服务器端口的响应。在上图中,它是8090,但它经常不同。

这不是我理想的解决方案,因为它只涵盖了Web服务器没有响应时的情况。有效载荷传递可能失败的原因还有很多。

2 个答案:

答案 0 :(得分:1)

如果我没有一个Jenkins实例,我将如何做到这一点。然后在调用Jenkins作业的相同事件上创建一个单独的webhook,该作业基本上被计为某个任意数字(1000),然后检查目标服务器以查看有效负载是否已发送到服务器。这样就不必一直监视,并且会在你的webhook同时被解雇。

当然,如果Jenkins webhook也失败了,Jenkins解决方案就会失败,所以你必须努力使这种连接真正具有防弹性。当然,这可能会适得其反,而且时间更好地花在其他地方。

在GitHub API中似乎没有任何方法可以让企业查看请求的响应代码。 API当然可以显示请求的有效负载,但这显然不会对您有所帮助。

答案 1 :(得分:0)

有两种选择:

实时监控

配置log forwarding并监控hookshot_resque中的失败事件,错误代码为422或504.

基于Cron的监控

对您的实例{{}} {{}}的某些用户可以使用命令行实用程序administrative shell access检查失败的事件。例如:

显示过去一天所有失败的挂钩递送

ghe-webhook-logs -f -a YYYYMMDD

下一步是解析并自动化命令。虽然这会导致检测到失败的webhook的延迟,但它是最可靠和最可靠的方法。