Subversionのフットスクリプト(hooks)を利用してさまざまな処理を実行してみる
Subversionのフットスクリプトを利用することで、サーバサイドでコミット時にさまざまな処理を実行することができます。
サーバ上のリポジトリ設置ディレクトリ直下の「/hooks/」ディレクトリに配置されてるファイルにスクリプトを記述することで、処理を実行することができます。
ファイルの種類により実行のタイミングが管理されており、それぞれ以下のようになっています。
start-commit | コミットトランザクション作成前 |
---|---|
pre-commit | コミット前 |
post-commit | コミット後 |
pre-revprop-change | リビジョン属性変更前 |
post-revprop-change | リビジョン属性変更後 |
pre-lock | ロック取得前 |
post-lock | ロック取得後 |
pre-unlock | ロック解放前 |
post-unlock | ロック解放後 |
リポジトリを作成したデフォルトの状態で、各テンプレートファイルが用意されているので、そのファイルをリネームすることで用います。
例えば「start-commit.tmpl」ファイルがあるので、コピーまたはリネームで「start-commit」というファイルを作成し、テキストエディタで開いてスクリプトを記述します。
ファイルを用意するだけで、後はコミット時に自動的にファイルの内容を読み込んでスクリプトが実行されるしくみです。
それでは、いくつか具体的な処理にトライしてみます。
ちなみに今回、SubversionサーバはUbuntu 14.04で試しているのでLinuxコマンドの処理となりますが、もちろんWindowsサーバでも同等の事が実現可能です。
サーバ上でチェックアウト・更新をかける
コミット時に、サーバ上の任意のディレクトリにチェックアウト、または、更新をかけるスクリプトです。
SubversionはWebサーバ(Apache)と連携していることが多く、コミットしたファイルをドキュメントルートに展開することで、自動的にWebコンテンツを更新するといったしくみはよくみかけます。
それでは、具体的なスクリプトの内容ですが、「post-commit」ファイルを開き、編集します。
DIR_HTDOCS='/home/user/htdocs' DIR_SVN='file:///home/user/repos/trunk/xxx' if [ -e $DIR_HTDOCS ]; then LANG=en_US.UTF-8 svn update $DIR_HTDOCS else mkdir $DIR_HTDOCS LANG=en_US.UTF-8 svn checkout $DIR_SVN $DIR_HTDOCS fi
リポジトリパスが「/home/user/repos/」、Webのドキュメントルートが「/home/user/htdocs」と仮定します。
ドキュメントルートが空の場合にチェックアウトします。既にチェックアウト済みの場合は更新します。
「LANG=en_US.UTF-8」について
subversionで日本語ファイル名のファイルを管理する場合に注意が必要です。
任意のsubversionのコマンドがコマンドラインから実行可能だが、同じコマンドをhookに書き込んでも実行されないといった現象が、稀に発生します。
原因はリポジトリ内に2バイト文字のファイル名を持つファイルが存在する事であり、この場合コマンドの直前に「LANG=en_US.UTF-8」を入力することで問題を解決できます。
この問題はログにも明確に出力されないので、かなり分かりづらいです。
原因究明に多くの時間を浪費するという事も。。。知識として留めておいたほうがよいでしょう。
上記でチェックアウトしたファイルをFTPで転送する
上記のチェックアウト処理の後に、さらにそのファイルをFTPで別サーバに転送する方法です。
先ほどの処理の後に以下を追記します。
DIR_FTP='/' HOST='XXX' USER='XXX' PASS='XXX' echo "exit" | lftp -p 21 -u $USER,$PASS -e "mirror -R --only-newer --delete $DIR_FTP /" $HOST
lftpコマンドを使ってミラーリングを実行します。
変数HOST、USER、PASSには環境に応じてFTP接続情報を設定します。
オプション「–only-newer」で新しいファイルのみ転送します。オプション「–delete」で転送元に存在しないファイルは削除します。
「FTPでテストアップ」なんて毎度のことなので、これら作業を自動化することで大きなメリットが得られそうです。