ThinkITにTracに関する記事を書きました

ThinkITでPHP開発手法の連載 第6回目が掲載されました。
この連載はウノウエンジニア陣によるもので、今回が僕の担当でした。「Trac」のインストール方法やウノウにおける活用事例について説明していますので、興味のある方はお時間のある時にでも見て頂ければ幸いです。

第6回:BTS(Bug Tracking System)の利用

Tracで改行をShift+Enterで簡単に入力

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.8 から 0.9 へのアップグレード手順

Trac 0.9-jaが公開されたのにあわせて、会社で使っているTracをアップグレードしたので手順をメモしておきます。
ただ、SQLインジェクションの脆弱性に対応したTrac 0.9.1が本家でリリースされているので、今アップグレードするのは微妙です。日本語版の0.9.1を待ったほうがいいかもしれません。0.9からは、プログラム本体に手を入れて日本語化されているので、どうしても本家と日本語版の間でタイムラグが出てしまいます。やっぱりロケール切り替えの機能を実装して欲しいです。

1.trac-0.9-jaのインストール
Debian on coLinuxな環境なので、「生きてま」さんのdebパッケージを利用させてもらいました。
# dpkg -i trac_0.9-1.ja_all.deb
2.Apache "httpd.conf"の修正(mod_pythonを使っている場合)
- PythonHandler trac.ModPythonHandler
+ PythonHandler trac.web.modpython_frontend
3."trac-admin"コマンドでアップグレードを実行
/var/trac/projectにTracプロジェクトのディレクトリがあるものとします。
# 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.タイトル画像を変更する
4で作成したhtdocsに画像を置きます。
siteのところは、0.9から追加された機能で、site/と書いておくと4で作成した各プロジェクト内のhtdocsディレクトリを見にいくようになります。
# vi conf/trac.ini
[header_logo]
src = site/my_logo.gif
6.Apacheの再起動
# /etc/init.d/apache2 restart

SQLiteのバージョンによっては、DBの変換をする必要があるらしいです(下記参照)。Debian sargeな環境では必要ありませんでした。

http://projects.edgewall.com/trac/wiki/TracUpgrade#From0.8.xto0.9

trac-0.9-ja キター!

Trac-0.9の日本語化パッケージがインタアクト株式会社より公開されました。
落合さん、お疲れ様です。早速、使わせて頂きます。

trac-0.9-ja


関連リンク:
Trac(BTS+Wiki+SVN)を試してみる[前編]
Trac(BTS+Wiki+SVN)を試してみる[後編]
Subversionコミット時メール送信とTracチケットの自動クローズ
Trac 0.8 から 0.9 へのアップグレード手順

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

最近、なかなか自分の好きなことができないので、朝早起きして時間を作ることにしました。今日は4時起きです。さすがにこれが毎日続くとは思いませんけども、しばらく新しい生活を試してみようと思います。

