Trac/SVNサーバの構築と運用

今更感もありますがプロジェクト管理ではTracを愛用しています。Wikiもコードハイライトがしっかり効くので使いやすいですし、Subversionと連携しているのでリンクの作成やちょっとブラウジングする場合も重宝します。もちろん、チケットを使ってタスクを管理しておけばプロジェクトの管理も楽になります。
ところが、いざ導入するとなると導入方法や設定方法など面倒な所もあり、さくっと構築するというわけにもいきません。このメモを使えば30分程度で環境を構築できますので、試しにVMにでも入れてみてください。尚、OSはCentOSを使っています。

準備

使用した環境はVM Ware Server2上のCentOS5.3です。VMCentOSをインストールする手順は割愛します。基本的に何も追加パッケージを入れ無くとも十分です。

Python

PythonはCentOS5.3にデフォルトで2.4系がインストールされていますので確認します。Python2.4は最新版ではありませんが、CentOSでは色々なスクリプトPythonを使っているため、バージョンアップはしない方が無難です。

$ python -V
Python 2.4.3

Subversion

バージョン管理システムSubversionを使います。

$ svn --version
svn, バージョン 1.4.2 (r22196)

インストールされていない場合は、yumでインストールしてください。

$ sudo yum install subversion

mod_dav_svn (Option)

Apache経由でリポジトリを閲覧するならば必要です。

$ sudo yum install mod_dav_svn

mod_wsgi

ApacheからPythonをキックするにはmod_pythonなど幾つかの方法がありますが、最近のオススメはmod_wsgiとのことです*1yumではインストールできないので、ソースコードをダウンロードしてmakeします。

$ sudo yum install httpd-devel python-devel
$ wget http://modwsgi.googlecode.com/files/mod_wsgi-2.5.tar.gz
$ tar xvfz mod_wsgi-2.5.tar.gz
$ cd mod_wsgi-2.5
$ ./configure
$ make
$ sudo make install

ez_setup

ez_setupPythonのライブラリ管理ツールで、RubyのGemsやPHPpearに相当するものです。この後のインストールで必要になるので導入します。

$ wget http://peak.telecommunity.com/dist/ez_setup.py
$ sudo python ez_setup.py

Genshi

GenshiTracで採用しているテンプレートエンジンです。easy_installを使ってインストールします。

$ sudo easy_install Genshi

DocTools(Option)

DocToolsはReST(ReStrucruedText)というWikiを拡張できる構文を利用する為には必要です。

$ sudo easy_install docutils

尚、環境によってはエラーが発生します。

Searching for docutils
Reading http://pypi.python.org/simple/docutils/
Reading http://docutils.sourceforge.net/
Best match: docutils 0.5
Downloading http://prdownloads.sourceforge.net/docutils/docutils-0.5.tar.gz?download

どうもダウンロードエラーになるようです。「?download」が邪魔な様なので次のようにURLを指定してください。

$ sudo easy_install docutils http://prdownloads.sourceforge.net/docutils/docutils-0.5.tar.gz

pygments(Option)

pygmentsはコードのシンタックスハイライトの為に必要です。あるとないではかなり使いやすさが違いますので必須です。

$ sudo easy_install pygments

Trac

Tracの本体はインタアクト社が翻訳しているバージョンをインストールします。

$ wget http://www.i-act.co.jp/project/products/downloads/Trac-0.11.4.ja1.zip
$ unzip Trac-0.11.4.ja1.zip
$ cd Trac-0.11.4.ja1
$ sudo python ./setup.py install

AccountManagerPlugin

AccountManagerPluginはアカウント管理用のプラグインは必須です。

$ sudo easy_install http://trac-hacks.org/svn/accountmanagerplugin/0.11

プラグインは各Tracのプロジェクトにインストールする方法と、Pythonのライブラリとしてインストールする方法があります。前者は他の個々のプロジェクト毎にインストールしたいものを管理し、全体で使用するようなプラグインはeasy_installでライブラリとしてインストールしてしまいましょう。

Pythonのdefaultencodingをutf-8にする

Pythonのdefaultencodingはasciiです。スクリプトでは優先度などを日本語化していますが、これを有効にするにはdefaultencodingをutf-8にする必要があります。
/usr/lib/python2.4/site-packages/sitecustomize.py を開き、次のコードを追加してください。

import sys
sys.setdefaultencoding("utf-8") 

優先度などを日本語化しない場合は不要です。

ディレクトリ構成

Tracを構築する場合に悩ましいのがどんなディレクトリ構造にすればいいのかかと思います。ここでは1つのサーバに幾つかのプロジェクトを配置する事を想定してサーバを構築していきます。各Trac/SVNは個々に管理されるので、クライアント毎にアクセス制限をかけて運用するなども可能にしておきます。まずディレクトリ構造は次のようになります。

/var/projects/ プロジェクトのルートディレクト
+- sample/ sampleプロジェクトホーム
+ repo/ sampleプロジェクトのリポジトリ
+ trac/ sampleプロジェクトのTrac
+ .htdigest sampleプロジェクトの認証ファイル

プロジェクトが追加された場合は、/var/projects/に追加します。

構築手順

構築する手順は以下の通りです。
1. リポジトリを作成する
1. trac-adminでTracのプロジェクトを作成する
1. 認証設定を行う
1. tracwsgiファイルを作成する
1. Apacheのconfを作成し、SubversionTracのパスを設定する
慣れてきても手作業で全て行うのはちょっと面倒ですので、自動化したスクリプトを用意しました。ダウンロードはこちらから。
このスクリプトSVNリポジトリTracのプロジェクトを生成し、初期ユーザの設定まで行うスクリプトです。また、wsgiによつApacheとの連携スクリプトも追加します。

