earthquake_jpに関連して作業したので備考録としてメモ。
前提
gitのリモートリポジトリとHTTPサーバが同一のサーバに存在している状態です。
別サーバで行う場合はgit cloneを行う際にパス無し秘密鍵でcloneして
おかないと上手く動作しないと思われます。
処理の流れ
開発者 → コミット → プッシュ → post-receive → Web API → git pull
失敗
- 最初はpost-receiveでpullを発行しようとしたが、HTTPサーバとgitosisの権限が異なる。
- sudoを発行してみたが、エラーが発生して処理が行えない。
結果
- post-receiveはWeb APIへとアクセスする。
- Web APIはHTTPサーバの権限で動作する。
- Web APIではシェルスクリプトを実行する。
- HTTPサーバの権限でpullが行われる。
例
リポジトリ.git/hooks/post-receive
#!/bin/sh wget -q -O - http://APIのURL
API(update.php)
<?php
$cmd = dirname(__FILE__) . '/update.sh';
$res = system($cmd);
if (false === $res) {
echo "NGn";
} else {
echo "OK:{$res}n";
}
シェルスクリプト(update.sh)
#!/bin/sh cd /var/www/html/ /usr/bin/git --git-dir=/var/www/html/.git pull
post-receive、update.shは実行権限を付加するのを忘れずに。update.phpはweb上から実行可能であれば問題ない。
念の為、127.0.0.1か自身のグローバルIPでのみアクセス可能にしている。