GitHub WebHook POST не проходит

У меня есть 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 от других серверов. Я использую 1 и 1 Shared Hosting, поэтому у меня нет выделенного элемента управления, но я могу использовать SSH, а также настраивать параметры PHP локально с помощью файла.ini. Любые предложения будут ценны!

* Мне все равно, если я делаю это на PHP или другом языке. Если вы думаете, что это может быть проще, используя Python или что-то еще, это тоже круто.

-Jeremy

2 ответа

Решение

Хорошо, я понял это, сначала распечатав необработанные данные постов, прежде чем выполнять декодирование JSON. Оказывается, в моей установке PHP включены магические кавычки, и перед каждой цитатой в полезной нагрузке JSON автоматически ставятся escape-слэши. Очевидно, что это сделало JSON недействительным, и в результате этого произошла ошибка с кодом JSON_decode.

Вот простое исправление:

$payload = json_decode(stripslashes($_REQUEST['payload']));

Вам нужно использовать следующий код, чтобы получить данные JSON:

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

Если вам нужно полное решение; Я нашел немного инструментов, которые помогут развернуть ваш код из Github или Gitlab, поэтому я создал Deepl.io для обработки веб-хуков и сценариев вызовов для развертывания на вашем собственном сервере. Это обрабатывает JSON, который отправляется из github или gitlab и может использоваться для нескольких репозиториев и веток и т. Д. Вы можете использовать свои собственные сценарии PHP или оболочки после получения извещения и отправлять вам сообщения о состоянии после каждого развертывания... Проверить это из: http://deepl.io/

Другие вопросы по тегам