Trac 0.12 導入時のメモ(インストール編)

Trac 0.11 から Trac 0.12 へ移行を考えている人や、Windows 認証を用いた Trac/Subversion の設定、SVK を利用したミラー サーバの構築といった参考になるかもしれないので、だらだらとメモっておく。

なお、内容については、1時間半ぐらいでザーッと一気に設定したものを思い出しながら書き起こしているため、内容に漏れや間違いがあった場合はコメント等で指摘してください。しかし、たった1時間半の作業を文章に起こすのに何時間かかってるんだ、これ…。

2. Python のインストール

http://www.python.org/download/ より Windows 用バイナリをセットアップ。
apache と同じく Subversion Binding のバイナリ版が x86 で提供されるため x86 版を使用する。また、現時点では Python 2.7 用の Subversion Binding が提供されていなため Python 2.6 を導入する。
インストール後、お好みに応じて環境変数 PATH に C:\Python26 と C:\Python26\Scripts を追加する。*1

*1:私はシステム環境変数に C:\Python26 を追加し、C:\Python26\Scripts はユーザ環境変数に設定しています。

3. Subversion のインストール

http://subversion.apache.org/ より、Windows 用バイナリの zip を展開する。
最低限度必要なのは svn-win32-X.Y.Z.zip と svn-win32-X.Y.Z_py.zip となる。

