1

レポにプッシュするときに、サーバー上の PHP スクリプトに POST を送信するように github webhooks をセットアップしました。( 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 に手動で配置すると、それが記録されます ($_POST だけでなく $_REQUEST をチェックしているため)。PHP サーバーが他のサーバーからの POST 要求を拒否するように構成されているのではないかと考えています。私は 1and1 共​​有ホスティングを使用しているため、専用の制御はありませんが、SSH でログインしたり、.ini ファイルを使用してローカルで PHP 設定を構成したりできます。どんな提案でも大歓迎です!

*これをPHPで行うか、他の言語で行うかは気にしません。Python などを使用した方が簡単だと思われる場合は、それも素晴らしいことです。

-ジェレミー

4

2 に答える 2

3

JSON データを取得するには、次のコードを使用する必要があります。

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

完全なソリューションが必要な場合。Github または Gitlab からコードをデプロイするのに役立つ小さなツールを見つけたので、Web フックを処理し、スクリプトを呼び出して独自のサーバーにデプロイする Deepl.io を作成しました。これは、github または gitlab から送信された JSON を処理し、複数のリポジトリやブランチなどに使用できます。プル通知を受け取った後、独自の PHP またはシェル スクリプトを使用でき、デプロイのたびにステータス メールを送信します... チェックそれを出してください: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 に答える