Windowsで簡単にTracが構築できるTrac月が公開されました。

Tracとは?

Tracとは、オープンソースで開発されているバグトラッキングシステムです。まぁ、バグトラッキングシステムにもBuzillaをはじめ色々ありますが、Tracは次のような特徴があります。

  • シンプルなユーザインタフェース
  • バグ修正とSubversionのソースコードの連携
  • wikiの統合によるコミュニケーション機能
  • 強力なリンク機能。[34]#123などと書くだけで、Subversionのチェンジセットやチケットへリンクを貼ることができます。

Tracは、次のオープンソースプロジェクトで利用されています。

Ruby on RailsやSpringIDEなど新鋭のプロジェクトを中心に採用が進んでおり、今最も注目のバグトラッキングシステムと言えるでしょう。

参考リンク

インタアクトのサイトでは、tracを日本語化したtrac-jaが配布されています。また、マニュアルの日本語化も行っています。

Tracの拡張機能、マクロなどが投稿されているサイトです。

インストール

適当に作ったパッケージがhttp://ultimania.org/debian/にあります。/etc/apt/sources.listに次の行を追加し、

 deb http://ultimania.org/debian/ ./
 deb http://www.backports.org/debian/ sarge-backports main contrib

apt-getでインストールしてください。

 # apt-get install trac python2.3-japanese-codecs

ここでは、Subversionのリポジトリで日本語を扱うために、python2.3-japanese-codecsをインストールしておきます。

依存関係でインストールできない場合

下記のパッケージも一緒にインストールしてみるとよい。

  • python2.3-subversion
  • python2.3-sqlite
  • python2.3-clearsilver

セットアップ

Tracを利用するには、SubversionのリポジトリとTracのデータベースを生成します。

Subversionのディレクトリの作成

 # svnadmin create /tmp/svn

Tracのプロジェクトの作成

 # rm -rf /tmp/trac
 # trac-admin /tmp/trac initenv
 Creating a new Trac environment at /tmp/trac
  
 Trac will first ask a few questions about your environment
 in order to initalize and prepare the project database.
   
 Please enter the name of your project. 
 This name will be used in page titles and descriptions. 
  
 Project Name [My Project]> Project Ultimania          ☆プロジェクト名
  
  Please specify the connection string for the database to use. 
  By default, a local SQLite database is created in the environment 
  directory. It is also possible to use an already existing 
  PostgreSQL database (check the Trac documentation for the exact 
  connection string syntax). 
  
 Database connection string [sqlite:db/trac.db]> 
  
  Please specify the absolute path to the project Subversion repository. 
  Repository must be local, and trac-admin requires read+write 
  permission to initialize the Trac database. 
  
 Path to repository [/var/svn/test]> /tmp/svn           ☆Subversionのリポジトリのパス
  
  Please enter location of Trac page templates. 
  Default is the location of the site-wide templates installed with Trac. 
  
 Templates directory [/usr/share/trac/templates]> 
  
 Creating and Initializing Project 
  Configuring Project 
   trac.repository_dir 
   ...

次のようにやってもok。

 # trac-admin /tmp/trac initenv "Project Name" sqlite:db/trac.db /tmp/svn /usr/share/trac/templates

Tracの簡易起動

 # tracd -p 8081 /tmp/trac

これで、tracdを起動したホストの8081ポートへブラウザでアクセスすると、Tracを利用することができます。

PostgreSQLの利用

PythonからPostgreSQLを利用するpsycopg(Debianの場合python2.3-psycopgパッケージ)をインストールし、

conf/trac.iniファイルのdatabaseプロパティを下記のように設定する。

 database = postgres://<ユーザ名>:<パスワード>@localhost/<データベース名>

例えば、次のように記述

 database = postgres://trac:tracpass@localhost/trac

データベースを作成しておく必要があるが、下記のようにutf-8で作成する必要があるので注意。

 $ createdb --encoding utf-8 trac

Webから利用

CGI

