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한 시점에서 프로덕션 환경에도 변경이 반영됩니다!

좋은 웹페이지 즐겨찾기