svnsyncを使ってリポジトリレプリケーション

タグ:

バックアップとして、もしくはバックアップからの復旧時間が嫌な場合は、リポジトリのミラーリングとしてsvnsyncがSVN1.4から使えるようになっている。

今回はsvnsyncの動作を確認してみる。
環境はWindows Vista、SVN1.5.3。
本当はリモートのリポジトリにミラーリングしたいんだけど、ローカルApacheで我慢。

Apacheは↓みたいな設定でURLを別にしている。SVNのBasic認証もかけてみた。

 <Location /svn>
   DAV svn
   SVNListParentPath on
   SVNParentPath C:\fujihara\svn_root
   AuthType Basic
   AuthName "Subversion Basic Auth"
   AuthUserFile C:\fujihara\svn_root\passwd
   Require valid-user
 </Location>
 
 <Location /svnmirror>
   DAV svn
   SVNListParentPath on
   SVNParentPath C:\fujihara\svn_mirror
   AuthType Basic
   AuthName "Subversion Basic Auth"
   AuthUserFile C:\fujihara\svn_root\passwd
   Require valid-user
 </Location>

「http://localhost:8888/svn/repo01」と「http://localhost:8888/svnmirror/repo01m」を同期させる。


ミラー側のリポジトリ設定

まずはミラー先のリポジトリを作成する。
mkdir c:\fujihara\svn_mirror
 cd c:\fujihara\svn_mirror
 svnadmin create repo01m

次に「C:\fujihara\svn_mirror\repo01m\hooks」にある「pre-revprop-change.tmpl」を「pre-revprop-change.bat」、「start-commit.tmpl」を「start-commit.bat」にリネーム。Windowsの場合はbatでUnixだとtmpl拡張子を削除かshとかでもいいかも。
バッチファイルの中身を以下に修正。

 // pre-revprop-change.bat
 if "%3" == "svnsyncuser" exit 0
 exit 1
 // start-commit.bat
 if "%2" == "svnsyncuser" exit 0
 exit 1

これをしないと

svnsync: Repository has not been enabled to accept revision propchanges; ask the administrator to create a pre-revprop-change hook

と怒られる。この記述によって、svnsyncuserからしかアクセスができないようになるので、ミラー側に送られてきたコミットやリビジョンのログメッセージ変更を防ぐ。

次にミラー側のリポジトリを初期化。
ミラー側のリポジトリは空っぽでないと「svnsync: Cannot initialize a repository with content in it」と怒られるので注意。

 c:\fujihara\svn_mirror>svnsync init http://localhost:8888/svnmirror/repo01m  http://localhost:8888/svn/repo01 --non-interactive --source-username=fujihara --source-password=password --sync-username=svnsyncuser --sync-password=password
Authentication realm: Subversion Basic Auth
Username: fujihara
Password for 'fujihara': ********
Copied properties for revision 0.

svnsyncuserはsvnsync用のユーザをApacheで指定したファイル(今回はpasswd)に追加する。こればっかりは平文になりますなー。

最後にsvnsyncコマンドでレプリケーション開始。

 c:\fujihara\svn_mirror>svnsync sync file:///c:/fujihara/svn_mirror/repo01m --sync-username=svnsyncuser --sync-password=secret
 Committed revision 1.
 Copied properties for revision 1.
 Committed revision 2.
 Copied properties for revision 2.
 Transmitting file data .
 Committed revision 3.
 Copied properties for revision 3.

これでばっちりレプリケーションができた。


ローカルでのミラーリング

ローカルのディスクにsvnsyncしてみる。svnsyncはURI?でレプリケーション先を設定できるので、リモートであろうがローカルであろうが意識しなくていい。
ローカルディスクにリポジトリを配置し、NFS上にレプリケーションを作成する・・・という構成にも可能。
 c:\fujihara\svn_mirror>svnadmin create repo01ml
 c:\fujihara\svn_mirror>svnsync init file:///c:/fujihara/svn_mirror/repo01ml file:///c:/fujihara/svn_root/repo01
 c:\fujihara\svn_mirror>svnsync sync file:///c:/fujihara/svn_mirror/repo01ml

リモート&リモートでもできた。

 c:\fujihara\svn_mirror>svnsync init http://localhost:8888/svnmirror/repo01mr http://localhost:8888/svn/repo01
 c:\fujihara\svn_mirror>svnsync sync http://localhost:8888/svnmirror/repo01mr


