ソースコードのバージョン管理を行うため、バージョン管理システム Subversion を CentOSサーバーに導入します。

Subversionは、バージョン管理システム CVS の問題点を解決すべく開発され、Windowsでの統合開発環境 Eclipse から使用するためのプラグインも存在しています。

インストール

CentOSの標準リポジトリにある Subversionはバージョンが 1.6.xですので、Subversion関連サービスを提供する米 WANDisco社のリポジトリからバージョン 1.8.xをインストールすることにします。
《先頭文字 $ は一般ユーザーを表しています》
# 署名確認用のキーファイルをインストールします
$ sudo rpm --import http://opensource.wandisco.com/RPM-GPG-KEY-WANdisco

# WANDiscoリポジトリの定義ファイルを新規に作成します
$ sudo vi /etc/yum.repos.d/wandisco-svn.repo
----------(vi ここから)----------
[WandiscoSVN]
name=Wandisco SVN Repo
baseurl=http://opensource.wandisco.com/centos/6/svn-1.8/RPMS/$basearch/
enabled=1
gpgcheck=1
priority=83
----------(vi ここまで)----------

# CentOSの標準リポジトリのSubversionを対象外にします
$ sudo vi /etc/yum.repos.d/CentOS-Base.repo
----------(vi ここから)----------
     :
[base]
     :
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
priority=10
#パッケージを対象外にします
exclude=subversion*

#released updates
[updates]
     :
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
priority=10
#パッケージを対象外にします
exclude=subversion*

#additional packages that may be useful
[extras]
     :
----------(vi ここまで)----------

# Subversionをインストールします
$ sudo yum -y install subversion

# バージョンを確認します
$ svn --version
svn, version 1.8.9 (r1591380)
   compiled May  1 2014, 17:18:01 on x86_64-unknown-linux-gnu
     :
44,45行目 2014/06/14現在のバージョンです
※ 以降の内容は subversion-1.8.9-1.x86_64 (2014/06/14現在)を対象に記述しています。

初期設定

セキュリティや管理面から Subversioyn用グループを作成し、SSH接続用の設定を行います。
また、Subversionのルートディレクトリを作成します。
《先頭文字 $ は一般ユーザーを表しています》
# Subversion用グループ svn を作成します
$ sudo groupadd svn

# SubversionをSSH接続で使用しますので、作成したSubversion用グループのSSH接続を許可します
$ sudo vi /etc/ssh/sshd_config
----------(vi ここから)----------
       :
# 空白に続けて svnグループを追加します
AllowGroups ...(略)... svn
       :
----------(vi ここまで)----------

# SSHデーモンを再起動して、設定を反映させます
$ sudo service sshd restart

リポジトリの作成

プロジェクトのリポジトリとログインユーザーを作成します。
管理およびセキュア面からプロジェクトの参加メンバーでログインユーザーを作成することはせず、プロジェクト単位でログインユーザーを作成します。
以下の例では、プロジェクト名を svnproject、プロジェクトへのログインユーザー名を svnlogin としています。
《先頭文字 $ は一般ユーザーを表しています》
# Subversionのルートディレクトリを作成します
$ sudo mkdir -p  /home/svn
$ sudo chgrp svn /home/svn
$ sudo chmod 770 /home/svn

# プロジェクトのリポジトリを作成します
$ sudo svnadmin create --fs-type fsfs /home/svn/svnproject

# プロジェクトのログインユーザーを作成します
$ sudo useradd svnlogin -g svn -d /home/svn/svnproject

# リポジトリのパーミッションをプロジェクトのログインユーザーに変更します
$ sudo chown -R svnlogin.svn /home/svn/svnproject
$ sudo chmod -R 770 /home/svn/svnproject
$ sudo chmod    750 /home/svn/svnproject
$ sudo chmod g+s    /home/svn/svnproject/db

# プロジェクトのログインユーザーでリポジトリを初期化します
$ sudo su - svnlogin
[svnlogin]$ mkdir -p svntemp/trunk svntemp/branches svntemp/tags
[svnlogin]$ svn import svntemp file://localhost/home/svn/svnproject -m "Create the Initial Directory"
[svnlogin]$ rm -rf svntemp
[svnlogin]$ exit