PS bin> Get-ChildItem *.so `
>> |% { Get-Dependency $_ } `
>> |? { Test-Path $_.name } `
>> |% { Copy-Item $_.name "C:\Program Files (x86)\Apache Software Foundation\Apache2.2\modules" }
  • Python Binding (svn-win32-X.Y.Z_py.zip)を展開し、Python のインストール先の site-packages へ
  • libsvn の _*.dll を _*.pyd へリネームする
PS libsvn> Get-ChildItem *.dll `
>> |? { $_.name.startsWith("_") } `
>> |% { Rename-Item $_.name $_.name.replace(".dll", ".pyd") }

*1:Get-Dependency は depends.exe のラッパーで、PowerShell の標準コマンドには含まれていません。

5. Trac-ja のインストール

Trac 0.12 は、インストール時に Babel がインストール済みの場合は多言語版をインストールし、Babel がインストールされていない場合は英語版をインストールするようになっています。このため、まずは Babel をインストールします。

http://babel.edgewall.org/wiki/Download から Babel のソースを取得して展開し、setup.py を実行してインストールします。

PS Babel-0.9.6> python setup.py install

次に、Trac-Ja をインストールします。http://www.i-act.co.jp/project/products/products.html より、Trac-ja 0.12 の最新版を展開し、Babel と同様に setup.py を実行してインストール。

PS Trac-0.12.2.ja1> python setup.py install

もし、Babel を入れずにインストールしてしまったら、この setup.py を再実行すれば OK です。

6. SVK のインストール


SVK を用いない・SVK に興味がない人は、SVK 関連は読み飛ばしてください。
今回のプロジェクトでは複数の拠点に分散した開発になっており、最終的なソース管理は1つのリポジトリで行うが同時に複数のチームが作業する。マスターとなるリポジトリでは夜間自動ビルド等が実行されているので中途半端なコードをコミットできなかったり、作業用の臨時ネットワークの速度や、管理権限がないので hook が設定できないとか、そういった諸々を考慮して自分たちのチームが管理するソースはローカルのリポジトリで管理する形での開発を行うため、SVK をサーバサイドのミラーツールとして利用する。(概略図)
http://svk.bestpractical.com/view/HomePage の SVKWin32 からバイナリ版をダウンロードしインストール。現時点の SVK 2.2.0 のバイナリでは、使われている Subversion 1.5.2 と少し古くて (3.) で Subversion 1.6.17 をインストールしていると Subversion 側で作成したリポジトリへアクセスできないという問題がでる。

  1. [正道]Python と同じように PerlSubversion Binding をインストールして CPAN から SVK を入れる。
  2. [回避策]リポジトリ作成は SVK で行う。(1.6 系から 1.5 系のリポジトリを読み書きできるから)
  3. [邪道]svk の参照する DLL を (3.) でインストールしたものに置き換えて、Binding は古いままバックエンドだけ 1.6.17 に変更して利用(インターフェースの変更がないので可能)

といった対策が必要になる。私は、Perl 入れるのは手間がかかりすぎるので悪い子になります。

7. Subversion リポジトリの作成

この環境では、Subversion リポジトリの作成には、Subversion を使用する方法と、SVK を使用する方法があります。ここでは、Subversion を使用してリポジトリを作成して SVK の depotmap に割り当てます。
Subversionリポジトリを作成するのは簡単で、TortoiseSVN をインストールしていれば、空フォルダを右クリックして「ここにリポジトリを作成」を選ぶだけですし、コマンドラインでも svnadmin create を実行するだけです。

PS temp> mkdir D:\repos\project1
PS temp> svnadmin create D:\repos\project1

リポジトリの作成時に使用できるオプションはいくつかありますが、ほぼ全ての場合でオプションの指定は必要ないはずです。次に SVK の depotmap の設定を行います。

PS temp> $env:SVKROOT = "D:\etc\svk"
PS temp> svk depotmap // D:\repos\project1

 または

PS temp> $env:SVKROOT = "D:\etc\svk"
PS temp> svk depotmap /proj1/ D:\repos\project1

環境変数 SVKROOT は SVK の管理ファイル*1を置く場所です。svk コマンドを実行する場合には常に設定しておく必要があり、省略するとホームディレクトリに .svk という名前で作成されます。*2 SVK は複数のリポジトリを管理することができるようになっており、各リポジトリに名前をつけて使用します。depotmap コマンドは、*3リポジトリに名前をつけるコマンドで

svk depotmap /{NAME}/ {PATH}

と使用します。上記の例では NAME に空文字列を指定し、作成した Subversion リポジトリを設定しています。SVK では慣例的に最初のローカル リポジトリは名前なしで登録するようになっていますが、わかりにく場合は2例目のように適当に名前をつけてもかまいません。*4また、指定された PATH にリポジトリが存在しない場合、Subversion リポジトリを作成するか聞いてきます。(6.) の段階でリポジトリの作成を SVK に任せるという選択をした場合、Subversion 側でリポジトリを作成しないで svk depotmap を呼び出すことで、SVK 側でリポジトリを作成することができます。*5

[TIPS]
svk depot --list                        ... 登録されている名前とリポジトリを一覧表示
svk depot --detach /{NAME}/             ... 登録を解除する(リポジトリは削除されません)
svk depot --relocate /{NAME}/ {PATH}    ... 登録先を PATH に変更する

*1:config と cache という2つの名前が SVK で使われます。

*2:Windows の場合、C:\Users\{USERNAME}\.svk\ や C:\Document and Settings\{USERNAME}\.svk\ などになります。

*3:省略形 depot

*4:1つのリポジトリを2つの名前で登録することもできるので、私は全てのリポジトリに名前をつけておいて、頻繁に作業することがある場合だけ無名で二重登録しています。

*5:通常は SVK インストール直後に svk depot -i を実行します。これは、svk depotmap // %SVKROOT%\local を実行して、リポジトリの作成に対して yes と答えるのと同じ意味になります。Windows 環境であれば、C:\Users\{USERNAME}\.svk\local に Subversion リポジトリが作成され、名前なしでアクセスできるようになります。

8. SVK ミラー作成と同期

SVK に親となるマスター リポジトリを登録します。SVK は事前に登録しておいたミラー設定によって、svm (SVK:Mirror) を使用してミラー元リポジトリから差分を取得したり、ミラー元リポジトリへ差分をコミットしたりできます。

PS temp> svk mirror //vendor/trunk http://vpn001.example.co.jp/svn/project1/trunk/

 または

PS temp> svk mirror /proj1/vendor/trunk http://vpn001.example.co.jp/svn/project1/trunk/

mirror コマンドは、*1 depotmap コマンドと同様に関係を登録するだけですので何もしません。使用方法もよく似ています。

svk mirror /{NAME}/{PATH} {URL}

NAME で指定されたリポジトリ内に、 PATH という階層で URL で指定したリポジトリのミラーを作成するという指定になります。depotmap で指定されたリポジトリに PATH で指定した空ディレクトリが作成されます。上記の例だと Subversion リポジトリに /vendor/trunk/ というディレクトリが作成されているはずです。*2 SVK の利用サンプルではミラー先の PATH に /mirror が利用されていることが多いですが、コマンド名とかぶってわかりにくいかもしれない&Subversion の利用例では /vendor が多いということで、Subversion は使ったことがあるけど SVK は使ったことがない人にもわかりやすいリポジトリ構造になるように、/vendor と指定しました。

[TIPS]
svk mi --list                            ... 登録されているミラーの一覧を表示する
svk mi --detach /{NAME}/{PATH}           ... 登録されているミラーを解除する
svk mi --relocate /{NAME}/{PATH} {URL}   ... 登録先を URL に変更する

ミラーの設定を行ったら、初回のミラーリングを行います。初回のミラーリングには

といった手段が考えられます。このうち dumpfile から作成する場合は mirror コマンドで登録する際に dumpfile を指定する必要があります。*3

PS temp> svk sync //vendor/trunk

 または

PS temp> svk sync /proj1/vendor/trunk

とすると、svm によって自動的に前回の続きから全てのリビジョンが取り込まれます。歴史のあるリポジトリに対してこれを実行するとすごいことになるので、最新リビジョンだけ取得すればよい場合は、

PS temp> svk sync --skipto HEAD //vendor/trunk

 または

PS temp> svk sync --skipto HEAD /proj1/vendor/trunk

とします。HEAD の代わりに具体的なリビジョン番号を指定して、そのリビジョン番号からミラーリングを開始することもできます。sync コマンドに指定したオプションやネットワーク速度、親リポジトリの歴史等にもよりますが、親リポジトリのすべての変更を取得するように指定したりすると、この作業には時間がかかります。

[TIPS]
svk sync --all          ... 登録されている全てのミラーを最新にする

*1:省略形 mi

*2:ミラーの設定そのものは Subversion の属性で管理されています。

*3:使ったことはないのですが、svk mirror を実行する時に --bootstrap={dumpfile} と、初期登録する dumpfile を指定すればいけるはずです。

9. 作業フォルダの作成

実際の作業に使用するフォルダを Subversion 上に作成します。SVK の copy コマンドを使用して

PS temp> svk copy //vendor/trunk //trunk

 または

PS temp> svk copy /proj1/vendor/trunk /proj1/trunk

と、ミラー先をコピーします。この例のようにコピーすると作業場所は Subversion リポジトリの /trunk になりますので、TortoiseSVN 等の Subversion クライアントを使用して作成しておいたリポジトリの /trunk をチェックアウトして作業を行うことができます。コピー先をリポジトリのルート階層以外にする場合、先にディレクトリを作成しておく必要があります。

PS temp> svk mkdir //work
PS temp> svk copy //vendor/trunk //work/trunk

 または

PS temp> svk mkdir /proj1/work
PS temp> svk copy /proj1/vendor/trunk //work/trunk

たとえば、この例なら Subversion リポジトリに /work を作成して /work/trunk にコピーしました。当然ですが、Subversion クライアントを使用して /work というディレクトリを事前に作成しておいても OK です。以降の例では、/trunk へコピーを行ったということにしておきます。