miauのブログ

はてなダイアリー「miauの避難所」をはてなブログに移行しました

Subversion 初期設定(2)

半年ほど前に、当時のメインブログで

というのを書いていたんですが、その続きを書いてみます。今回は

  • post-commit hook の設定

の部分。書いてから気づいたんですが、特に変わったことやってないです・・・。

やりたいこと

以下の二点です。

  • SVN のコミット内容をプロジェクトの ML にメール通知
    • チームの状況把握&レビュー促進のために
  • Trac との連携
    • リビジョンとチケットの連携強化のために

社内 IRC への通知とかもできるかもしれませんが、そこは TracRSSPlagger で飛ばす運用にしているので、ここでは設定しません。

メール送信スクリプトの準備(前準備)

まずメール送信用のスクリプトを準備します。スクリプトはいくつか種類がありますが、

なんかでいわれているように、最近だと mailer.py を使えばいいです。

今からごちゃごちゃ書きますが、以下の URL を見ていただければ十分かもしれません。

mailer.py は subversion ソースに含まれているはずなので、これを svn の hooks ディレクトリにコピーします。(別のバージョンの mailer.py を使うと動かなかったりすることもあるので注意してください。)

対象は mailer.py と mailer.conf.example(設定ファイルサンプル)の 2 ファイルです。設定ファイルは svn/conf に入れるのがベストな気がしますが、ここは手抜きしています。

cd /home/svn/hoge/hooks
cp /usr/local/src/subversion-1.3.2/tools/hook-scripts/mailer/mailer.* .

この状態でいったん svn に格納しておきます。(svn でファイルを管理するときは、変更前のファイルを格納しておく癖をつけておいたほうが、マージ等で困りません。)

svn add mailer.*
svn propset 'svn:executable' '*' mailer.py
svn ci -m 'mailer.py および設定ファイルサンプルを格納。(/usr/local/src/subversion-1.3.2/tools/hook-scripts/mailer 配下からコピー。)'

なんだかパーミッションが足りないので設定した上で・・・

chmod o+r mailer*
chmod o+x mailer.py

設定ファイルを編集します。

svn cp mailer.conf.example mailer.conf
vi mailer.conf

設定内容ですが、以下の 4 箇所くらい設定しておけばとりあえず OK です。

smtp_hostname = smtp.example.com
from_addr = hoge@example.com
to_addr = hoge-ml@example.com
reply_to = hoge-ml@example.com

mailer.py を実行して、実際にメールが飛ぶことを確認しておきます。以下のようにして呼び出せば、リビジョン 1 に対応したメールが飛ぶはずです。

/usr/bin/python /home/svn/hoge/hooks/mailer.py commit /home/svn/hoge 1

うまくいってるようであれば、コミットしておきます。

svn ci -m 'mailer.py の設定ファイルを作成。'

あとは好みで、今までのリビジョンについてもひととおりメールを飛ばしたりもします。たとえばリビジョン 2〜6 についてもメールを送りたいのであれば、以下のような感じで。

perl -e 'system qq{/usr/bin/python /home/svn/hoge/hooks/mailer.py commit /home/svn/hoge $_} for 2..6'

post-commit-hook で mailer.py を呼び出すよう設定

pre-commit-hook のときと同じように、post-commit hook を設定します。

svn cp post-commit.tmpl post-commit
svn propset 'svn:executable' '*' post-commit
vi post-commit

変更内容は、

commit-email.pl "$REPOS" "$REV" commit-watchers@example.org
log-commit.py --repository "$REPOS" --revision "$REV"

この 2 行を削って、代わりに

/usr/bin/python $REPOS/hooks/mailer.py commit "$REPOS" "$REV" & 

この 1 行を追加します。

で、コミット。ちゃんとメールが飛ぶことを確認します。

svn ci -m 'post-commit hook で mailer.py を呼び出すよう設定。'

post-commit-hook で trac-post-commit-hook を呼び出すよう設定

trac-post-commit-hook というのは、

これのことで・・・SVN のコミットメッセージに応じて Trac のチケットをに反映するスクリプトですね。たとえばコミットメッセージ中に「closes #<チケット番号>」という記述が含まれてたら、該当チケットのコメントに SVN のコミットメッセージを追加するとともに、チケットの close もやってくれる、という具合です。(詳しくはこのスクリプトの先頭部分を読んでください。)

まずはこのスクリプトを取得します。以下では edgewall.com から最新版を取得していますが、Trac のソースを取得している場合はそちらから入れて下さい。(0.10.4 のときに最新版を使おうとすると失敗しました。)

wget http://svn.edgewall.com/repos/trac/trunk/contrib/trac-post-commit-hook
svn add trac-post-commit-hook

いつもの流れであれば svn:executable を設定するところですが、このファイルは python に引数として渡すので設定していません。

そして post-commit 時に呼ばれるようにしておきます。post-commmit に以下の 2 行を追加します。

TRAC_ENV="/home/trac/hoge" 

/usr/bin/python $REPOS/hooks/trac-post-commit-hook -p "$TRAC_ENV" -r "$REV" &

で、コミット。あらかじめ「post-commit hook 設定」みたいなチケットを作成しておいて、これがちゃんと close されることを確認しておきましょう。

svn ci -m 'post-commit hook で trac-post-commit-hook を呼び出すよう設定。 closes #1'

本当は mailer.py や trac-post-commit-hook に細かい改造を加えたりもしているのですが、長くなるのでいずれまた別項で・・・。

      • -

ということで、post-commit-hook の設定は終わり。
残りは pot-revprop-change とpre-revprop-change くらいなので、あと一回で書ききれるかな・・・。