Tracは簡易Webサーバが入っているとはいえ、ふつーはApacheを使います。Apacheで利用するには、設定ファイルに次のように記述します。

 <LocationMatch "/[[:alnum:]]+/login">
      AuthType Basic
      AuthName "Trac Authentication"
      AuthUserFile /home/trac/.htpasswd
      Require valid-user
 </LocationMatch>
 
 ScriptAlias /trac /usr/share/trac/cgi-bin/trac.cgi
 <Location "/trac">
    SetEnv TRAC_ENV "/tmp/trac"
 </Location>
ついでに、SVNのリポジトリの設定も記述
 <Location /svn>
    DAV svn
    SVNPath /tmp/svn
 </Location>

mod_python

cgiを使うと劇重だが、mod-pythonを使うとかなり早くなる。mod-pythonのインストールは、次の通り。

 # apt-get install libapache2-mod-python2.3

Apacheの設定は、上記の設定を次のように変更する。

 ScriptAlias /trac /usr/share/trac/cgi-bin/trac.cgi
 <Location "/trac">
 #  SetEnv TRAC_ENV "/tmp/trac"
    SetHandler mod_python
    PythonHandler trac.web.modpython_frontend
    PythonOption TracEnv /tmp/trac
#   PythonOption TracEnvParentDir /tmp
    PythonOption TracUriRoot /trac
 </Location>

FastCGI

FastCGIは、アプリケーションプロセスをWebサーバと別に実行しておき、Webサーバとアプリケーションプロセスで通信する仕組みである。この方法もmod_pythonと同様に高速化できるが、より汎用的に作られている。 mod_fastcgiとmod_fcgidの2種類がある。mod_fcgidの方が新しく安定しているようなので、mod_fcgidを利用することをお勧めする。

mod_fcgid

 # apt-get install libapache2-mod-fcgid
 # a2enmod fcgid

/etc/apache2/mod-enabled/fcgid.conf

 <IfModule mod_fcgid.c>
 # TRAC_ENVもしくはTRAC_ENV_PARENT_DIRを設定
   DefaultInitEnv TRAC_ENV /home/trac/test
 #  DefaultInitEnv TRAC_ENV_PARENT_DIR /home/trac
   AddHandler fcgid-script .fcgi
   SocketPath /var/lib/apache2/fcgid/sock
 </IfModule>
DefaultInit
/etc/apache2/site-enabled/xxx 
 ScriptAlias /trac /usr/share/trac/cgi-bin/trac.fcgi
 <Location "/trac">
 </Location>

mod_fastcgi

 FastCgiConfig -initial-env TRAC_ENV=/tmp/trac
 ScriptAlias /trac /usr/share/trac/cgi-bin/trac.fcgi
 <Location "/trac">
 </Location>

プラグインとWikiマクロ

Tracは、プラグインとWikiマクロの2つの機能によって、Trac自身を拡張することができます。

Wikiマクロ

Wikiマクロは、Wikiを拡張するためのマクロです。Tracをセットアップしたディレクトリのwiki-macroディレクトリにマクロ(*.py)を置くことによって、マクロを利用することができます。

プラグイン

python2.3-setuptoolsパッケージをインストールしてください。 プラグインによりTracに様々な機能を追加することができます。プラグインをインストールするには、python2.3-setuptoolsパッケージをインストールしておく必要があります(sargeのsetuptoolsパッケージは古いためうまくプラグインをビルドできません。最初に示したapt-lineをご利用ください)。プラグインをインストールするには、プラグインをビルドし、eggファイルを作成します。

 # python setup.py bdist_egg
 # ls dist/
 TracXMLRPC-0.1-py2.4.egg

eggファイルをpluginsディレクトリにコピーします。ちなみにeggはJavaでいうjarみたいなもんですね。

テンプレート

カスタムフィールド名を取得

<?cs var:ticket.fields["custom_field"].label ?>

カスタムフィールドの値を取得

<?cs var:ticket["custom_field"] ?>

管理について

