そろそろTracのワークフローについて語っておくか

思いのほかワークフローに言及する人が少ないので、この辺で少し語ってみることにしてみる。

0.10までのtracは基本的には new → assigned → closed という非常に貧弱で単純。
これに対処すべくTracの利用者の多くは、管理者以外はチケットクローズしないという運用ルールを決めたり、実装者にクローズさせておいて確認日を入れるカスタムフィールドを用意して対処したり、とりあえず人に優しいとは言えない状態でした。

まぁ当然この貧弱さは問題視されていなかったわけではなく、0.11へのバージョンアップでワークフローがカスタマイズ可能になり問題を解決することが可能になっているわけです。

0.11では

  • デフォルトワークフローの変更
    • これは assigned の後に accepted というステータスが追加になりました。
      これにより0.10以前では把握が難しかった着手・未着手の状態が、
      「着手する」というアクションを経て 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つの値を設定することができます。

 tracwiki/TracWorkflowから引用


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 へのステータス変更がチケットを作成するの
と同じ意味合いであるを意味します。

resolve に関する設定部分(18〜21行目)

20行目

resolve.operations = set_resolution

チケットの解決方法を選択させます。*5

(おまけ)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' に設定され、直観的ではありません。

tracwiki/TracWorkflowから引用

というわけで0.10から0.11へ移行したプロジェクトは、既存のチケットに対する処理を行わなくても運用は可能なので、trac.iniを設定しbasic ワークフローに変更することを私はお奨めします。

*1:Trac-jaで日本語化されたTracでのサンプルなので、アクションが日本語化されています。

*2:ひっくり返すと closed のときには表示されない。

*3:actionname.nameは無くても無問題だけど、無いと accept がそのまま表示されて英語嫌いの人に使って貰いにくくなるかもw

*4:カスタマイズする際の基本は TICKET_MODIFY で良いと思います。

*5:解決方法なんて要らん!という人は、ここをコメントアウトすると選択の必要が無くなりますが、個人的にはお奨めしません。