当我推送到repo时,我已经设置了github webhoooks来发送POST给我服务器上的PHP脚本。 (https://help.github.com/articles/post-receive-hooks)
我的PHP脚本记录连接的IP以及收到的有效负载:
$date = strftime('%c');
file_put_contents('log.txt', PHP_EOL.trim($date).PHP_EOL, FILE_APPEND);
try
{
$payload = json_decode($_REQUEST['payload']);
}
catch(Exception $e)
{
exit(0);
}
//LOG THE POST REQUEST
file_put_contents('log.txt', print_r($payload, TRUE), FILE_APPEND);
//EXECUTE A SCRIPT WHEN THE POST REQUEST IS INITIALIZED
if ($payload->ref === 'refs/heads/master')
{
exec('deploy.sh >> log.txt');
}
从日志中,我可以看到当我推送到我的仓库时IP连接,但没有记录POST数据。我使用RequestBin测试,并确认POST数据存在。此外,如果我手动将$ _GET有效载荷变量放入URL中,则会记录(因为我正在检查$ _REQUEST而不仅仅是$ _POST)。我怀疑我的PHP服务器配置为拒绝来自其他服务器的POST请求。我正在使用1and1共享主机,因此我没有专用控件,但我可以通过SSH进行SSH操作,以及使用.ini文件在本地配置PHP设置。任何建议将不胜感激!
*我不在乎我是用PHP还是其他语言做的。如果你认为使用Python或其他东西可能会更容易,那也很酷。
-Jeremy
答案 0 :(得分:2)
您需要使用以下代码来获取JSON数据:
$data = json_decode( file_get_contents('php://input') );
如果您需要整个解决方案;我找到了很少的工具来帮助从Github或Gitlab部署你的代码,所以我创建了Deepl.io来处理Web-Hooks并调用脚本来部署在你自己的服务器上。 这处理从github或gitlab发送的JSON,可用于多个存储库和分支等。您可以在收到拉取通知后使用自己的PHP或shell脚本,并在每次部署后向您发送状态电子邮件... 看看:http://deepl.io
答案 1 :(得分:1)
好的我通过在进行JSON解码之前首先打印原始发布数据来解决这个问题。原来我的PHP安装启用了魔术引号,并在JSON有效负载中的每个引号之前自动添加转义斜杠。显然,这使得JSON无效,结果导致JSON_decode出错。
这是一个简单的修复:
$payload = json_decode(stripslashes($_REQUEST['payload']));