Gitには特定のアクションに対してスクリプトを実行するためのフック(hook)という機能が用意されています。
このフックを利用すれば、ローカルでプッシュした後、リモート側で自動的にデプロイまで処理させるといったことが可能になります。
ローカルで開発し、ステージングと本番環境があるような中・小規模のサイトであれば、ステージングまではプッシュと同時にデプロイまで自動化したいケースはままると思います。そのようなとき、Gitのサーバサイド・フックが簡単で効果的です。
リポジトリを作成すると、フック用のサンプル用スクリプトがGitディレクトリのhooksに格納されます。
通常は.git/hooksにあります。
.git/hooks以下のサンプルスクリプトを表示
ls .git/hooks/ applypatch-msg.sample commit-msg.sample post-update.sample pre-applypatch.sample pre-commit.sample pre-push.sample pre-rebase.sample prepare-commit-msg.sample update.sample
サンプルスクリプトはシェルスクリプトで書かれていますが、実行できるものであればPerlやRubyでも問題ありません。
フックはクライアントサイドとサーバーサイドの二つのグループに分けられます。
ここではクライアントサイドのフックについて説明します。
サーバーサイドフック
サーバーサイドフック用のスクリプトは、サーバへのプッシュの前後に実行されます。プッシュ前のフックをゼロ以外の値で終了させると、プッシュを却下してエラーメッセージをクライアントに返すこともできます。
どのようなフックが用意されているかの説明は man githooks で確認することができます。
フックとファイル名は関連付けされていて、Gitは何らかの処理を受けるとhooksディレクトリにある関連したファイルを実行します。
たとえば、プッシュを受けた場合は、処理前に hooks/pre-receive が実行され、プッシュの処理後に hooks/post-receive スクリプトが実行されます。該当するスクリプトがなければ何も実行さません。
Gitのフック(hook)を使って自動的にデプロイする
ここでは、ローカルでプッシュした際、リモート側でプッシュ用フックを実行させ、公開用ワーキングディレクトリでプルする手順を紹介します。
プッシュ後にデプロイ用の処理を行いたいので、リモート側の .git/hooks ディレクトリで post-receive スクリプトを作成します。
例では、リポジトリのディレクトリが /repo.git で、デプロイしたいワーキングディレクトリは /working_directory です。
まず、hooks ディレクトリに移動します。
cd /repo.git/.git/hooks
hooksディレクトリにpost-receiveがなければ、作成して編集します。
vi post-receive
post-receiveの内容は下記になります。
#!/bin/sh cd /working_directory git --git-dir=.git pull
スクリプトに実行権限をつけます。
chmod +x post-receive
これで、フックを仕掛けたリポジトリにプッシュがあった際、/repo.git/.git/hooks/post-receiveが実行され、/working_directory がデプロイされます。