2013-05-10 3 views
0

У меня есть github webhoooks, настроенный для отправки POST скрипту PHP на моем сервере, когда я нажимаю на репо. (https://help.github.com/articles/post-receive-hooks)GitHub WebHook POSTs не проходит

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. Кроме того, если я вручную помещаю переменную полезной нагрузки $ _GET в URL-адрес, это записывается (поскольку я проверяю $ _REQUEST, а не только $ _POST). Мое подозрение в том, что мой PHP-сервер настроен на отказ от запросов POST с других серверов. Я использую 1and1 Shared Hosting, поэтому у меня нет выделенного элемента управления, но я могу использовать SSH, а также настраивать настройки PHP локально с .ini-файлом. Любые предложения будут ценны!

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

-Jeremy

+0

Если у вас все еще есть проблемы: я пробовал этот код на Dreamhost, без 'file_put_contents', и он работал нормально. Возможно, вам захочется убедиться, что 1) декодер JSON по какой-то причине не терпит неудачу (поскольку вы просто выходите без пауз), и 2) у вас нет ошибки разрешений или что-то в этом файле. (Я заменил 'file_put_contents' на' mail', и он работал нормально) –

+0

Я сомневаюсь, что ваш сервер отказывает в почтовых запросах с других серверов. Если бы это было так, никто не смог бы опубликовать что-либо на вашем сайте. Вы пробовали: '$ json = file_get_contents (" php: // input ");' и затем загрузите json с помощью '$ payload = json_decode ($ json);' – MBeale

ответ

1

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

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

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

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

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

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

Смежные вопросы