sgykfjsm.github.com

svnのデータ移行手順を確認する

色々あってsvnを触ることになった。今回はその過程で知ったことをメモする。

なぜsvnを触ることになったのかというと、現在使っているsvnサーバを移行する必要が出てきたから。 今回は作業手順の検証のために、移行元のsvnと同じバージョンのsvnをソースからコンパイルし、移行先のsvnを最新バージョンでコンパイルした。最新バージョンのsvnのコンパイルをするにあたって、svnsyncをhttp経由で行なうためにApache Serfの導入手順も確認した。

ソースコード中に出てくるsvnのコマンドについては、svnbookを参照すれば良いと思う。コマンド名でなんとなくはわかると思うけど、一応ポインタとしてリンクを記載しておく。

Subversion1.7.9をコンパイル

特にコレに関してはいうことは無いのだけれど、ポイントとしては、

  • --without-berkeley-dbとしてBerkeley DBを使わないようにしている
  • --without-serfとなっていて、http経由でのsvn操作ができなくなっている
  • SQLiteのバージョンは最新版だとコンパイルできないという点に注意する

ということぐらい。あとは以下のソースコードの通り。

Subversion1.9.1をコンパイル

コレを書いている時点では1.9.1が最新となっている。1.7.9との違いとしては、http経由でリポジトリにアクセスできるように(より厳密には、svnの各種コマンドがhttp形式のURLを解釈できるようにするために)Apache Serfのインストールを行っていること。そして、Apache SerfをインストールするためにSConsをインストールしている。

SerfとはApache Portable Runtime(APR)ライブラリ上で動くハイパフォーマンスなC言語ベースのHTTPクライアント。かつてはGoogle Codeでホスティングされていたが、今はApachプロジェクトとして運営されている。

SerfはApache SubversionとApache OpenOfficeのデフォルトクライアントとして利用されている。

Serfがちょっと面倒なのは、ビルドにSConsというものが必要になることだ。SCons自体はpythonで書かれているが、pipなどでインストールするのではなく、ソースコードをhttp://www.scons.org/download.phpからダウンロードしてsetup.pyを実行すれば良い。よって、Serfのインストールは以下の様になる。

SConsはmakeに代わる次世代のビルドツールを目指しているらしい。けど、あんまり耳にすることは無いですね…

1
2
3
4
5
6
7
cd /path/to/scons
sudo python setup.py install

cd /path/to/serf
sudo scons PREFIX=/home/vagrant/apps/serf
sudo scons install
sudo scons -c

あとはv1.7.9とほぼ同様にすれば良いが、違いとしては、

  • yumでopenssl-develをインストールしている
  • --with-serfでserfがインストールされているディレクトリを指定している
  • subversionディレクトリに配置するSQLiteのディレクトリ名にバージョン名(ディレクトリ末尾の数字)を含めてはいけない

ということぐらい。以下のソースコードを移行先となるサーバで実行し、svnクライアントを準備する。

svnsyncを試してみる

準備ができたら、svnsyncを試してみる。移行元となるほうにはすでにダミーのソースコードをおいているので、それが移行先のサーバへコピーされれば成功となる。

1
2
3
4
# これは一度だけ実行すればOK
$ svnsync init file:///opt/svn/repository http://192.168.56.202/svn/
# `svnsync init`した後に定期的に以下を実行すればOK
$ svnsync sync file:///opt/svn/repository

ちゃんとsyncできていれば以下の様な標準出力が確認できるはず。

1
2
3
Transmitting file data ........................................
Committed revision 1.
Copied properties for revision 1.

また、svnlook info /opt/svn/repositoryでリポジトリの情報を確認できることができるので、移行元と移行先それぞれの出力を見比べて、同期ができているかを確認することができる。