2007年07月02日

Trac の Workflow を使ってみた

Trac の次のバージョン(0.11.x)より Workflow という仕組みが実装され、ステータスの状態遷移をある程度、自由に変えられるようになります。

今のところ Workflow を使うには Trac の Subversion の trunk

http://svn.edgewall.com/repos/trac/trunk/

から update するか、sandbox/testing

http://svn.edgewall.com/repos/trac/sandbox/testing/

から update する。もちろん日本語版を使っていても、update すると全て英語に戻ってしまいます(戻ってしまいました(笑))

update の方法は様々なサイトで紹介されているので割愛して、ここでは実際のステータスの状態遷移の設定を紹介。

[ticket-workflow] accept = new -> assigned accept.operations = set_owner_to_self accept.permissions = TICKET_MODIFY approve = resolved -> closed approve.operations = set_resolution approve.permissions = TICKET_MODIFY leave = * -> * leave.default = 1 leave.operations = leave_status reassign = new,assigned,reopened,resolved -> * reassign.operations = set_owner reassign.permissions = TICKET_MODIFY reopen = closed,resolved -> reopened reopen.operations = del_resolution,set_owner reopen.permissions = TICKET_CREATE resolve = new,assigned,reopened -> resolved resolve.operations = set_resolution,set_owner resolve.permissions = TICKET_MODIFY

ミソは開発者が修正が終わってresolveすると、すぐに closed になるのではなく resolved というステータスになる。その際、テスト担当者が決まっている場合同時に担当者の変更も可能(hogehoge.operation の後ろに action をカンマで区切って書けばよい。operationsの種類はこちらを参照)

同様にテスト不合格で reopen する際もステータスを reopened に戻すと同時に、担当者を開発担当者に変更できるという案配。

数日前からこのフローで運用してますが、テストステータスを明確にできるので、管理しやすく感じる。

投稿者 iwazawa : 20:40 | コメント (0) | トラックバック

2007年06月20日

Trac Reportのカスタマイズ

以前Tracのテーブル定義を紹介しましたが、これを調べた理由は、まだ完了していないマイルストーンに含まれる解決済みを含む全てのチケットを表示するレポートが欲しかったから。

特に難しい事は何もないのでSQLさえ書ければ、他のレポートのQueryを参考に誰でもできるでしょうが、せっかくなので公開しておきます。

SELECT p.value AS __color__, t.milestone AS __group__, (CASE status WHEN 'closed' THEN 'color: #777; background: #ddd; border-color: #ccc;' ELSE (CASE owner WHEN '$USER' THEN 'font-weight: bold' END) END) AS __style__, id AS ticket, summary, component, status, resolution,version, t.type AS type, priority, owner, changetime AS modified, time AS _time,reporter AS _reporter FROM ticket t LEFT JOIN enum p ON p.name = t.priority AND p.type = 'priority' INNER JOIN milestone m ON m.name = t.milestone WHERE m.completed = 0 ORDER BY (milestone IS NULL), milestone, (status = 'closed'), (CASE status WHEN 'closed' THEN modified ELSE (-1)*p.value END) DESC

新しいレポートの追加のしかたは「チケットを見る」で「レポート一覧」に行き、「レポートの登録」をクリックし、「レポート名」「レポートについての説明」を適当に入力し、「レポートのSQL」に上記SQLを貼付けて「保存」します。

これで「レポート一覧」ページに新しいレポート種類が追加されたはずです。

2007年05月14日

CentOS 4.3とyumとsqlite

先日、tracのDB定義をsqliteのコマンドで直接参照するというのを書いたのですが、この時、sqliteのコマンドラインツールが入っていなかったため、yumを使ってインストールした。

これが良くなかったようで、今朝からtracに接続できなくなっていた。なぜ今朝からかというと、金曜の夜に一度ブレーカが落ちてtracを運用しているサーバを再起動したので、httpサーバ(さらに詳しく言うとmod_python)の読むライブラリがその時から新しくなり、その後、誰もアクセスしなかったため、今朝気付いた訳です。
#ブレーカが落ちるオフィスというのもアレですが(苦笑)

現象はhttpdがメモリをどんどん食いつぶしてメモリーエラーで落ちる。落ちるまでの間ロードアベレージもCPU使用率もバンバン上がる。最初はHDDのせいか?メモリ不良か?とハードを疑った(ブレーカー落ちの不正終了もあったので)のですが、他のサービスは問題なく動いているため、とりあえず、yum updateしてみた。

すると、こっちも落ちる。

