タグ別アーカイブ: CentOS

gitにpushしたwebサイトを自動的に同期させる

この記事は2011/4に掲載されたものです。
記事の内容が古くなっている為、現状と異なる可能性があります。

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 "NG\n";
} 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でのみアクセス可能にしている。