リポジトリとの同期

Tracのプロジェクトを作成した後で、SVNリポジトリを置き換えたりして最初の状態から変更すると、リポジトリブラウザでエラーが発生します。そのような場合、resyncコマンドで同期を取ります。

 $ trac-admin /home/trac/repo resync

デフォルトのコンポーネントとマイルストーンの削除

tracのプロジェクトはデフォルトでcomponent1、component2の2つのコンポーネントと、milestone1、milestone2、milestone3、milestone4の4つのマイルストーンが登録してあります。まずは、これらのコンポーネントとマイルストーンを削除し、プロジェクトをきれいにします。

 # trac-admin  /home/trac/repo component remove component1
 # trac-admin  /home/trac/repo component remove component2
 # trac-admin  /home/trac/repo milestone remove milestone1
 # trac-admin  /home/trac/repo milestone remove milestone2
 # trac-admin  /home/trac/repo milestone remove milestone3
 # trac-admin  /home/trac/repo milestone remove milestone4

コンポーネントの削除、追加

コンポーネントを追加するには、

 # trac-admin  /home/trac/repo component add mycomponent owner

とする。ownerはコンポーネントのオーナを指定。

マイルストーンの追加と削除

マイルストーンを追加するには、

 # trac-admin  /home/trac/repo milestone add 1.0

とする。

権限の表示/変更

権限の表示は次のようにする。

 # trac-admin  /home/trac/repo permission list
 anonymous  BROWSER_VIEW
 anonymous  CHANGESET_VIEW
 anonymous  FILE_VIEW
 anonymous  LOG_VIEW
 anonymous  MILESTONE_VIEW

追加は、次の通り。

 # trac-admin  /home/trac/repo permission add TRAC_ADMIN

取り敢えず、TRAC_ADMINを与えとけば、全ての権限を持たせることができる。 権限のリストは、次の通り。

BROWSER_VIEWブラウザによる閲覧
CHANGESET_VIEWチェンジセットの閲覧
CONFIG_VIEW設定の閲覧
FILE_VIEWファイルの閲覧
LOG_VIEWログの閲覧
MILESTONE_[ADMIN,CREATE,DELETE,MODIFY,VIEW]マイルストーンの各種操作
REPORT_[ADMIN,CREATE,DELETE,MODIFY,SQL_VIEW,VIEW]リポートの各種操作
ROADMAP_[ADMIN,VIEW]ロードマップの各種操作
SEARCH_VIEW検索表示
TICKET_[ADMIN,APPEND,CHGPROP,CREATE,MODIFY,VIEW]チケットの各種操作
TIMELINE_VIEWタイムラインの閲覧
TRAC_ADMIN|全ての権限。神。
WIKI_[ADMIN,CREATE,DELETE,MODIFY,VIEW]WIKIの各種操作

チケットタイプの追加

デフォルトのチケットタイプは、defect(バグ)、enhancement(機能追加要求)、task(タスク)の3つ。チケットタイプを追加するには、次のようにする

 # trac-admin /home/trac/repo ticket_type add <チケットタイプ>

emailからチケットを作成

contrib/emailfilter.pyを次のようにしてTRACのホームを指定する。

 TRAC_ENV_PATH = '/home/trac/project'

適当な場所にコピーして、/etc/aliasesに次のように記述。

 bugs: |/usr/local/trac/contrib/emailfilter.py

これで、bugsユーザにメールを送るとチケットととして登録されるようになる。Fromがレポーターに、SubjectがSummaryに、メール本体がDescriptionになる。デフォルトのemailfilter.pyは日本語を正しく処理できない。添付の #ref(emailfilter.py) を利用すること。

また、次のURLにメールからTracを操作する改良版がある。

コミット時のメール送信をチケットの自動クローズ

下記のサイトを参照

Windowsで操作するときは、次のようなpost-commit.batを利用

::-----------------------------
::Call the TRAC post-commit hook
::
SET REPOS=%1
SET REV=%2
SET SVNLOOK=svnlook.exe 
SET TRAC_ENV=C:\trac-project

