ここではWindows上にCVSサーバを立てる一手段として、 Cygwinを利用した立て方について書いていく。
最初に言っておくと、LinuxなりFreeBSDなりSolarisなりHP-UXなり とにかくUNIX系OSを積んだマシンを用意できるなら、そっちにCVSを積めばよい。 これは、CVSサーバを立てたいがUNIXサーバが手に入らない、 またはCVSの勉強をしたいだけなのでわざわざ別サーバを立てるほどではない、 といった方々を対象としている。
CVSを始めとした構成管理ツールは、現代の開発シーンでは欠かせない要素として認知を得てきているが、 なぜかそれをソフトウェア開発プロジェクトにおけるソース管理にのみ使っているケースが多い。 構成管理ツールによる履歴管理、差分管理機能はプロジェクトにおける全ての成果物に恩恵を与えるものであり、 用途をそのような狭い範囲に限定するのはもったいない。 いつだって、どこでだって、何に対してだって構成管理はしていきたいのである。
ところが、構成管理ツールに馴染めていない無理解な上司や同僚の存在が邪魔して、 または単に予算が無いために、CVSを立てるために必要なUNIX系サーバの導入が難しいことがある。 しかし、構成管理ツールから得られる恩恵を考えれば、この程度のことでへこたれていられないのである。 例え周囲が使わなくとも、自分だけでも構成管理していきたいのだ。 金が無くとも構成管理していきたいのだ。
ならば、最終手段として自分のPCをCVSサーバ化してしまえれば、 どんな状況だろうと構成管理はできてしまうので安心である。 個人の開発機として一般的に使われているのはWindows系のOSだと思うが、 Windows上で使えるCVSとしてはCVSNTが知られている。 しかし、CVSNTはバギーでeclipseとの連携が怪しい(ただし、eclipse3.1からはCVSNTに正式対応している)ため、 Javaを使って開発する場合は不都合がある。 そこで、Windows上で動くUNIXエミュレータであるCygwinの上に普通のCVSを立てる方向でいきたい。
Windows2000上にCygwinを入れて、その上にCVS pserverを立てる。 スーパーサーバにはxinetdを使う。
以下の作業はAdministratorで行うこと。 一般ユーザで行うと、ヘンな動きをすることがある。 セットアップさえ終われば、一般ユーザで使用可能。
http://www.cygwin.com/ からsetup.exeをダウンロードし、これを実行する。 セットアップダイアログが起動するので、 あとは指示に従ってセットアップ作業を続行。
インストールするパッケージを任意に選べるが、 ディスク容量に余裕があれば全て入れてしまったほうが面倒が無くて良い。 パッケージ選択のツリー上で全ての項目がInstallになるようにする。 カスタマイズしたい場合でも、以下のパッケージを含めることを忘れずに。
xinetdが使用するファイルを次のコマンドで生成させる。
いくつか問い合わせがあるが、全てyes
と答えれば良い。
$ /usr/bin/xinetd-config |
続いてchkconfigに喰わせて、マシンのブート時に勝手に起動するよう設定する。 デフォルトでランレベル3,4,5のときに起動するようになる。
$ /usr/sbin/chkconfig --add xinetd |
確かに設定されたか確認する。2行目のような行がでてくるはずである。
$ /usr/sbin/chkconfig --list xinetd xinetd 0:off 1:off 2:off 3:on 4:on 5:on 6:off |
xinetdは起動する際に/var/lock/subsys/xinetdというロックファイルを作ろうとするので、 あらかじめ/var/lock/subsys/を作っておく。
$ mkdir /var/lock $ mkdir /var/lock/subsys |
initをWindowsのサービスとして登録する。
最初のinittabの上書き、/etc/rcの上書き、サービス登録と3回yes/noを聞かれる。
最初だけno
とし(生成されるinittabは中身がいい加減なので、これを使うとまともにブートしなくなる)、
残る2つはyes
にする。
$ /usr/bin/init-config |
これでマシンのブート時にinitが起動し、initがxinetdを起動するようになる。 コントロールパネルの管理ツール->サービスを参照し、 initという名前のサービスが起動していることを確認する。 また、Cygwinで次のコマンドを打って、xinetdが起動していることを確認する。
$ ps -ef | grep xinetd SYSTEM 1692 1 ? 09:37:48 /usr/sbin/xinetd |
リポジトリを作る(パスは任意。ここでは/var/cvs/repo
とする)。
$ mkdir /var/cvs $ mkdir /var/cvs/repo $ cvs -d /var/cvs/repo init |
CVS用のユーザをCVSROOT/passwdファイルに設定する。 passwdファイル内に書き込まれるパスワードは暗号化しなければならないが、 この暗号化処理はCVSから提供されない。 Apacheに含まれているhtpasswdか、 cvsadduserスクリプト(Perlで書かれている)を用意しておくように。 ここではcvsadduserを使うものとする。
$ cd /var/cvs/repo $ ./cvsadduser >> CVSROOT/passwd cvs account: hoge (CVSユーザ名。任意) password: (パスワード) Re-enter password: (確認のためもう一度パスワード) real account (can be omitted): ahoge (Cygwin上のユーザ名。実際はこのユーザの権限でアクセスされる) |
CVSROOT/passwdの中身は、次のようになっているはずである。
hoge:Rb6QQXvRRSijg:ahoge |
/etc/services
を編集し、次の一行を加える。
cvspserver 2401/tcp |
xinetdに食わせるべく、/etc/xinetd.d/cvspserverを作る。 中身は以下。
service cvspserver { disable = no flags = REUSE socket_type = stream protocol = tcp wait = no user = SYSTEM passenv = server = /usr/bin/cvs server_args = -f --allow-root=/var/cvs/repo pserver } |
xinetdを再起動してcvspserverの設定を食わせる。
$ /etc/rc.d/init.d/xinetd restart |
テストとして、適当なディレクトリでログインし、CVSROOTをcheckoutしてみる。
$ export CVSROOT=:pserver:ユーザ名@localhost:/var/cvs/repo $ cvs login Logging in to :pserver:ユーザ名@localhost:2401/var/cvs/repo CVS password: (cvsadduserで作ったパスワード) $ cvs checkout CVSROOT cvs server: Updating CVSROOT U CVSROOT/checkoutlist U CVSROOT/commitinfo U CVSROOT/config U CVSROOT/cvswrappers U CVSROOT/editinfo U CVSROOT/loginfo U CVSROOT/modules U CVSROOT/notify U CVSROOT/rcsinfo U CVSROOT/taginfo U CVSROOT/verifymsg |
checkoutできたら、うまくいったついでにCVSROOT/configを編集してSystemAuthをnoにする。 これはセキュリティを強化するための措置である。
SystemAuth=no |
commitして変更を確定する。
$ cvs commit -m "SystemAuth changed." config |
以上で全工程完了である。 戯れに作ったプログラム、業務で書くハメになったドキュメント、 ちょっとした覚書等をガンガン登録して構成管理していくのである。 Officeで書いたドキュメントやイメージファイルといったバイナリファイルは差分を取れないが、 それでも履歴管理はできる。そのためだけでも使う価値がある。
いちいちファイル名の後ろに日付を付け足すといった幼稚な管理はもうやめよう。 それが入用になったとき、多分ファイルの存在は忘れられているのであり、 後に見かけることがあっても 「何のために残したんだっけ?まぁいちおう置いておくか」 といった弱腰な心理が働いて 未来永劫使わないゴミファイルを増やしていくことになってしまう。 成果物はきれいに、効率的に管理していこう。
(2006年05月追記)ただし、現在ではこんな手間のかかることをするぐらいならSubversionを導入してしまったほうがよい。Windows用のバイナリが提供されているので、インストールも簡単、かつCVSより高機能だ。