svn+sshの設定

公開鍵認証も設定したので、開発するにはやっぱりSubversionがほしいので、svn+sshでアクセスできるように設定します。
まずはインストールと確認

$ sudo yum install subversion
$ svn --version

次は、http://wiki.mmj.jp/index.php?Service%2FSubversion#c2d14f3c を参考に設定していきます。
まずsvnユーザーを作成

# mkdir /var/svn
# groupadd svn
# useradd -g svn -d /var/svn svn
useradd: warning: the home directory already exists.
Not copying any file from skel directory into it.
# chown svn:svn /var/svn
# ls -la /var/svn/
total 8
drwxr-xr-x  2 svn  svn  4096 Apr 11 16:59 .
drwxr-xr-x 22 root root 4096 Apr 11 16:59 ..

次にsvnリポジトリにアクセスするユーザーをグループに追加してコミットできるようにします。

usermod -a -G svn foo

リポジトリを作成します。

# su svn
$ svnadmin create /var/svn/baz-repo
$ ls -la /var/svn/
total 12
drwxr-xr-x  3 svn  svn  4096 Apr 11 17:02 .
drwxr-xr-x 22 root root 4096 Apr 11 16:59 ..
drwxr-xr-x  7 svn  svn  4096 Apr 11 17:02 baz-repo
$

umaskを確認します。002なら要らないらしいのですが、0022と出ました。

$ umask
0022

dbディレクトリのパーミッションを確認

$ cd /var/svn/baz-repo
$  ls -la db/
total 36
drwxr-sr-x 5 svn svn 4096 Apr 11 17:02 .
drwxr-xr-x 7 svn svn 4096 Apr 11 17:02 ..
-rw-r--r-- 1 svn svn    6 Apr 11 17:02 current
-r--r--r-- 1 svn svn    2 Apr 11 17:02 format
-rw-r--r-- 1 svn svn    5 Apr 11 17:02 fs-type
drwxr-sr-x 2 svn svn 4096 Apr 11 17:02 revprops
drwxr-sr-x 2 svn svn 4096 Apr 11 17:02 revs
drwxr-sr-x 2 svn svn 4096 Apr 11 17:02 transactions
-rw-r--r-- 1 svn svn   37 Apr 11 17:02 uuid
-rw-r--r-- 1 svn svn    0 Apr 11 17:02 write-lock

ディレクトリにはSGIDは有効になっているのは確認できたけど、グループの書き込み権限がないので、権限を与える。

$ find db/ -perm +200 -exec chmod g+w {} \;
$ ls -la db/
total 36
drwxrwsr-x 5 svn svn 4096 Apr 11 17:02 .
drwxr-xr-x 7 svn svn 4096 Apr 11 17:02 ..
-rw-rw-r-- 1 svn svn    6 Apr 11 17:02 current
-r--r--r-- 1 svn svn    2 Apr 11 17:02 format
-rw-rw-r-- 1 svn svn    5 Apr 11 17:02 fs-type
drwxrwsr-x 2 svn svn 4096 Apr 11 17:02 revprops
drwxrwsr-x 2 svn svn 4096 Apr 11 17:02 revs
drwxrwsr-x 2 svn svn 4096 Apr 11 17:02 transactions
-rw-rw-r-- 1 svn svn   37 Apr 11 17:02 uuid
-rw-rw-r-- 1 svn svn    0 Apr 11 17:02 write-lock

で、このままだと、svn+sshでのアクセス時に起動されるsvnserveが作成するファイルがグループに書き込み権限のないものになってしまうので、umask 002で動くように、スクリプトを書き換えます。

# cd /usr/bin
# mv svnserve svnserve-org

で、/usr/bin/svnserveは以下のように作成します。

#!/bin/sh
umask 002
/usr/bin/svnserve-org "$@"

で、この新しいスクリプトも実行可能にしておきます。

# chmod 755 svnserve

これでサーバー側の設定はオッケーなはず!


ここからクライアントで確認します。
秘密鍵ssh-agentに使ってもらうために以下のようにした上で

$ ssh-agent bash
$ ssh-add ~/.ssh/foo_bar_id_rsa

リポジトリのURLについて、svn infoしてみます。

$ svn info foo@xxx.xxx.xxx.xxx/var/svn/baz-repo/

これで、リポジトリの情報が表示されたら成功です。

あとは普通にチェックアウトして、何かコミットしてみるといいでしょう。

一応、コミット後、svnリポジトリにグループの書き込み権限がないファイルが作られていないことを確認しましょう。

$ ls -la /var/svn/baz-repo/db/revs/
total 16
drwxrwsr-x 2 svn   svn 4096 Apr 11 17:45 .
drwxrwsr-x 5 svn   svn 4096 Apr 11 17:45 ..
-rw-rw-r-- 1 svn   svn  115 Apr 11 17:02 0
-rw-rw-r-- 1 foo   svn  273 Apr 11 17:45 1
$

Macなら

SSHKeychainの環境設定の[SSH キー]に作成した秘密鍵を登録しておくと便利です。もしかしたら[エージェント]-[一つのキーを追加]から作成した秘密鍵を登録する必要があるかもしれません。
すると、コマンドラインからssh-agent, ssh-addを行う必要がなくなります。

Windowsなら

PuTTYに付属するpagentにキーを登録しておいて、TortoiseSVNとかでpagentを使用するように設定すればクリアしてくれるはずです。結構前にやってたんですけど、忘れましたw。ググってください。