マスタとなるリポジトリの設定

ミラー側では以下の設定を行う。今回はrepo01リポジトリを複製しようとしているので、「C:\fujihara\svn_root\repo01\hooks\post-commit.bat」を作成する。これはコミット後に処理されるスクリプトなので、
svnsync sync http://localhost:8888/svnmirror/repo01m --non-interactive --source-username=fujihara --source-password=password --sync-username=svnsyncuser --sync-password=password

と記述してコミット毎に同期させる。コミット毎が2回走るのに近いので、軽くするんだったらcronとかに同じ内容を書けば、まとめて同期することも可能。
source-userとsource-passwordはなくても動くので謎。マスタ側のSVNユーザを指定するのかな?
Apacheで認証かけているときはオプションをちゃんと付けないとよくわからないエラー(MERGE of ・・・ 200 OKとか)になったり、ロック状態におちいるので注意。ロック状態の解除はsvnsyncでFailed to get lock on destination repos, currently held by・・・を参照のこと。

またコミットメッセージなどのリビジョンのプロパティも同期させないとだめなので、「C:\fujihara\svn_root\repo01\hooks\post-revprop-change.bat」を作成し、

svnsync copy-revprops http://localhost:8888/svnmirror/repo01m %2 --non-interactive --source-username=fujihara --source-password=password --sync-username=svnsyncuser --sync-password=password

と記述する。


動作確認

成功。コミット毎に同期も可能だし、あとでsvnsyncコマンドをたたいてまとめて同期も可能。ミラー側のリポジトリのコミットやログ変更もはじいてくれた。すばらしー。


参考

参考

Subversionの導入から運用まで、即戦力の一冊。最短距離で目的にたどり着ける、頼れる逆引きリファレンス!リポジドリ、ブランチ、タグなど運用のノウハウも解説... 続き
この本は、Subversionというバックアップのためのソフトについて説明したものです。Windowsの上で動きます。他の環境でも使えますが、入門書ということで... 続き
バージョン管理システム「Subversion」の開発者が執筆したSubversionの解説書。Subversion開発の中心的メンバーである3人の著者が技術的な... 続き
バージョン管理からプロジェクト管理へ。Subversionでコミットするだけ。Webで手軽に「プロジェクト管理」。インストールから運用、トラブル対策まで1冊で丸... 続き

コメントする


画像の中に見える文字を入力してください。

Mike Cohn (著), マイク コーン (著), 安井 力 (翻訳), 角谷 信太郎 (翻訳)
採用した現在のタイトルは、見積りや計画づくりといったプロセスを、アジャイルに進めなければならないと謳っているのだ。見積りと計画づくりがアジャイルでないのに、プロジェクトがアジャイルであるということはありえない。

メアリー・ポッペンディーク (著), トム・ポッペンディーク (著), 高嶋 優子 (翻訳), 天野 勝 (翻訳), 平鍋 健児 (翻訳) 「トヨタ生産方式」を源流にする「リーン開発」をソフトウエア開発に取り入れるための具体的方法を紹介した本です。製造分野から始まったリーン活動は、その原則を理解しないままプラクティスだけを開発分野に適用しようとしても、行き詰るか失敗に終わってしまいます。本書は、リーンの7大原則を「価値」「ムダ」「スピード」「人」「知識」「品質」「パートナー」に整理し、ソフト開発現場にどうしたら効果的に適用できるかを、多くの実例を交えながら具体的に説明します。

著者:Yugui 税込 2,310 円
本書は、他言語でのプログラミング経験を持つ人を対象に、Rubyの特徴、Rubyならではの方法や慣習について解説します。これはRubyの資料を読んで実践的な学習を進めていくために必要な前提知識です。本書はRubyの基礎的な部分とメタクラスやブロック構文のような独自の概念、それらにまつわる文化を説明し、Ruby特有の考え方を知ってもらうことを目的としています。

本書は、Railsの入門からリファレンスまでをわかりやすく解説した書籍です。第1部と第2部では、Railsの背景にある概念について説明し、あっという間に簡単なオンラインストアを開発してみせます。

著者:James Shore, Shane Warden アジャイル開発は人のなせる技である。アジャイル開発を極めるためには、その時々で無数の可能性を評価して最善の方策を選択することを学ぶ必要がある。本書は、あなたがアジャイル開発の「道」を極める手助けをしたい。

daipresents!! ҂̑蕨

tWn{github tWn{Google Code