背景
ローカルでプログラミングをしているとソースコードをGithubで管理し、外部のサーバでレポジトリをクローンし
開発しているウェブサイトなどをデプロイすることをよく行います。
ローカルでプログラミングしているとよく思うのが、外部のサーバのレポジトリを最新の状態に保ちたいということがよくあります。
なので、ローカルでプログラミングを行い、それをGithubにpushすると、Githubのwebhook機能で、
外部のサーバでgit pull
を行うという、自動デプロイ的なことを行います。
(何番煎じかわかりませんが、よくやるので個人的にメモしておく)
#外部サーバでの設定
##レポジトリをクローン
最新の状態に保ちたいレポジトリをGithubからクローンしてくる。
ハマりポイント
クローンしたレポジトリの所有者をapacheにしておく。(httpdのとき)
webhookからgit pullするプログラムが実行されるので、そのままだとPermission denied
される
設定例)
# chown apache:apache -R <target_repo>
##外部サーバにgit pullするスクリプトを用意
<?php
// 設定
$LOG_FILE = dirname(__FILE__).'/hook.log';
$SECRET_KEY = 'hoge'; //githubで設定するsecretもところ
$header = getallheaders();
$hmac = hash_hmac('sha1', $HTTP_RAW_POST_DATA, $SECRET_KEY);
if ( isset($header['X-Hub-Signature']) && $header['X-Hub-Signature'] === 'sha1='.$hmac ) {
$payload = json_decode($HTTP_RAW_POST_DATA, true); // 受け取ったJSONデータ
// ここに実行したいコードを書く(testレポに移動して、git pullする)
exec('cd test ; 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の設定
対象のレポジトリにて
Settings
↓
webhooks
↓
設定
payload URL
http://hoge/webhook.php
※外部サーバの先程用意したgit pullをたたくようにプログラムを指定
※今回の場合webhook.php
Content type
application/json
※どっちでもok
Secret
今回の場合は`hoge`
Which events would you like to trigger this webhook?
Just the push event. ←これ
Send me everything.
Let me select individual events.
Active
We will deliver event details when this hook is triggered.
※webhook機能実行の条件を指定する。今回、pushされたら実行してほしいので一番上
#動作確認
実際にpushを行い、動作を確認する
うまくいない場合はwebサーバのerror.logをみるとよい。