1

当我推送到存储库时,我已经设置了 github webhooooks 以将 POST 发送到我服务器上的 PHP 脚本。( https://help.github.com/articles/post-receive-hooks )

MY 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 数据。此外,如果我在 URL 中手动放置一个 $_GET 有效负载变量,则会记录下来(因为我正在检查 $_REQUEST 而不仅仅是 $_POST)。我怀疑我的 PHP 服务器被配置为拒绝来自其他服务器的 POST 请求。我使用的是 1and1 共​​享主机,所以我没有专门的控制,但我可以通过 SSH 登录,也可以使用 .ini 文件在本地配置 PHP 设置。任何建议将不胜感激!

*我不在乎我是用 PHP 还是其他语言来做这件事。如果您认为使用 Python 或其他东西可能会更容易,那也很酷。

-杰里米

4

2 回答 2

3

您需要使用以下代码来获取 JSON 数据:

$data = json_decode( file_get_contents('php://input') );

如果您需要完整的解决方案;我找到了一些工具来帮助您从 Github 或 Gitlab 部署代码,因此我创建了 Deepl.io 来处理 Web-Hooks 并调用脚本以部署在您自己的服务器上。这处理从 github 或 gitlab 发送的 JSON,可用于多个存储库和分支等。您可以在收到拉取通知后使用自己的 PHP 或 shell 脚本,并在每次部署后向您发送状态电子邮件...检查出来:http ://deepl.io

于 2015-06-23T21:21:46.923 回答
1

好的,我通过在进行 JSON 解码之前首先打印原始帖子数据来解决这个问题。原来我的 PHP 安装启用了魔术引号,并在 JSON 有效负载中的每个引号之前自动添加转义斜杠。显然,这使得 JSON 无效,结果导致 JSON_decode 出错。

这是简单的修复:

$payload = json_decode(stripslashes($_REQUEST['payload']));
于 2013-05-15T03:46:08.817 回答