WEB/システム/IT技術ブログ

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でテストアップ」なんて毎度のことなので、これら作業を自動化することで大きなメリットが得られそうです。

B!

Comment

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

Monthly Archives