Subversionのリポジトリをsvnsyncを利用して常時同期する

Subversionのリポジトリをsvnsyncを利用して常時同期する

現在、主にSubversionを利用してます。
ローカルに、svndumpは毎日取って運用してますが、念のため別マシンへ同期する方法がないか調べた結果、うまく行ったのでその作業メモ。
Subversionサーバは、RAID1でミラーリングしてますが、マシンハードの障害などが発生した場合復旧できない可能性もゼロではないので。。。

【環境】

今回、以下の環境で設定を行いました

サーバ 環境 ネットワーク環境
ローカル CentOS5.6/Subversion-1.6.11 LAN
リモート CentOS5.6/Subversion-1.6.11 グローバル

【概要】

以下の要件を満たすように構築

  • コミットはローカルのSubversionのみとする
  • リモートのSubversionへはコミットしない
  • ローカルへのコミット時に、同時に同期されるようにする

【前準備】

前準備として、両方のSubversionサーバへhttpでアクセスできるものとする

各リポジトリURLとアカウント

サーバ リポジトリ ID Password
ローカル http://local/svn/test user password
リモート http://global/svn/test svnsyncuser svnsyncpassword

【同期用ユーザの追加】

Tracのユーザと同一ファイルでユーザ管理しているので、以下のようなコマンドでユーザを追加します

$ sudo htpasswd /home/trac/.trac_htpasswd svnsyncuser
New password:
Re-type new password:
Adding password for user svnsyncuser

【同期用ユーザに書き込み権限を付与】

Subversionのリポジトリに、先ほど追加したユーザの書き込み権限を設定します

$ sudo vim /home/subversion/.htsvn_access

[groups]
root = root
svnadmin = …
svnsync = svnsyncuser

[/]
@root = r
@svnamin = r
@svnsync = rw

【hookスクリプトの作成】

同期先である、リモートサーバでhookスクリプトを作成します
作成するのは、「start-commit」と「pre-revprop-change」の2つです
既存のテンプレートをコピー後、追記します

$ cd /home/subversion/test/hooks
$ sudo cp start-commit.tmpl start-commit
$ sudo cp pre-revprop-change.tmpl pre-revprop-change
$ sudo chmod 755 start-commit pre-revprop-change

$ sudo vim start-commit

if [ “$2” == “svnsyncuser”]; then exit 0; fi
exit 1

$ sudo vim pre-revprop-change

if [ “$3” == “svnsyncuser” ]; then exit 0; fi
exit 1

【「svnsync init」の実行】

「svnsync init」コマンドを利用して、svnsyncを初期化します
以下のコマンドを利用します

コマンド

$ svnsync init DestSVN SrcSVN Option

コマンド例

$ svnsync init http://global/svn/test http://local/svn/test –non-interactive –trust-server-cert –source-username=user –source-password=password –sync-username=svnsyncuser –sync-password=svnsyncpassword
Copied properties for revision 0

【「svnsync sync」コマンドで手動同期】

手動で同期を行います
以下のコマンドを利用します

コマンド

$ svnsync sync DestSVN

コマンド例

$ svnsync sync http://global/svn/test –non-interactive –trust-server-cert –source-username=user –source-password=password –sync-username=svnsyncuser –sync-password=svnsyncpassword

【コミット時に自動的に同期を取るようにする】

毎回手動同期を取るのも大変なので、hookスクリプトを利用して自動的に同期を取るように設定します
この作業は、手動同期が正常に動作したことを確認後行います

post-commit

$ cd /home/subversion/test/hooks
$ sudo cp post-commit.tmpl post-commit
$ sudo vim post-commit

svnsync sync http://global/svn/test –non-interactive –trust-server-cert –source-username=user –source-password=password –sync-username=svnsyncuser –sync-password=svnsyncpassword

post-revprop-change

$ cd /home/subversion/test/hooks
$ sudo cp post-revprop-change.tmpl post-revprop-change
$ sudo vim post-revprop-change

svnsync sync http://global/svn/test –non-interactive –trust-server-cert –source-username=user –source-password=password –sync-username=svnsyncuser –sync-password=svnsyncpassword

【検証】

上記設定を行った後、リポジトリに対して追加や修正を行ってどちらも同期が取れていることを確認する
この設定を行うと、両方のリポジトリにコミットを行う為、コミット時のレスポンスが若干悪くなるのが欠点。。。