tanamonの稀に良く書く日記

KEEP CALM AND DRINK BEER

svnのhookで処理させるスクリプトをsvnで管理する

svnへのコミット時に、以前作ったメール送信の他にHudson側に処理をさせたい気持ちが出てきたのですが、hooks配下のファイルがsvnで管理できないと何かと不便です。せっかくsvnを使っているんだから、svnで使うファイルくらいsvnに管理させたいという思いから、hook処理時にsvn updateで取得したスクリプトに処理を委譲?させることにしました。

ちなみに、少しあやしいです。

svnリポジトリ上にスクリプトを作る

hook_scripts/
|-- post-commit
`-- post-commit.rb

まずsvn上にhook_scriptsという名前で、スクリプト置き場を作ります。
試しに以前のエントリで作ったpost-commitを使用してみます。
Subversionでコミット時にメールを送信する - tanamonの日記

hooksの下でチェックアウトする

# cd /opt/svn/test/hooks
# svn co file:///opt/svn/test/trunk/hook_scripts
A    hook_scripts/post-commit
A    hook_scripts/post-commit.rb
リビジョン 7 をチェックアウトしました。

hooksの下で、先ほど作成したスクリプト一式をチェックアウトします。

hookし直すスクリプトを作る

# vi hook_proxy.sh
#!/bin/sh

REPOS="$1"
REV="$2"

cd $REPOS/hooks/hook_scripts
svn update
chmod +x *
./`basename $0` $REPOS $REV
# chmod +x  hook_proxy.sh
# ln -s hook_proxy.sh post-commit

やっていることとしては、hookされたスクリプト名と同名のhook_scripts以下のファイルを呼び直しています。
hook_scriptsの変更が反映されるようにsvn updateしていますが、別途cron等で動かしたほうがスマートっぽいです。
(でも面倒なのでやらない)

手動で動作確認する

# sudo -u apache -H ./post-commit /opt/svn/test 7
リビジョン 7 です。

メールが飛んでくればOKです。
後は、hook_scriptsの下のファイルをsvnにコミットすれば、以降のhook処理が変わるようになります。