Gitテックラボ

Gitのフック(hook)を使って自動的にデプロイする

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 がデプロイされます。

関連記事