FOR /F "usebackq delims==" %%i IN (`"%SVNLOOK%" log -r %REV% %REPOS%`) DO SET LOG=%%i
FOR /F "usebackq delims==" %%i IN (`"%SVNLOOK%" author -r %REV% %REPOS%`) DO SET AUTHOR=%%i

python.exe C:/trac/contrib/trac-post-commit-hook" -p "%TRAC_ENV%"  -r "%REV%" -u "%AUTHOR%" -m "%LOG%"

コミット時にオープンされたチケット番号が記述されていないとコミットをリジェクト

http://projects.edgewall.com/trac/browser/trunk/contrib/trac-pre-commit-hook

日本語ファイルがリポジトリブラウザで文字化けする

pythonのjapanese-codesモジュールをインストールし、trac.iniでデフォルトの文字コードを変更します。

  • japanese-codesモジュールのインストール
     # apt-get install python2.3-japanese-codecs
    
  • trac.iniの設定

[tracリポジトリ]/conf/trac.iniを変更

 [trac]
 default_charset = japanese.shift_jis

python2.4以上であれば、

 [trac]
 default_charset = cp932

とする。

その他

Pukiwikiからの移行

CVSからSVNへの移行

cvs2svnを利用する。

単純な移行

 $ cvs2svn --encoding=euc-jp -s ~/svnrepos ~/cvsroot

--encodingはコミットメッセージのエンコーディング。Windowsで利用している場合、Shift_JISとかにすると良いかもしれない。

複数のCVSリポジトリを1つのSubversionリポジトリへ変換

 #!/bin/sh
 SRC_CVSROOT=CVS_src # 作業用にコピーしたCVSリポジトリ
 DST_SVNROOT="${HOME}/Library/svn-repos" # subversionのリポジトリ
 URL_SVNROOT=file://${DST_SVNROOT}
  
 copy_repos() {
  projname=${1}
  echo "== ${projname} =="
  cvs2svn --no-prune \
      --dump-only --dumpfile=svn-${projname}.dmp \
      ${SRC_CVSROOT}/${projname}
  svn mkdir -m "project moved from CVS" ${URL_SVNROOT}/${projname}
  svnadmin load ${DST_SVNROOT} --parent-dir=${projname} < svn-${projname}.dmp
  #rm -f svn-${projname}.dmp
 }

参考: http://72.14.235.104/search?q=cache:wI3GMBbwzNIJ:homepage3.nifty.com/kimuraw/d/%3F11120109+cvs2svn+%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%80%80%E7%A7%BB%E8%A1%8C+dump&hl=ja&gl=jp&ct=clnk&cd=6

移行したくないモジュールがある場合は、CVSリポジトリの複製を作成し、複製したCVSリポジトリのモジュールを削除した後、変換処理を行う。

XML-RPC

TracXMLRPCを利用すると、クライアントプログラムからXML-RPCを利用してTracを操作することができます。プラグインをビルドして、pluginsディレクトリにコピーし、XML-RPCでアクセス許可するユーザにXML_RPC権限を与えます。XML-RPC権限を与えるには、次のようにします。

$ trac-admin /home/trac/test permission add okamototk XML_RPC

LDAPPlugin

LDAPプラグインを利用すると、Tracの認証をLDAPを利用して行えるようになる。 httpd.confは下記の通り。

    ScriptAlias /trac/ldap-test /usr/share/trac/cgi-bin/trac.cgi
    <Location "/trac/ldap-test">
      SetEnv TRAC_ENV "/home/trac/ldap-test"
      AuthType Basic
      AuthBasicProvider ldap
      AuthName "Trac Authentication"
      AuthLDAPURL "ldap://localhost/dc=nodomain?cn?sub?(objectClass=*)"
      AuthzLDAPAuthoritative off
      Require valid-user
    </Location>

trac.iniは次のようにする。