職場では、Subversionのコミット時にその内容を開発メンバーにメールで配信しています。さらにコミット時のコメントに"(Fixes #21)"なんて書くと、Tracの21番のチケットを自動的にクローズするなんてこともしています。SubversionとTracの組み合わせは、私の職場では開発の必須ツールになりつつあります。でも、私がTracにバグを登録して、後で担当者に口頭で説明しようかなと思っていると、突然「バグがFixされました」というメールが来たりして焦りますが(^^; (まだ説明もしてないのに…)

設定方法ですが、まずSubversionリポジトリのhooksサブディレクトリにpost-commitというファイルを用意します。

/var/svn/sampleproject/hooks/post-commit
#!/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のチェンジセットへのリンクを追加しています。


/var/svn/sampleproject/hooks/email-send.rb
#!/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チケットが自動的にクローズされるはずです。

Trac(BTS+Wiki+SVN)を試してみる [後編]

先週末から公私共にいろいろとあって、だいぶ間があいてしまいましたが、前回の続きです。
使ってみての感想ですが、これは使えるなという印象を持ちました。
・日本語に関しては、Wiki,Subversionリポジトリビューア,Ticket管理ともに問題なし
 (ただし、Suversionに格納しているソースがUTF-8以外の場合には設定が必要)
・翻訳版に置き換えることで、メニューやヘルプも日本語化可能
・Wikiの書式がシンプルで表現力は最低限
・動作は軽快(mod_pythonは必須)
・ヘルプが良くできていて、使い始めが簡単
・RSSやiCalendar形式で他のツールと連携可能

職場で開発中システムの管理に使い始めていますが、評判も上々です。以前は、PukiWikiBugTrackプラグインを使っていたのですが、無理やり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つ。
バグトラッキング画面
チケットごとの進捗状況や担当者を確認できる。チケットには、エラー画面を添付したり、掲示板のようにコメントを付けることが可能。

以下に日本語化や管理者権限の設定方法を書きます。

1.メニューやヘルプの日本語化
(1)翻訳ファイルをダウンロード

(2)解凍と展開
$ 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/
※これ以降に作成したプロジェクトから日本語になります。"trac-admin yourenvdir initenv"でプロジェクトを作成してください。

2.管理者権限を設定する
(1)パスワード設定
# htpasswd2 -c /var/trac/.htpasswd hoge
New password:
Re-type new password:
Adding password for user hoge
(2)Apacheの認証設定
Apacheの設定ファイルに下記を追加
/etc/apache2/sites-enabled/000-default(Debian Sargeの場合)
<LocationMatch "/cgi-bin/trac.cgi/login">
    AuthType Basic
    AuthName "trac"
    AuthUserFile /var/trac/.htpasswd
    Require valid-user
</LocationMatch>
(3)作成したユーザに管理者権限割り当て
# trac-admin /var/trac/sampleproject permission add hoge TRAC_ADMIN
3.UTF-8以外のソースコードに対応する
(1)JapaneseCodecsのインストール
# apt-get install python2.3-japanese-codecs
(2)trac.iniの編集
/var/trac/sampleproject/conf/trac.ini の設定を変更(Shift_JISの場合)
[trac]
default_charset = japanese.shift_jis

Tracはファイル構成もシンプル、ClearSilverというテンプレートエンジンを使っていてWebアプリケーションとしても良くできているな、と感じました。欲を言うと、テンプレートを丸ごと置換えしなくて済むように言語切り替え機能が欲しい、ユーザ管理を基本認証ではなくDBで管理して欲しいという気はします。
以上、とりとめもなく書きましたが、そのうちBlogエントリではなく、Plone上のコンテンツとして纏めます。

Trac(BTS+Wiki+SVN)を試してみる [前編]

Tracは、WikiとSubversionリポジトリビューアとBTSをひとつにしたようなソフトウェアです。要するにソフトウェア開発の際のソースコードのバージョン管理、プロジェクトメンバ間の情報共有、バグ追跡管理がまとめてできるということです。ちなみにZopeと同じ、Pythonで書かれています。Panda_naominさんの日記で知って良さそうと思ってたのですが、やっと試せました。

インストールは、coLinux上のDebianをSarge化して、全てapt-getでインストールすることにします。この辺がLinuxさまさま、Windowsでは面倒でやる気になりません。あっ、でもSarge化、Apache2、Subversionのインストールは済んでいるものとします。(全部 apt-get 一発ですが)

1. まずはTracのインストール
/etc/apt/sources.list に以下を追加
deb http://ftp.edgewall.com/pub/debian sarge trac
インストール
# apt-get update
# apt-get install trac
2. Subversionリポジトリを作成
# mkdir -p /var/svn/
$ cd /var/svn
$ sudo svnadmin create sampleproject
3. 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]> そのままEnter
4. Apache2の設定(/etc/apache2/sites-enabled/defaultに追記)
Alias /trac "/usr/share/trac/htdocs/"
<Location "/cgi-bin/trac.cgi">
        SetEnv TRAC_ENV "/var/trac/sampleproject"
</Location>
    
とりあえず、今日はインストールまで。使ってみた感想は、また後日書きます。