git pushで本番環境にデプロイ

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でデプロイしたほうが良いかもしれません。