動機
ローカル環境で開発後にgithubへpushし、本番サーバへログインし、毎回gitpullをしていましたが、結構手間を感じていました。
pushしたらすぐに本番にも反映させたい!と思い、色々googleで調べているとGitHubからのWebHookでやりたいことができそうだったので、実践しました。
設定の順序
1.gitpullするスクリプト作成
2.GitHubで設定する
git pullするスクリプト作成
webhook.php
<?php
// 設定
$LOG_FILE = dirname(__FILE__).'/hook.log';
$SECRET_KEY = '◯◯◯'; //githubで設定するSECRETと同内容(好きに決めます)
if (!function_exists('getallheaders'))
{
function getallheaders()
{
$headers = [];
foreach ($_SERVER as $name => $value)
{
if (substr($name, 0, 5) == 'HTTP_')
{
$headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value;
}
}
return $headers;
}
}
$header = getallheaders();
$hmac = hash_hmac('sha1', file_get_contents("php://input"), $SECRET_KEY);
if ( isset($header['X-Hub-Signature']) && $header['X-Hub-Signature'] === 'sha1='.$hmac ) {
$payload = json_decode(file_get_contents("php://input"), true);
//gitpullする対象のフォルダへ移動する
exec('cd /var/www/html/◯◯◯ ; git pull');
file_put_contents($LOG_FILE, date("[Y-m-d H:i:s]")." ".$_SERVER['REMOTE_ADDR']." git pulled: ".$payload['after']." ".$payload['commits'][0]['message']."\n", FILE_APPEND|LOCK_EX);
} else {
file_put_contents($LOG_FILE, date("[Y-m-d H:i:s]")." invalid access: ".$_SERVER['REMOTE_ADDR']."\n", FILE_APPEND|LOCK_EX);
}
?>
作成したスクリプトは
GitHubからhttpでアクセスする必要がある為、
ドキュメントルート下に配置します。
GitHubで設定する
GitHubで対象レポジトリ へ移動します。
Setting→Webhooksを選択します。
PayLoadURLは作成したスクリプトを指定します。
また、Secretにはスクリプトで記載した同内容を入力します。
最後に
ここまで作成するとpushした時点で本番環境にも変更が反映されます!