[trac]
...
# trac-adminからパーミッションを変更するにはこの設定が必要
permission_store = LdapPermissionStore
...

[ldap]
enable = true
# ユーザが俗するDN
basedn = ou=sales,dc=nodomain
# ユーザIDを識別する属性
uidattr = cn
# tracのパーミッションを指定する属性(デフォルトがtracpermなので実は設定不要)
permattr=tracperm
manage_groups = true
store_bind = true
# LDAPを操作するときのユーザのDNとパスワード
bind_user = cn=Manager,dc=nodomain
bind_passwd = secret

LDAP側の設定は、次のようなtrac.schemaを定義しておく。

# trac
# Generated by LDAP Studio on 2007/05/20 14:03:24

attributetype ( 1.2.3.4.5.6.897 
        NAME 'tracperm' 
        DESC 'Trac Permission' 
        SUP name 
 )

objectclass ( 1.2.3.4.5.6.567 
        NAME 'tracAccount' 
        DESC 'Trac managed object.' 
        SUP top 
        AUXILIARY 
        MAY tracperm 
 )

/etc/ldap/schemaに保存し、slapd.confでincludeしておく。

グループの作成は、groupOfNamesオブジェクトとtracAccountオブジェクトを持つオブジェクトを作成する。tracAccoountの持つtracperm属性で、tracのパーミッション(WIKI_ADMIN,TRAC_ADMIN等)を指定する。ldap-test:WIKI_ADMIN等とすると、特定のTracプロジェクトへのみ設定を行うことができる。 グループへパーミッションを付与するときは、

 # trac-admin /home/trac/ldap-test permission add @mygroup TRAC_ADMIN

のように@を先頭に付けると、LDAPの名前となる。このとき、tracpermには、ldaptest:TRAC_ADMINのようにプロジェクト毎の設定が付与される。

注意

SQLiteのアップグレード

Tracは、PythonのバージョンとSQLiteのバージョンに依存しています。正しく動作しない場合は、PythonのバージョンとSQLiteのバージョンを確認する。SQLiteのバージョンを上げたいときは、次のようにして、SQLite2.xのDBをSQLite3.xのDBに変換する。

 # sqlite trac.db .dump > dump.sql
 # sqlite3 trac3.db ".read dump.sql"
 # mv trac3.db trac.db

Excelインポート

  • sqliteのJDBCドライバを利用?
  • Webからアップロードでプレビューして登録できると素敵
  • チケットが割り振られたExcelがダウンロードできるとか。
  • Tracが管理できないフィールドはヘッダに記述

カスタマイズ

  • チケットの種類

障害、機能拡張、タスク

  • 優先度
優先度障害の記述タスク/機能拡張の基準
blockerシステム全体の停止、環境の破壊等、アプリ自身以外にも大規模な影響を及ぼすバグプロジェクトやシステム全体に大きな影響を及ぼすタスク、機能
criticalセキュリティホール、データの消失等、致命的なバグ他の重要なタスクを止めたり、システム全体に対するAPIの変発生する機能拡張てしまうタスク/機能拡張
major通常のバグ通常の優先度
minorバグの手段が存在し、修正しなくても利用に差し障りの無いレベルのバグ実施しなくても策があるタスク/機能拡張
trivialタイポやコメントの間違い等、システムの動作に影響しないバグ。実施しなくてもシステム開発に影響を及ぼさないタスク/機能拡張

Trac導入時に考えること

  • Tracの分け方(業務、業務共通、基盤)
  • コンポーネントの分け方(jarの単位、協力会社の単位)
  • チケットの種類(task(タスク),defect(故障),enhancement(拡張),課題,)
  • マイルストーン/リリースの基準(1.0aはユニットテスト完了、1.0bは結合テスト完了、1.0rcは総合運転試験(?)完了とか。
  • ロール(プログラマ、テスター、管理者(開発管理/テスト管理)、その他)
  • ワークフロー
  • 各ロールによる操作の種別
  • カスタムフィールド(グループ名、処理完了予定日など)