我的公司使用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会返回此信息。
但有时Web服务器没有在prd01或dev01上运行,所以我们得到了这个。
发生这种情况时,我们更新存储库并期望服务器具有相同更改的工作流程不起作用。
如何通知有效负载失败?如果可能的话,我宁愿不设置某些内容来轮询Web服务器或轮询错误的状态。除此之外,任何检查有效负载状态(RESTful?)的解决方案都要比检查Web服务器是否仍在运行更好,因为有效负载可能仍然因其他原因而失败。
编辑:我在内部进行了检查,看起来我们可能会设置一个当前的监控服务来检查每台服务器上Web服务器端口的响应。在上图中,它是8090,但它经常不同。
这不是我理想的解决方案,因为它只涵盖了Web服务器没有响应时的情况。有效载荷传递可能失败的原因还有很多。
答案 0 :(得分:1)
如果我没有一个Jenkins实例,我将如何做到这一点。然后在调用Jenkins作业的相同事件上创建一个单独的webhook,该作业基本上被计为某个任意数字(1000),然后检查目标服务器以查看有效负载是否已发送到服务器。这样就不必一直监视,并且会在你的webhook同时被解雇。
当然,如果Jenkins webhook也失败了,Jenkins解决方案就会失败,所以你必须努力使这种连接真正具有防弹性。当然,这可能会适得其反,而且时间更好地花在其他地方。
在GitHub API中似乎没有任何方法可以让企业查看请求的响应代码。 API当然可以显示请求的有效负载,但这显然不会对您有所帮助。
答案 1 :(得分:0)
有两种选择:
配置log forwarding并监控hookshot_resque
中的失败事件,错误代码为422或504.
对您的实例{{}} {{}}的某些用户可以使用命令行实用程序administrative shell access检查失败的事件。例如:
显示过去一天所有失败的挂钩递送
ghe-webhook-logs -f -a YYYYMMDD
下一步是解析并自动化命令。虽然这会导致检测到失败的webhook的延迟,但它是最可靠和最可靠的方法。