参加メンバーの鍵セット作成

Subversionサーバーへの接続は SSHによるセキュア接続のみで行うことにします。
また、SSHを使用することにより、セキュア接続だけではなく、プロジェクトへの参加ユーザーをログインユーザーとして作成しなくてもいいというメリットもあります。

プロジェクト(リポジトリ) svnproject へのログインユーザーは svnlogin で作成しました。
プロジェクトメンバーの識別は OpenSSHの公開鍵を使用した tunnel機能を用いて行います。
各メンバーの公開鍵をサーバー(ログインユーザー svnlogin)に登録しておき、メンバーはログインユーザー svnloginで SSH接続します。
メンバーの公開鍵に書かれた情報を元に、Subversionのユーザーとリポジトリディレクトリが自動的に設定されます。

PuTTY・鍵セットの作成OpenSSH・鍵セットの作成 を参照して、各プロジェクトメンバーが各々鍵セットを作成します。
プロジェクトメンバーで鍵セットを作成できない場合は、メンバーからパスフレーズを受け取り、サーバー側で鍵の作成を代行することができます。
既に SSHの鍵セットを所有しているメンバーの場合は、新たに鍵セット作成する必要はなく、所有している鍵を使用して構いません。
鍵セット作成の代行作成 ...《先頭文字 $ は一般ユーザーを表しています》
# プロジェクトのログインユーザーで鍵セットを代行作成します
# 以下の例では、代行作成する対象メンバーを pjmember としています
$ sudo su - svnlogin
[svnlogin]$ ssh-keygen -t rsa -C "Subversion Project - svnproject : pjmember"
Generating public/private rsa key pair.
Enter file in which to save the key (/home/svn/svnproject/.ssh/id_rsa): [Enter]
Created directory '/home/svn/svnproject/.ssh'.
Enter passphrase (empty for no passphrase): [メンバーから受け取ったパスフレーズ]
Enter same passphrase again: [パスフレーズ再入力]
     :

.sshディレクトリ内に作成された鍵セット id_rsaid_rsa.pub をメンバーに渡します。
秘密鍵 id_rsaサーバーから削除し、公開鍵 id_rsa.pub は参加メンバー登録で使用します。

参加メンバー登録

参加メンバーから公開鍵 id_rsa.pub を受け取ったら、ログインユーザー svnlogin に登録します。
《先頭文字 $ は一般ユーザーを表しています》
# プロジェクトのログインユーザーでメンバーの公開鍵を登録します
# 以下の例では、登録する対象メンバーを pjmember としています
$ sudo su - svnlogin

# .sshディレクトリが存在しない場合は作成します
[svnlogin]$ mkdir .ssh
[svnlogin]$ chmod 700 .ssh

# tunnel設定を受け取った公開鍵の ssh-rsa の直前に付加します
# また、公開鍵の末尾に空白をひとつ空けて管理用のコメントも付加しておきます
[svnlogin]$ vi id_rsa.pub
----------(vi ここから)----------
command="svnserve -t --tunnel-user=pjmember -r /home/svn/svnproject",no-port-forwarding,no-agent-forwarding,no-X11-forwarding,no-pty ssh-rsa ...(中略)... 末尾に空白をひとつ空けて任意の管理用コメントを追加します
----------(vi ここまで)----------

# 公開鍵を登録します
[svnlogin]$ cat id_rsa.pub >> .shh/authorized_keys
[svnlogin]$ rm  id_rsa.pub
[svnlogin]$ exit
 tunnel設定の --tunnel-userが Subversionのユーザーになります。
 tunnel設定の -r オプションにより、プロジェクトリポジトリをトップレベルディレクトリにしています。
各メンバーはログインユーザー svnloginでリポジトリに SSH接続します。

フィードバック

記事の内容についてのご質問、ご指摘、その他ご意見等は下記にてお願いいたします。
System House ACT公式ブログ内記事 :
Subversion - サーバー構築 バージョン管理システム

トラックバックまたはコメントにてお寄せください。