githubでwebhookを使った自動デプロイ


動機

ローカル環境で開発後に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した時点で本番環境にも変更が反映されます!