[linux] CentOS5 + Apache2にsubversionを導入

バックアップも兼ねて、subversionを導入することにした。
サーバ側は「CentOS5 + Apache2」でクライアント側は「TortoiseSVN」。

●RPMパッケージのインストール

# yum install subversion
# (yを入力)
# yum install mod_dav_svn
# (yを入力)

●リポジトリの作成

# mkdir -p /var/www/svn/
# cd /var/www/svn/
# svnadmin create repos01
# chown -R apache:apache repos01

httpでアクセスするので、web用フォルダ配下にリポジトリ用の親フォルダ「svn」を作成。
そして、svnadminコマンドでリポジトリを作成。
複数リポジトリを作成したければ、別のフォルダ名でsvnadminコマンドを実行。

●BASIC認証用ユーザの追加

# htpasswd -cm /somewhere/.htpasswd user01
# (パスワード01を入力)
# htpasswd -m /somewhere/.htpasswd user02
# (パスワード02を入力)

●subversion.confの設定
# vi /etc/httpd/conf.d/subversion.conf

<Location /svn>
     DAV svn
     SVNParentPath /var/www/svn

     # Basic Authentication
     AuthUserFile /somewhere/.htpasswd
     AuthName “Please Enter Password”
     AuthType Basic
     require valid-user

     # IP Address Authorization
     Order Deny,Allow
     Deny from all
     Allow from aaa.bbb.ccc.ddd
</Location>

SVNParentPathでリポジトリ用親フォルダを指定しておけば、リポジトリ追加での作業はsvnadminだけで済む。
BASIC認証でユーザーIDとパスワードを入力させることによって接続を規制。
また、接続元のIPアドレスでも接続を規制。

● apache設定の確認と再起動

# /etc/rc.d/init.d/httpd configtest
# /etc/rc.d/init.d/httpd graceful

●ブラウザでの動作確認

リポジトリのURL:http://domain01/svn/repos01
ユーザーID:user01
パスワード:(htpasswdコマンドで入力したパスワード)

●TortoiseSVNを使用してSVNチェックアウト

リポジトリのURL:http://domain01/svn/repos01
チェックアウトフォルダ:D:\svn\repos01
ユーザーID:user01
パスワード:(htpasswdコマンドで入力したパスワード)

●TortoiseSVNを使用してtrunk、tags、branchesを作成

1.チェックアウトフォルダで右クリックし、[TortoiseSVN]-[リポジトリブラウザ]を選択
2.右クリックで[フォルダの作成]を選び、順にtrunk、tags、branchesを作成

※2011/02/15追加
Windowsで上記フォルダを作成し、コミットしても可。

●コミットログをメール送信
1.メール送信プログラム(commit-email.pl)をフックプログラムフォルダにコピー

# cd /usr/share/doc/subversion-1.4.2/tools/hook-scripts/
# cp commit-email.pl /var/www/svn/repos01/hooks/
# cd /var/www/svn/repos01/hooks/
# chown apache:apache commit-email.pl

2.commit-email.plを編集
# vi commit-email.pl

#$sendmail = “/usr/sbin/sendmail”;
$smtp_server = “127.0.0.1”;

$sendmail = “/usr/sbin/sendmail”;
#$smtp_server = “127.0.0.1”;

push(@head, “Content-Type: text/plain; charset=UTF-8\n”);
push(@head, “Content-Transfer-Encoding: 8bit\n”);

push(@head, “Content-Type: text/plain; charset=ISO-2022-JP\n”);
push(@head, “Content-Transfer-Encoding: 7bit\n”);

my $command = “$sendmail -f’$mail_from’ $userlist”;

my $command = “nkf | $sendmail -f’$mail_from’ $userlist”;

全てのMTAが8bitに対応している訳ではないので、メールはISO-2022-JPで送信することに決定。
「SMTP server」使用では文字化けしてしまったので、nkfからsendmailに渡す。

3.commit-email.plの動作確認

# ./commit-email.pl /var/www/svn/repos01 1 –from svn@domain01 user01@domain02 -s “[repos01]”

fromを指定したり、subjectに文字列を追加するのは、メールクライアントでの振り分け用。

4.コミット後に動作するフックプログラム(post-commit)をコピー

# cp post-commit.tmpl post-commit
# chown apache:apache post-commit
# chmod 755 post-commit

5.post-commitを編集
# vi post-commit

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

export LANG=ja_JP.UTF-8

PATH=”/var/www/svn/repos01/hooks”
FROM=”svn@domain01″
TO=”user01@domain02″
SUBJECT=”[repos01]”
$PATH/commit-email.pl “$REPOS” “$REV” –from $FROM $TO -s “$SUBJECT”
# commit-email.pl “$REPOS” “$REV” commit-watchers@example.org
# log-commit.py –repository “$REPOS” –revision “$REV”

6.動作確認
TortoiseSVNでコミットし、送信されてきたメールが文字化けしていないか?を確認する。
コミット対象が複数かつエンコードが複数ある場合は文字化けするのも止む無し?

●参考サイト

・Linux/Subversion/yumからインストール – MinacoWiki
http://wiki.minaco.net/index.php?Linux%2FSubversion%2Fyum%E3%81%8B%E3%82%89%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB

・Subversion – Linux Wiki
http://oku.edu.mie-u.ac.jp/~okumura/linux/?Subversion

・ごった煮 – CentOS4/CentOS5導入記(覚え書き) – subversionの導入
http://park1.wakwak.com/~ima/centos4_subversion0001.html

・Arakinの玄箱設定(SubVersion)
http://www.arakin.dyndns.org/kuro_svn.php

・svnのコミット時にメールを送信する方法のメモ: 月夜の散歩
http://sliver.cocolog-nifty.com/blog/2008/07/svn_7279.html

●はまりネタ
post-commit動作確認中に以下のエラーメッセージが表示された。

can’t convert string from native encoding to ‘UTF-8’

LANGに「ja_JP.UTF-8」は設定している。

export LANG=ja_JP.UTF-8

googleで「LC_ALLも設定する」記述があったので、i18nを編集し、サーバを再起動。
# vi etc/sysconfig/i18n

LANG=”ja_JP.UTF-8″
LC_ALL=”ja_JP.UTF-8″
SYSFONT=”latarcyrheb-sun16″

・サーバ再起動

# shutdown -r now

状況は変わらず。
しかし、ふとしたことから解決。
原因はパスの設定ミス。

./commit-email.pl “$REPOS” “$REV” –from $FROM $TO -s “$SUBJECT”

$PATH/commit-email.pl “$REPOS” “$REV” –from $FROM $TO -s “$SUBJECT”

相対パスで記述していたのがエラーの原因。
丸一日、悪戦苦闘したけど、解決出来て良かった。