そろそろTracのワークフローについて語っておくか
思いのほかワークフローに言及する人が少ないので、この辺で少し語ってみることにしてみる。
0.10までのtracは基本的には new → assigned → closed という非常に貧弱で単純。
これに対処すべくTracの利用者の多くは、管理者以外はチケットクローズしないという運用ルールを決めたり、実装者にクローズさせておいて確認日を入れるカスタムフィールドを用意して対処したり、とりあえず人に優しいとは言えない状態でした。
まぁ当然この貧弱さは問題視されていなかったわけではなく、0.11へのバージョンアップでワークフローがカスタマイズ可能になり問題を解決することが可能になっているわけです。
0.11では
- デフォルトワークフローの変更
- これは assigned の後に accepted というステータスが追加になりました。
これにより0.10以前では把握が難しかった着手・未着手の状態が、
「着手する」というアクションを経て accepted にステータスを変更することにより
把握することが可能になりました。
- これは assigned の後に accepted というステータスが追加になりました。
- ワークフローのカスタマイズサポート
- 要望の多かったワークフローのカスタマイズのサポート。
始まりが new で終わりが close という縛りはありますが、
アクションとステータスを任意にカスタマイズをすることが出来ます。
- 要望の多かったワークフローのカスタマイズのサポート。
が行われていて、使い方によってはかなり幸せになれます。
redmineと比較してコマンドラインでの操作と設定ファイルが面倒と評判のtracですが、ワークフローのカスタマイズも基本は設定ファイルであるtrac.iniに設定を行います。ワークフローのカスタマイズについてはwiki/TracWorkflowに書かれてるので良く読んでみても・・・分かりにくいww
ザクッと書くと、設定の基本は
- italic;">actionname:元ステータスと変更先ステータスの設定
- italic;">actionname.name:チケットの操作時に表示されるアクションの表示名称
- italic;">actionname.operations:アクションで実行する操作(ステータス変更以外)
- italic;">actionname.permissions :アクションを実行可能するのに必要な権限
と書いても、今ひとつピンと来ないww
まずはtracのワークフローについて、0.11の設定ファイルの内容で基本的な設定についての解説。
Trac 0.11基本のワークフロー
0.11の基本のワークフローの設定。
Tracにあるwiki中ではbasicワークフローと呼ばれます。*1
[ticket-workflow] accept = new,assigned,accepted,reopened -> accepted accept.name = 着手する accept.operations = set_owner_to_self accept.permissions = TICKET_MODIFY leave = * -> * leave.default = 1 leave.name = 変更しない leave.operations = leave_status reassign = new,assigned,accepted,reopened -> assigned reassign.name = 担当者変更 reassign.operations = set_owner reassign.permissions = TICKET_MODIFY reopen = closed -> reopened reopen.name = 差し戻す reopen.operations = del_resolution reopen.permissions = TICKET_CREATE resolve = new,assigned,accepted,reopened -> closed resolve.name = 解決にする resolve.operations = set_resolution resolve.permissions = TICKET_MODIFY
accept に関する設定部分(2〜5行目)
2行目
accept = new,assigned,accepted,reopened -> accepted
ステータスが new,assigned,accepted,reopened のいずれかのときに assigned 変更に出来るということを示してます。
つまり accept というアクションは new,assigned,accepted,reopened のチケットのときのみ表示されます。*2
3行目
accept.name = 着手する
チケットの下部のアクション部分に表示される名称の設定です。
accept というアクションの表示名称として「着手する」が設定されてます。*3
4行目
accept.operations = set_owner_to_self
チケットに対するステータス変更以外の操作の設定です。
この場合はチケットを操作したログインユーザがownerとしてセットされます。
その他の利用可能な操作は以下の通り
- del_owner -- チケットの所有者を削除します。
- set_owner -- チケットの所有者を選択された所有者か入力された所有者に設定します。
- actionname.set_owner カンマ区切りのリストか1つの値を設定することができます。
- set_owner_to_self -- チケットの所有者をログインユーザに設定します。
- del_resolution -- チケットの解決方法を削除します。
- set_resolution -- チケットの解決方法を選択された解決方法か入力された解決方法に設定します。
- actionname.set_resolution カンマ区切りのリストか1つの値を設定することができます。
5行目
accept.permissions = TICKET_MODIFY
アクションを実行するために必要な権限の設定。
accept のアクションを実行するには「TICKET_MODIFY」の権限が必要ということになります。
Tracのユーザに付与するパーミッションと同じものが利用可能。*4
leave に関する設定部分(6〜9行目)
6行目
leave = * -> *
アスタリスクは毎度お馴染みのワイルドカードです。
全てのステータスが該当。
7行目
leave.default = 1
actionname.default はアクションの部分に表示される順序のの設定。
設定されている値の大きい順に表示されます。
この例の場合は leave にしか設定されていないので、常に一番上に出ることになります。
reassign に関する設定部分(10〜13行目)
reassign.operations = set_owner
「担当者変更」のときに、担当者欄が表示されるのでは set_owner というoperations が設定されているためです。
reassign.set_owner を追加し、カンマ区切りで担当者のリスト化を行うことも可能です。
reopen に関する設定部分(14〜17行目)
16行目
reopen.operations = del_resolution
「解決にする(resolve)」際に設定された解決方法(resolution)を削除します。
これは基本ワークフローでは resolution はclosed の時に設定されるものでなので、
closed から他へ変更する「差し戻し」のアクションのときに削除しているわけです。
17行目
reopen.permissions = TICKET_CREATE
「差し戻し」のアクションの実行には TICKET_CREATE の権限が必要です。
これは結果として reopened へのステータス変更がチケットを作成するの
と同じ意味合いであるを意味します。
(おまけ)Trac 0.10のワークフロー
0.10から移行した場合のワークフロー設定サンプルです。
0.11のワークフローがbasic ワークフローと呼ばれるのに対して、
こちらはoriginal ワークフローと呼ばれます。
[ticket-workflow] accept = new -> assigned accept.name = 着手する accept.operations = set_owner_to_self accept.permissions = TICKET_MODIFY leave = * -> * leave.default = 1 leave.name = 更新しない leave.operations = leave_status reassign = new,assigned,reopened -> new reassign.name = 担当者変更 reassign.operations = set_owner reassign.permissions = TICKET_MODIFY reopen = closed -> reopened reopen.name = 差し戻す reopen.operations = del_resolution reopen.permissions = TICKET_CREATE resolve = new,assigned,reopened -> closed resolve.name = 解決にする resolve.operations = set_resolution resolve.permissions = TICKET_MODIFY
0.11のワークフローと比べて accept/reassign が大きく違っているのが分かります。
original ワークフローにはいくつかの重要な "欠点" があります; 新しいチケットを承認 (accept) したときにステータスは 'assigned' に設定されますが、 'assigned' のチケットを再割り当て (reassign) するとステータスは 'new' に設定され、直観的ではありません。
tracのwiki/TracWorkflowから引用
というわけで0.10から0.11へ移行したプロジェクトは、既存のチケットに対する処理を行わなくても運用は可能なので、trac.iniを設定しbasic ワークフローに変更することを私はお奨めします。