# sudo python gen_project.py
Enter project name[example: duke]: test ← プロジェクト名を入力
Enter projects root[/var/projects/]: ← プロジェクトルート
Enter username[admin]: ← 初期ユーザ(デフォルトはadmin)
Enter password[admin]: ← 初期パスワード(デフォルトはadmin)
project name: test
project root: test
create project_root: /var/projects/
create repository: /var/projects/test/repo
create trac env: /var/projects/test/trac
(中略)
create: /var/projects/test/.htdigest
create: /var/projects/test/trac/trac.wsgi
create: /var/projects/test/trac_test.conf
create: /var/projects/test/trac_test_vhost.conf
append: /var/projects/test/trac/conf/trac.ini
finish.

後はtrac_test.confをApacheの設定ディレクトリにコピーするだけです。尚、スクリプトで生成されるconfではリポジトリへのアクセスは誰でもできるがコミットは認証ユーザのみ、Tracへのアクセスは誰でもできるがチケットの登録などの権限はTracで管理というスタンスです。内部で使う場合はもっと緩くしても構いませんし、外部に見えるところにお客様の情報を置く場合はもっと厳しくしてください。

trac_test.conf

/var/projects/test/trac_test.confはバーチャルホストを使わない場合の設定ファイルの雛形です。要点のみ解説します。

# trac site setting
WSGIDaemonProcess test user=apache group=apache threads=10
WSGIScriptAlias /test "/var/projects/test/trac/trac.wsgi"

WSGIProcessGroup test
WSGIApplicationGroup %{GLOBAL}

パスはデフォルトでは、http://hostname/PROJECT_NAME/TracのURLになります。修正する場合はWSGIScriptAliasの後を書き換えてください。
wsgiで起動させるTracスクリプトtrac.wsgiスクリプトで生成されます。内容としてはこれだけです。

# Generated Script.
import os

os.environ['TRAC_ENV'] = '/var/projects/test/trac'
os.environ['PYTHON_EGG_CACHE'] = '/var/projects/.eggs'

import trac.web.main
application = trac.web.main.dispatch_request  

次にSVNの設定です。


DAV svn
SVNPath /var/projects/test/repo
AuthType Digest
AuthName trac_users
AuthUserFile /var/projects/test/.htdigest

Require valid-user

リポジトリのパスはデフォルトでは、http://hostname/repos/PROJECT_NAME/です。修正したい場合は Locationの後を修正してください。
認証はGET等に関して認めているので閲覧は誰でもできます。閲覧も禁止したい場合は、LimitExceptを削ればOKです。

trac_test_vhost.conf

バーチャルホストで使用する場合は、/var/projects/test/trac_test_vhost.confを編集します。
デフォルトではtrachttp://trac.example.jp/PROJECT_NAME/リポジトリhttp://svn.example.jp/PROJECT_NAME/ でアクセスできるように設定されています。ここは各自の環境にあわせて設定願います。

confファイルの配置とApacheの再起動

confファイルを設定し、サーバを再起動します。

sudo cp /var/projects/test/trac_test.conf /etc/httpd/conf.d
sudo /etc/init.d/httpd restart

アクセス出来ない場合

Apacheのエラーログに何も出力されず、真っ白な画面でタイムアウトする場合、mod_pythonが動いている可能性が高いです。mod_wsgiとは同時に使用できませんのでmod_wsgiの設定を解除してください。

ユーザ管理

ユーザ管理はTracのaccount management pluginで行います。初期設定でdigest認証となっており、apacheの認証設定でリンクさせていますので、Tracにユーザを追加すればSVNの認証ユーザとなります。

チケット日本語化

gen_project.pyを実行したとき、pythonのdefaultencodingがutf-8ならばチケット設定を日本語化します。色々と運用してみた結論としては、ここが英語だと使ってくれません。試しに日本語化してみてはいかがでしょうか?

チケットの種類
  • TODO / 一般的なタスクです
  • 課題 / リファクタリングが必要など積み残した課題です
  • 不具合 / 不具合として報告されたものです
  • 機能拡張 / 設計時にはなかった機能はこれで
  • リスク / 不具合にはならないが自信がない箇所、実装してみて変更がありそう、などリスク管理します
優先度
  • 可能な限り早くやる / 他の作業をとめてでもやりましょう
  • 優先的にやる / 他の仕事で割り込みは避けましょう
  • 早めにやる / あいている限りはすぐに片付けましょう
  • 後でやる / 残りのタスクが片付いたならばやりましょう
  • やれたらやる / 多分やりません
重要度
  • プロジェクトの危機 / 言語が変わりそうとか要件が満たせないとか…
  • かなり重要 / プロジェクトの中でも特に重要な部分です
  • 忘れないこと / 必ず最後までに片付けなくてはなりません
  • 影響があるかも / やり残しはちょとまずいです
  • 無視してOK / ありましたね、そんなチケットも
解決方法
  • 解決 / TODOなら完了、バグなら解決しました
  • チケットの誤り / チケット自体が無効なようです
  • 修正の必要なし / 特に修正する必要なくチケットが解決します(回答のみなど)
  • 重複 / 他のチケットと重複していました
  • 再現せず / 不具合などが再現できません

それでは、よりよいTracライフを!

*1:「うぃすきぃ」と呼ぶらしい