この連載はウノウエンジニア陣によるもので、今回が僕の担当でした。「Trac」のインストール方法やウノウにおける活用事例について説明していますので、興味のある方はお時間のある時にでも見て頂ければ幸いです。
第6回:BTS(Bug Tracking System)の利用
TracのWiki記法では、改行はそのままでは反映されません。[[br]]と入力する必要があります。このままでは面倒だということで、Shift+Enterで[[br]]タグが入力されるようなJavaScriptを書きました。
既に OZACC.blog: tracで改行[[br]]を簡単に入力 にてFirefoxで動作するものが公開されていますが、今回はこれを参考にInternet Explorerでも動くようにしました。
設定方法は、htdocs/js/trac.js に以下のコードを追加してください。
function getKeyCode(e){
return e.keyCode != 0 ? e.keyCode : e.charCode;
}
document.onkeypress = function(e) {
var flag = false;
if (navigator.userAgent.indexOf("Firefox") != -1) {
obj = e.target.tagName.toUpperCase();
if (obj == 'TEXTAREA' && e.shiftKey && getKeyCode(e) == 13) {
flag = true;
elem = document.getElementById(e.target.id);
}
} else {
obj = event.srcElement.tagName.toUpperCase();
if (obj == 'TEXTAREA' && event.shiftKey && getKeyCode(event) == 13) {
flag = true;
elem = document.getElementById(event.srcElement.id);
}
}
if (flag) {
var insertTag = '[[br]]';
insertAtCaret(elem, insertTag);
}
}
function insertAtCaret(obj, text) {
if(document.selection) {
obj.focus();
var orig = obj.value.replace(/\r\n/g, "\n");
var range = document.selection.createRange();
if(range.parentElement() != obj) {
return false;
}
range.text = text;
var actual = tmp = obj.value.replace(/\r\n/g, "\n");
for(var diff = 0; diff < orig.length; diff++) {
if(orig.charAt(diff) != actual.charAt(diff)) break;
}
for(var index = 0, start = 0;
tmp.match(text)
&& (tmp = tmp.replace(text, ""))
&& index <= diff;
index = start + text.length
) {
start = actual.indexOf(text, index);
}
} else if(obj.selectionStart) {
var start = obj.selectionStart;
var end = obj.selectionEnd;
obj.value = obj.value.substr(0, start)
+ text
+ obj.value.substr(end, obj.value.length);
}
if(start != null) {
setCaretTo(obj, start + text.length);
} else {
obj.value += text;
}
}
function setCaretTo(obj, pos) {
if(obj.createTextRange) {
var range = obj.createTextRange();
range.move('character', pos);
range.select();
} else if(obj.selectionStart) {
obj.focus();
obj.setSelectionRange(pos, pos);
}
}
もともと社内で利用するために書いたのですが、お蔵入りになりそうで勿体ないので公開します。どうぞご自由に使ってください。
Trac 0.9-jaが公開されたのにあわせて、会社で使っているTracをアップグレードしたので手順をメモしておきます。# dpkg -i trac_0.9-1.ja_all.deb2.Apache "httpd.conf"の修正(mod_pythonを使っている場合)
- PythonHandler trac.ModPythonHandler + PythonHandler trac.web.modpython_frontend3."trac-admin"コマンドでアップグレードを実行
# trac-admin /var/trac/project/ upgrade Please perform a "resync" after this upgrade. Upgrade done. # trac-admin /var/trac/project/ resync Resyncing repository history... Done. # trac-admin /var/trac/project/ wiki upgrade /usr/local/share/trac/wiki-default/TracSearch => TracSearch /usr/local/share/trac/wiki-default/TracRss => TracRss ・・・4.htdocsとpluginsディレクトリを作成
$ cd /var/trac/project
# mkdir {htdocs,plugins}
# chown www-data:www-data {htdocs,plugins}
5.タイトル画像を変更する# vi conf/trac.ini [header_logo] src = site/my_logo.gif6.Apacheの再起動
# /etc/init.d/apache2 restart
SQLiteのバージョンによっては、DBの変換をする必要があるらしいです(下記参照)。Debian sargeな環境では必要ありませんでした。
http://projects.edgewall.com/trac/wiki/TracUpgrade#From0.8.xto0.9
#!/bin/sh
REPOS="$1"
REV="$2"
env LANG=ja_JP.eucJP ${REPOS}/hooks/email-send.rb "$REPOS" "$REV"
export LANG=ja_JP.UTF-8
LOG=`/usr/bin/svnlook log -r $REV $REPOS`
AUTHOR=`/usr/bin/svnlook author -r $REV $REPOS`
/usr/bin/python ${REPOS}/hooks/trac-post-commit-hook \
-p "/var/trac/sampleproject" \
-r "$REV" \
-u "$AUTHOR" \
-m "$LOG"
次にメール送信用のプログラムを同じディレクトリに用意します。ほぼサンプルそのままなんですが、本文が日本語で表示されるようにしているのと、Tracのチェンジセットへのリンクを追加しています。
#!/usr/bin/ruby -Ke
require 'net/smtp'
require 'kconv'
REPOS=ARGV[0]
REV=ARGV[1].to_i
svnauthor=%x{svnlook author #{REPOS} rev #{REV}}.chomp!
svndate=%x{svnlook date #{REPOS} rev #{REV}}.chomp!
svnchanged=%x{svnlook changed #{REPOS} rev #{REV}}.chomp!
svnlog=%x{svnlook log #{REPOS} rev #{REV}}.chomp!
svndiff=%x{svnlook diff #{REPOS} rev #{REV}}.chomp!
toaddr=['member1@hoge.com', 'member2@hoge.com']
body = <<BODY
Subversion committed to #{REPOS} #{REV}
┌────────────────────────────┐
│更新者 : #{svnauthor.ljust(45)}│
│更新日時: #{svndate}│
└────────────────────────────┘
Changed: [U:修正,A:追加,D:削除]
--------------------------------------------------------
#{svnchanged}
Log:
--------------------------------------------------------
#{svnlog}
http://www.hoge.com/trac/sampleproject/changeset/#{REV}
BODY
Net::SMTP.start( 'mail.hoge.com', 25 ) {|smtp|
smtp.send_mail <<EndOfMail, 'svn-admin@hoge.com', *toaddr
From: Subversion Admin <svn-admin@hoge.com>
To: Subversion committers:;
Subject: [pj-#{REV}]=?ISO-2022-JP?B?GyRCPzckPyRKJTMlXyVDJUgkLCQiJGokXiQ3JD8bKEI=?=
MIME-Version: 1.0
Content-Type: text/plain; charset = ISO-2022-JP
#{body.tojis}
EndOfMail
}
最後に、Tracチケットの自動クローズをする trac-post-commit-hook を用意します。これは、/usr/share/doc/trac/contribにあるので、そのままコピーします。
# cp /usr/share/doc/trac/contrib /var/svn/sampleproject/hooks/
これで、コミット時に開発メンバにメールが送信され、コメントに (Fixes #29,#38) などと書くと該当するTracチケットが自動的にクローズされるはずです。
職場で開発中システムの管理に使い始めていますが、評判も上々です。以前は、PukiWikiのBugTrackプラグインを使っていたのですが、無理やりWikiページの1つとして収めている感じがしていました。それに比べて、Tracは、WikiとBTSの機能がある程度独立した上で、それらの更新情報をまとめて一覧表示したり、"ticket:1","report:1","changeset:1"などのTracLink形式でそれらの間をリンクすることができるので、使い勝手は断然上です。
Wikiのトップ画面![]() 標準のWiki書式はシンプルだが、Pythonで関数を記述することで拡張可能。 |
Wikiの編集画面![]() ticket:1,changeset:1などと記述すると、チケットやリポジトリへのリンクとなる。 |
タイムライン画面![]() Wiki,SVN,Ticketの変更履歴がまとめて表示される。RSS形式で出力可能。 |
ロードマップ画面![]() 割り当てられたチケットの完遂率がグラフ表示される。iCalendar形式で出力可能。 |
Subversionリポジトリ![]() 日本語のコミット時コメント表示も問題なし。WebSVNとほぼ同じ。 |
リポジトリ変更差分表示![]() なかなか見やすい。新旧を左右に分けて表示することも可能。 |
進捗状況のレポート![]() ブラウザ上からSQLクエリーをカスタマイズして、表示項目を変更することが可能。標準で用意されているレポートはこの8つ。 |
バグトラッキング画面![]() チケットごとの進捗状況や担当者を確認できる。チケットには、エラー画面を添付したり、掲示板のようにコメントを付けることが可能。 |
$ unzip trac-0.8.1-ja-1.zip $ cd trac-0.8.1-ja-1 $ su # mv templates/* /usr/share/trac/templates/ # mv wiki-default/* /usr/share/trac/wiki-default/
# htpasswd2 -c /var/trac/.htpasswd hoge New password: Re-type new password: Adding password for user hoge(2)Apacheの認証設定
<LocationMatch "/cgi-bin/trac.cgi/login">
AuthType Basic
AuthName "trac"
AuthUserFile /var/trac/.htpasswd
Require valid-user
</LocationMatch>
# trac-admin /var/trac/sampleproject permission add hoge TRAC_ADMIN3.UTF-8以外のソースコードに対応する
# apt-get install python2.3-japanese-codecs(2)trac.iniの編集
[trac] default_charset = japanese.shift_jis
Tracはファイル構成もシンプル、ClearSilverというテンプレートエンジンを使っていてWebアプリケーションとしても良くできているな、と感じました。欲を言うと、テンプレートを丸ごと置換えしなくて済むように言語切り替え機能が欲しい、ユーザ管理を基本認証ではなくDBで管理して欲しいという気はします。
以上、とりとめもなく書きましたが、そのうちBlogエントリではなく、Plone上のコンテンツとして纏めます。
Tracは、WikiとSubversionリポジトリビューアとBTSをひとつにしたようなソフトウェアです。要するにソフトウェア開発の際のソースコードのバージョン管理、プロジェクトメンバ間の情報共有、バグ追跡管理がまとめてできるということです。ちなみにZopeと同じ、Pythonで書かれています。Panda_naominさんの日記で知って良さそうと思ってたのですが、やっと試せました。deb http://ftp.edgewall.com/pub/debian sarge tracインストール
# apt-get update # apt-get install trac2. Subversionリポジトリを作成
# mkdir -p /var/svn/ $ cd /var/svn $ sudo svnadmin create sampleproject3. Tracプロジェクトを作成
$ sudo trac-admin /var/trac/sampleproject initenv Creating a new Trac environment at /var/trac/sampleproject 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]> Sample Project 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]> /var/svn/sampleproject 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]> そのままEnter4. Apache2の設定(/etc/apache2/sites-enabled/defaultに追記)
Alias /trac "/usr/share/trac/htdocs/"
<Location "/cgi-bin/trac.cgi">
SetEnv TRAC_ENV "/var/trac/sampleproject"
</Location>
とりあえず、今日はインストールまで。使ってみた感想は、また後日書きます。