git pushでデプロイしたい
ローカルレポジトリにgit commitした後に、問題なければリモートレポジトリにgit pushすることになりますが、git pushしただけではリモートレポジトリの情報が更新されるだけでデプロイはされません。今までデプロイ作業は自宅サーバーにログインして、git pullを行なっていたのですが、それは面倒なのでgit pushのタイミングでデプロイを自動化することにしました。まず、レポジトリを立てるところから順を追って解説します。
リモート側にGitレポジトリを立てる
$ mkdir repo
$ cd repo
$ git init
$ git config --bool core.bare true
$ cp -rf /srv/www ./
$ git add *
$ git commit -m "www add"
$ cd /srv
$ rm -rf www
$ git clone /srv/repo www
その後、repo/.git/の中にあるフックを編集して、アップデートのフックでgit pullが走るようにします。
$ cd /srv/repo/www/.git/hooks
$ mv post-update.sample post-update
$ vi post-update
#!/bin/bash
#
# An example hook script to prepare a packed repository for use over
# dumb transports.
#
# To enable this hook, rename this file to "post-update".
$ cd /srv/www && git --git-dir=.git pull
ローカル側にGitレポジトリのクローンを作成
$ git clone ユーザー名@サーバー名:/srv/repo/
$ cd www
$ touch test.txt
$ git add test.txt
$ git commit -m "test.txt add"
$ git push
これで本番環境にオートデプロイされます。本番環境ではpushリクエストを受け取ったら、それをフックとしてgit pullを実行し、ドキュメントルートのスクリプトを更新します。
クラスタサーバー構成の場合どうするか
クラスタサーバー構成の場合、複数台のサーバーでlsyncdを構成しておくと、カーネルのinotify機能をトリガーにしてrsyncが自動実行されるため、複数台のサーバー間の同期を行うことができます。PHPやPerlの場合はこれで大丈夫ですが、Javaなどコンパイルが必要な言語に関してはいったんwarにしてJenkinsでデプロイしたほうが良いかもしれません。