2010年12月03日

[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"
相対パスで記述していたのがエラーの原因。
丸一日、悪戦苦闘したけど、解決出来て良かった。

2010年12月の記事