gitでhookを使ってWebサイトの自動更新
posted 2009-11-17 | written by mon_sat
以前のエントリでは、最終的に、テスト環境および本番環境で git pull することによって、それぞれを更新しています。
しかし、git には、push等が実行されると、その後に自動実行してくれるフックメカニズムが用意されています。
これを利用すれば、いちいちbareリポジトリにpush後、手動でgit pullすることなく、自動的に行なわせることができます。
下準備(テスト用と本番用でbranchを分ける)
これは必ずしも同じようにやる必要はありませんが、私の場合は、テスト環境用と本番環境用で、それぞれbranchを分けることにしています。
本番環境用を masterブランチ、テスト環境用を developブランチとします。
まずは、ブランチを作りましょう。
#localhost # 現在のブランチを確認する $ git branch -l * master $ git checkout -b develop $ git branch -l master * develop $ git push origin develop #server $ cd /var/dev ;#テスト環境 $ git checkout -b develop origin/develop
開発はdevelopブランチもしくは、developブランチから分岐したブランチで行ない、テスト環境でのチェック後、developブランチをmasterブランチへmergeします。
#localhost $ git branch -l master * develop $ edit;edit;edit; $ git commit -a; $ git push origin develop #server $ cd /var/dev ;#テスト環境 $ git pull origin develop ;#後述のフックを使用し不要になる操作 #本番サーバーでのテストが完了したら #localhost $ git cehckout master $ git merge develop $ git push origin master #server $ cd /var/www ;#本番環境 $ git pull origin master ;#後述のフックを使用し不要になる操作
これでふたつのブランチで運用することができました。
hookを使用する
hookは、bareリポジトリに設定します。
#server $ cd /repos/bs.git ;#bareリポジトリ $ cp -p hooks/post-update.sample post-update $ vi hooks/post-update # 追記 (cd /var/dev && git --git-dir=.git pull origin develop) (cd /var/www && git --git-dir=.git pull origin master)
これで終了です。
実際にpullされるかを試してみましょう。
#localhost $ git checkout develop $ edit;edit;edit; $ git commit -a $ git push origin develop # このときにテスト環境がdevelopブランチをpullしていることが確認できます。 $ git checkout master $ git merge develop $ git push origin master # このときに本番環境がmasterブランチをpullしていることが確認できます。 $ git checkout develop ;#開発は常にmaster以外のブランチで行なう
めでたく自動化できました。
一度設定すると、本番サーバーでの作業が激減しますね。