Pushmi つかってます & 技術者募集中 at 福岡 3
弊社 は東京と福岡にオフィスがあり、それぞれの拠点に Subversion + Trac 環境を構築し、OpenVPN により VPN 接続してお互いの開発状況を公開しています。サービス絡みの開発は基本的に、東京は東京、福岡は福岡で完結しているので、この方式で問題はないのですが、サーバ管理関連のスクリプトなんかは、東京と福岡で共通するものが多いため、別々の SVN リポジトリで管理されてると不便なんですよね。かといって、どちらかの拠点だけしかリポジトリがないと、VPN の障害発生時に、リポジトリのない拠点からはまったくアクセスができない、という困ったことになってしまいます。
そこで、SVN リポジトリレプリケーションツール Pushmi を導入してみました。詳細は YAPC::Asia での 作者 Cl Kao によるスピーチ動画 を見て頂くとして、ここでは行った設定についてメモを残しておきます。ほとんど perldoc Pushmi の内容と同じですが。
まず当然 Pushmi のインストールが必要です。これの手順は省略。また、より良いアトミックロック実現のために memcached を利用している、ということなのでインストールしておきます。これも手順は省略。
memcached を起動します。
$ sudo /usr/bin/memcached -p 8123 -dP /var/run/memcached.pid -u nobody
/etc/pushmi.conf を設定します。弊社の環境では memcached のポートのみ指定してます。
authproxy_port: 8123
ミラーリポジトリを作成します。
$ pushmi mirror /var/db/my-local-mirror http://master.repository/svn
Mirror initialized.
ミラーリポジトリとマスターリポジトリを同期します。
$ pushmi sync /var/db/my-local-mirror
Retrieving log information from 1 to 62
ミラーリポジトリは、svnadmin create で作成するのと同様なディレクトリ、ファイル構造になってますが、Pushmi 用の pre-commit スクリプトと post-commit スクリプトが置かれている、というところが異なります。
pre-commit では以下の様なコマンドが実行され、ミラーリポジトリにコミットされた内容を、マスターリポジトリにコミットしに行きます。
/usr/bin/pushmi runhook $1 --txnname $2
post-commit では以下の様なコマンドが実行され、ミラーとマスターの整合性を確認しています。
/usr/bin/pushmi verify $1 --revision $2
Apache + WebDAV で SVN リポジトリにアクセスするために、以下の様な設定を Apache で行います。
<Location /svn/server>
PerlSetVar SVNPath /var/db/my-local-mirror
PerlSetVar Pushmi /usr/bin/pushmi
PerlSetVar PushmiConfig /etc/pushmi.conf
<LimitExcept GET PROPFIND OPTIONS REPORT>
AuthName "mirrored private area"
AuthType Basic
Require valid-user
AuthLDAPURL ldap://localhost:389/ou=people,o=paperboy?uid?sub?(objectclass=*)
PerlAuthenHandler Pushmi::Apache::AuthCommit
</LimitExcept>
</Location>
設定見て分かると思いますが、mod_perl を利用していて、Apche2 + mod_perl の環境が必要です。Apache は 2.0 系でも 2.2 系でも大丈夫なようです。弊社では 2.0 系を利用しています。
特にポイントとなるのは、
PerlAuthenHandler Pushmi::Apache::AuthCommit
の部分で、認証で渡されたユーザ名、パスワードをこのモジュールで memcached にキャッシュしておき、マスタリポジトリへのコミット時の認証に利用します。Apache 2.2 系の場合には、以下の様に設定します。
AuthBasicProvider Pushmi::Apache::RelayProvider
この状態では、ミラーへのコミットは即マスターに反映されますが、マスターへのコミットはミラーに反映されませんので、以下の様な cron 設定を行い、5分おきにマスターとミラーを同期するようにします。
*/5 * * * * /usr/bin/pushmi sync --nowait /var/db/my-local-mirror
今のところこれで問題なく動いています。
話変わりまして、弊社福岡支社では、プログラマ と サーバエンジニア を募集しています。Pushmi を実戦で使ってみたい!という方はぜひ。メガネ女子プログラマもいますよ。(東京本社にもいます。人妻ですが。)
技術力無い上にアフォな僕ですが、短期でいいのでアルバイトで雇って欲しいのですが。 あ、てもドクターペッパーは大好きです。 あと、メガネ女子も大好きです。
すいません、Submit押しても何もおこらなかったので、なんかしてたらspamみたくなってしまいました。ごめんなさい。
重複分は削除しておきました。気になさらないでくださいね。わかりにくいこのブログシステムが悪いんです。
雇ってほしいとのことですが、具体的にお話伺ってみたいので、後ほどメールお送りしますね。よろしくお願いします。