# yum update Setting up Update Process Setting up repositories Reading repository metadata in from local files Traceback (most recent call last): File "/usr/bin/yum", line 29, in ? yummain.main(sys.argv[1:]) File "/usr/share/yum-cli/yummain.py", line 97, in main result, resultmsgs = do() File "/usr/share/yum-cli/cli.py", line 471, in doCommands return self.updatePkgs() File "/usr/share/yum-cli/cli.py", line 949, in updatePkgs self.doRepoSetup() File "/usr/share/yum-cli/cli.py", line 75, in doRepoSetup self.doSackSetup(thisrepo=thisrepo) File "__init__.py", line 260, in doSackSetup File "repos.py", line 287, in populateSack File "sqlitecache.py", line 96, in getPrimary File "sqlitecache.py", line 83, in _getbase File "sqlitecache.py", line 76, in getDatabase File "sqlitecache.py", line 49, in loadCache File "/var/tmp/python-sqlite-root//usr/lib/python2.3/site-packages/sqlite/main.py", line 244, in execute MemoryError

これでsqliteのバージョンが合ってない事に気付きました(遅い)最後に行った設定変更をまず疑うのが基本でした。

OSはCentOS 4.3なので、RPMを探すとsqlite-3.2.2-1.i386.rpmである。金曜に入ったsqliteは、sqlite-3.3.3-1.2。

# wget http://ftp.riken.jp/Linux/centos/4.3/os/i386/CentOS/RPMS/sqlite-3.2.2-1.i386.rpm # rpm -Uvh --oldpackage sqlite-3.2.2-1.i386.rpm

これで無事yumも起動、tracにもアクセスできるようになりました。ここのCentOSのバージョンも上げたいところだなぁ。

投稿者 iwazawa : 13:21 | コメント (2)

2007年05月10日

tracのテーブル定義

プロジェクト管理ツールtracのレポートはSQLを変更して、かなり自由にカスタマイズできるのですが、trac自体のテーブル定義がどうなっているのか、よく分からない。
最初から入っているレポートのSQLを参照すると、まぁだいたいは分かる。分かるのだが、もっと便利な項目が隠れていないか知りたいと思いGoogleに聞いてみたが。意外とすんなり見つからない。
私の探し方も悪いのかもしれないが、sqliteでスキーマ情報をダンプするコマンドがある事が分かり、それでやっと知る事ができた。これ。

$ sqlite3 sqlite> .schema

いちいち、コンソールからこれをやるのも面倒なので、ここに載せておきます。

ちなみに、使っているtracのバージョンは
Trac 0.10.3 Trac-Ja(インタアクト株式会社による日本語化版)

sqlite> .schema CREATE TABLE attachment ( type text, id text, filename text, size integer, time integer, description text, author text, ipnr text, UNIQUE (type,id,filename) ); CREATE TABLE auth_cookie ( cookie text, name text, ipnr text, time integer, UNIQUE (cookie,ipnr,name) ); CREATE TABLE component ( name text PRIMARY KEY, owner text, description text ); CREATE TABLE enum ( type text, name text, value text, UNIQUE (type,name) ); CREATE TABLE milestone ( name text PRIMARY KEY, due integer, completed integer, description text ); CREATE TABLE node_change ( rev text, path text, node_type text, change_type text, base_path text, base_rev text, UNIQUE (rev,path,change_type) ); CREATE TABLE permission ( username text, action text, UNIQUE (username,action) ); CREATE TABLE report ( id integer PRIMARY KEY, author text, title text, query text, description text ); CREATE TABLE revision ( rev text PRIMARY KEY, time integer, author text, message text ); CREATE TABLE session ( sid text, authenticated integer, last_visit integer, UNIQUE (sid,authenticated) ); CREATE TABLE session_attribute ( sid text, authenticated integer, name text, value text, UNIQUE (sid,authenticated,name) ); CREATE TABLE system ( name text PRIMARY KEY, value text ); CREATE TABLE ticket ( id integer PRIMARY KEY, type text, time integer, changetime integer, component text, severity text, priority text, owner text, reporter text, cc text, version text, milestone text, status text, resolution text, summary text, description text, keywords text ); CREATE TABLE ticket_change ( ticket integer, time integer, author text, field text, oldvalue text, newvalue text, UNIQUE (ticket,time,field) ); CREATE TABLE ticket_custom ( ticket integer, name text, value text, UNIQUE (ticket,name) ); CREATE TABLE version ( name text PRIMARY KEY, time integer, description text ); CREATE TABLE wiki ( name text, version integer, time integer, author text, ipnr text, text text, comment text, readonly integer, UNIQUE (name,version) ); CREATE INDEX node_change_rev_idx ON node_change (rev); CREATE INDEX revision_time_idx ON revision (time); CREATE INDEX session_authenticated_idx ON session (authenticated); CREATE INDEX session_last_visit_idx ON session (last_visit); CREATE INDEX ticket_change_ticket_idx ON ticket_change (ticket); CREATE INDEX ticket_change_time_idx ON ticket_change (time); CREATE INDEX ticket_status_idx ON ticket (status); CREATE INDEX ticket_time_idx ON ticket (time); CREATE INDEX wiki_time_idx ON wiki (time);
投稿者 iwazawa : 11:36 | コメント (0)