我有一个用 Python 编写的 post-receive 钩子,其主要功能是部署更新的分支。它将存储库克隆到新目录中,并运行环境设置,例如npm install
构建/填充虚拟环境。它在服务器端运行,并通过推送到 git-http-backend(在 nginx 后面代理)触发。
此部署需要一些时间——几分钟。这对于 git 来说似乎太多了,它得出结论,The remote end hung up unexpectedly
并提供了一个error: RPC failed; HTTP 504 curl 22 The requested URL returned error: 504 Gateway Time-out
。
我已经发现这个答案结论是,如果一段时间内没有输出到 stdout,git 就会放弃。发帖者通过让他的脚本向 stdout 发送更多输出来“解决”了这个问题。这对我来说并不理想。有没有办法配置 git 以使其不会放弃短暂超时后?
我还注意到,在脚本完成之前,我在客户端看不到任何输出。如果用户在脚本执行过程中得到反馈,那就更好了。有没有办法从钩子脚本中获取“实时”输出?
事实上,我甚至以正确的方式处理此事?作为 git hooks 的结果,运行长时间运行的脚本的“正确”方法是什么,用户需要看到反馈(即输出/结果)?
编辑:进一步调查发现fastcgi_read_timeout
nginx 的设置。可以增加超时时间,但这并不能解决我的问题。将 stdout 重定向到文件后,我发现我的脚本实际上完成得相当快。但由于某种原因,git 后端在 stdout 在那里时不会传递它,然后永远挂起。此外,重定向 stdout 可以解决挂起问题。发生了什么?
编辑 2:进一步调试发现,脚本在联系同一 git 服务器以克隆不同的存储库时失败(服务器也返回 504)。这似乎表明git-http-backend
一次只能处理一个请求?失败是因为post-receive
当这个新请求进来时仍在进行中吗clone
?如果是这样,这似乎非常有限!有没有办法支持对 git-http-backend 的同时请求?