Subversionの設置

UbuntuSubversionリポジトリを置いてアクセスできるようにしてやりたいと思いやってみた時のメモです。

Subversionの設置

Subversionのインストール
$ sudo apt-get install subversion
実行ユーザの作成

いまのところSubversionのみですが、将来的にはGitなど他のリビジョンコントロールシステムをトライしてみたくなったり必要になったりする可能性があるかもしれません。
よって リビジョンコントロールシステム > Subversion という階層概念をユーザでもディレクトリでも設けたいと思います。

# リポジトリ管理ユーザrcs (revision control system) の作成
$ sudo useradd rcs
# Subversion管理ユーザの作成
$ sudo useradd svn -g rcs
リポジトリ格納用ディレクトリの作成
$ cd /var
$ sudo mkdir repos
$ sudo chown rcs:rcs repos
$ cd /var/repos
$ sudo su rcs
$ mkdir svn
$ chown svn svn
svnserveの設定

リポジトリへのアクセスは Table 1.1. Repository access URLs / Version Control with Subversion によると以下のような方法があるようです。

Schema Access method
file:/// ローカルディスクにおける直接アクセス
http:// ApacheにおけるWebDAVプロトコル
https:// http:// と同様。ただしSSL使用。
svn:// svnserver という独自サーバ経由で
svn+ssh:// svn:// と同様。ただしSSHトンネル経由で

今回のSubversionリポジトリはLANあるいはVPN内から自分だけがアクセスするのみです。よってこのレイヤではセキュリティについてあまり頭悩ませたくないので、とりあえず簡単だと触れ込みのあるsvnserverを設定してやりたいと思います。
svnserverの主なメリット・デメリットを The svnserve Server / Version Control with Subversion より一部抜粋。

  • メリット
    • セットアップが簡単
    • WebDAVより断然速い
  • デメリット
    • 認証の方法がひとつしかなくてその上暗号化されてないしサーバにストアされてるパスワードが平文
    • あらゆるロギングがない
# svnユーザにスイッチ
$ sudo su svn
# svnserveで包括的に扱う設定を設置
$ cd /var/repos/svn
$ mkdir .conf

/var/repos/svn/.conf/svnserve.conf

[general]
anon-access = read # 匿名ユーザは read を許す
auth-access = write # 認証されたユーザは write を許す
password-db = passwd # 認証ユーザの情報を記したファイルのパスを指定
authz-db = authz # アクセス制限を定義したファイルのパスを指定

/var/repos/svn/.conf/passwd

[users]
naoyes = password # ユーザ名 = パスワード とする。なんと平文

/var/repos/svn/.conf/authz

[groups]
admin = naoyes # グループ名 = ユーザ名1, ユーザ名2, ... とする。
[/] # すべてのリポジトリのすべてのディレクトリに対する設定
* = r  # どんなグループも read は出来るよ
@admin = w # admin グループに属しているユーザは write も出来るよ
svnserveをデーモンモードで起動

-r でルートディレクトリを、 --config-file で先ほど設定したファイルを指定してやります。ルートはApacheなどのWebサーバで言うところのドキュメントルートみたいなものですね。クライアントからアクセスするときにルートディレクトリに対する相対パスになるので便利だしセキュアになります。

$ svnserve -d -r /var/repos/svn --config-file /var/repos/svn/.conf/svnserve.conf
$ nmap localhost | grep svn
3690/tcp open  svn

3690ポートで待ち受けるようになりました。

ドメイン名を付与

DNSを設定してそれっぽい名前でアクセスできるようにしてやります。名前は svn.repos.mnb とします。ちなみに当たり前ですが別名を特につける必要性がなかったらこの項は飛ばしても問題ありません。

# ゾーンファイルに設定を追加
$ echo 'svn.repos IN CNAME argyle ;' >> /etc/bind/db.mnb

# BIND9の再起動
$ sudo service bind9 restart
 * Stopping domain name service... bind9
   ...done.
 * Starting domain name service... bind9
   ...done.

# 名前が引けるか確認してみます。大丈夫そうです。
$ nslookup svn.repos.mnb
Server:         127.0.0.1
Address:        127.0.0.1#53

svn.repos.mnb   canonical name = argyle.mnb.
Name:   argyle.mnb
Address: 192.168.24.93

以上でSubversionを使う準備ができました。

使ってみる

リポジトリを作成する。

svnservを建てたUbuntuでの作業です。

$ sudo su svn
$ svnadmin create /var/repos/svn/sandbox
いろいろ試してみましょう。

Ubuntu上で試しても良かったのですが、せっかくなので別のマシンから試してみます。今回は同一ネットワーク内にあるMacBook Proから。Subversionクライアントはずいぶん前にインストール済みです。

# チェックアウト
$ svn co svn://svn.repos.mnb/sandbox 
Checked out revision 0.

# コミット
#  パスワードを聞かれるので /var/repos/svn/.conf/passwd  で設定したパスワードを入力
$ cd sandbox
$ mkdir trunk branches tags
naoyes-mac:sandbox naoyes$ svn add trunk branches tags
A         trunk
A         branches
A         tags
$ svn ci -m 'initial commit.'
Authentication realm: <svn://svn.repos.mnb:3690> deda8c52-cbcc-4820-83b3-275dd4b45269
Password for 'naoyes': 
Adding         branches
Adding         tags
Adding         trunk

Committed revision 1.

# ログの確認
$ svn log svn://svn.repos.mnb/sandbox
------------------------------------------------------------------------
r1 | naoyes | 2011-11-20 17:38:09 +0900 (日, 20 11 2011) | 1 line

initial commit.
------------------------------------------------------------------------

チェックアウト、コミット、ログの参照など無事に行うことが出来ました。