Trac 工单工作流系统
目录
Trac 工单系统提供可配置的工作流。
默认工单工作流
当创建新环境时,您的 trac.ini 中会配置一个默认工作流。此工作流是基本工作流,具体请参阅basic-workflow.ini
额外工单工作流
Trac 源代码树中提供了示例工作流,请参阅contrib/workflow 以获取 .ini
配置文件节。其中之一可能非常符合您的需求。它们可以粘贴到您的 trac.ini
文件的 [ticket-workflow]
节中。但是,如果您有现有工单,如果这些工单的状态不在新工作流中,则可能会出现问题。
以下是一些图表,展示了上述示例。
基本工单工作流定制
注意:工单的“状态”并非单独定义。工单所能处于的状态由工作流中定义的转换自动生成。因此,创建新的工单状态只需在工作流中定义以该状态开始或结束的状态转换即可。
在 trac.ini
的 [ticket-workflow]
节中,每个条目都是可以对工单执行的操作。例如,请考虑 simple-workflow.ini
中的 accept
操作
accept = new,accepted -> accepted accept.permissions = TICKET_MODIFY accept.operations = set_owner_to_self
此示例中的第一行定义了 accept
操作,以及该操作有效的状态(new
和 accepted
),以及执行该操作时工单的新状态(accepted
)。
accept.permissions
行指定了用户执行此操作所需的权限。ExtraPermissionsProvider 可以在此处定义新的权限。
accept.operations
行指定了执行操作时,除了状态更改之外,还将对工单进行的更改。在此示例中,当用户单击 accept
时,工单负责人字段将更新为当前登录的用户。可以在逗号分隔的列表中指定多个操作。
可用的操作包括
- del_owner -- 清除负责人字段。
- set_owner -- 将负责人设置为选定或输入的负责人。默认为当前用户。当
[ticket] restrict_owner = true
时,选择框将填充具有TICKET_MODIFY
权限和已认证会话的用户。- 操作名称
.set_owner
可以选择指定一个逗号分隔的用户列表,用于填充选择框,或指定单个用户。列表还可以包含群组和权限(自 1.1.3 版)。当指定群组或权限时,选择框将填充该群组的所有成员或拥有该权限的所有用户。
- 操作名称
- set_owner_to_self -- 将负责人设置为当前登录的用户。
- may_set_owner -- 将负责人设置为选定或输入的负责人。默认为现有负责人。(自 1.1.2 版)。
- del_resolution -- 清除解决方案字段。
- set_resolution -- 将解决方案设置为所选值。
- 操作名称
.set_resolution
可以选择设置为逗号分隔列表或单个值。此属性中指定的解决方案必须在数据库中定义。示例resolve_new = new -> closed resolve_new.label = resolve resolve_new.operations = set_resolution resolve_new.permissions = TICKET_MODIFY resolve_new.set_resolution = invalid,wontfix
- 操作名称
- leave_status -- 显示“保留为 <当前状态>”,并且不对工单进行任何更改。
- reset_workflow -- 重置处于不再定义的状态的工单的状态。
注意:指定冲突的操作,例如 set_owner
和 del_owner
,其结果未指定。
以下示例演示了 .label
属性。这里的操作是 resolve_accepted
,但它将以 resolve
的形式呈现给用户。
resolve_accepted = accepted -> closed resolve_accepted.label = resolve resolve_accepted.permissions = TICKET_MODIFY resolve_accepted.operations = set_resolution
.label
属性是 Trac 1.1.3 中新增的,功能上与 .name
属性相同,后者现已弃用。如果未指定 .label
或 .name
,则该操作将以 resolve accepted 的形式呈现给用户,其中下划线已被替换为空格(自 1.1.3 版)。
对于应在所有状态下可用的操作,可以使用 *
代替状态。显而易见的例子是 leave
操作
leave = * -> * leave.operations = leave_status leave.default = 1
转换为 *
(-> *
)表示工作流操作决定下一个状态。唯一可配置的决定下一个状态的工单工作流操作是 leave_status
。但是,另一个工作流控制器可以对具有新状态 *
的操作进行操作并确定下一个状态。
这也展示了 .default
属性的使用。此值应为整数,操作的显示顺序由该值决定。具有最高 .default
值的操作会首先列出,并默认选中。其余操作按 .default
值递减的顺序列出。如果未为某个操作指定,.default
默认为 0。该值可以为负数。
工作流有一个硬编码的约束:工单应具有 closed
状态。默认报告/查询会将除 closed
之外的任何状态都视为开放状态。
工单创建操作
工单创建操作通过从特殊的 <none>
状态转换来指定。用户必须至少有一个可用的创建操作才能创建工单。默认工作流中定义的创建操作是
create = <none> -> new create.default = 1 create_and_assign = <none> -> assigned create_and_assign.label = assign create_and_assign.permissions = TICKET_MODIFY create_and_assign.operations = may_set_owner
工单重置操作
对于处于不再定义的状态的工单,默认会添加特殊的 _reset
操作。这允许在工作流更改后单独“修复”工单,尽管建议管理员通过批量修改受影响的工单来执行此操作。默认情况下,_reset
操作可供具有 TICKET_ADMIN
权限的用户使用,重置的工单会进入 new 状态。默认的 _reset
操作等同于以下 [ticket-workflow]
操作定义
_reset = -> new _reset.label = reset _reset.operations = reset_workflow _reset.permissions = TICKET_ADMIN _reset.default = 0
自milestone:1.0.3起,可以通过重新定义隐式操作来定制 _reset
操作。例如,要允许任何具有 TICKET_MODIFY
权限的用户执行 _reset
操作,需要将工作流操作定义为
_reset = -> new _reset.label = reset _reset.operations = reset_workflow _reset.permissions = TICKET_MODIFY _reset.default = 0
工作流可视化
可以使用 Workflow 宏 在维基上渲染工作流以进行可视化。
工作流也可以使用 contrib/workflow/workflow_parser.py
脚本进行可视化。该脚本会输出 GraphViz 能识别的 .dot
文件。该脚本可以按如下方式使用(您的安装路径可能不同)
$ cd /var/local/trac_devel/contrib/workflow/
$ ./showworkflow /srv/trac/PlannerSuite/conf/trac.ini
该脚本会在与 trac.ini
文件相同的目录中输出 trac.pdf
。
示例:在工作流中添加可选测试
以下添加了一个 testing
操作。当工单状态为 new
、accepted
或 needs_work
时,您可以选择提交它进行测试。当工单处于测试状态时,用户可以选择拒绝并将其返回到 needs_work
,或者通过测试并将其发送到 closed
。如果他们接受,则工单会自动标记为 closed
,并且解决方案设置为 fixed
。由于所有旧工作流都保留,工单可以跳过整个此部分。
testing = new,accepted,needs_work,assigned,reopened -> testing testing.label = Submit to reporter for testing testing.permissions = TICKET_MODIFY reject = testing -> needs_work reject.label = Failed testing, return to developer pass = testing -> closed pass.label = Passes Testing pass.operations = set_resolution pass.set_resolution = fixed
示例:添加简单的可选通用评审状态
有时 Trac 在“测试”对不同的人可能意味着不同的情境中使用,因此您可能希望创建一个可选的工作流状态,它介于默认工作流的 assigned
和 closed
状态之间,但不强制实施特定于实现的细节。为此,您唯一需要添加的新状态是 reviewing
状态。然后,工单可以从任何可重新分配的状态“提交以供评审”。如果评审通过,您可以重用 resolve
操作来关闭工单;如果评审失败,您可以重用 reassign
操作将其退回到正常工作流。
新的 reviewing
状态及其关联的 review
操作如下所示
review = new,assigned,reopened -> reviewing review.operations = set_owner review.permissions = TICKET_MODIFY
为了将其与默认工作流集成,您还需要将 reviewing
状态添加到 accept
和 resolve
操作中
accept = new,reviewing -> assigned […] resolve = new,assigned,reopened,reviewing -> closed
(可选)您还可以添加一个新操作,允许您更改工单负责人,而无需将工单移出 reviewing
状态。这使您能够重新分配评审工作,而无需将工单推回 new
状态。
reassign_reviewing = reviewing -> * reassign_reviewing.label = reassign review reassign_reviewing.operations = set_owner, leave_status reassign_reviewing.permissions = TICKET_MODIFY
完整的 [ticket-workflow]
配置将是
[ticket-workflow] create = <none> -> new create.default = 1 create_and_assign = <none> -> assigned create_and_assign.label = assign create_and_assign.permissions = TICKET_MODIFY create_and_assign.operations = may_set_owner accept = new,reviewing -> assigned accept.operations = set_owner_to_self accept.permissions = TICKET_MODIFY leave = * -> * leave.default = 1 leave.operations = leave_status reassign = new,assigned,accepted,reopened -> assigned reassign.operations = set_owner reassign.permissions = TICKET_MODIFY reopen = closed -> reopened reopen.operations = del_resolution reopen.permissions = TICKET_CREATE resolve = new,assigned,reopened,reviewing -> closed resolve.operations = set_resolution resolve.permissions = TICKET_MODIFY review = new,assigned,reopened -> reviewing review.operations = set_owner review.permissions = TICKET_MODIFY reassign_reviewing = reviewing -> * reassign_reviewing.operations = set_owner, leave_status reassign_reviewing.label = reassign review reassign_reviewing.permissions = TICKET_MODIFY
高级工单工作流定制
如果上述定制无法满足您的需求,您可以使用插件扩展工作流。插件可以为工作流提供额外的操作,例如代码评审,或者为某个操作实现副作用,例如触发构建,这些可能不仅仅是简单的状态更改。请参阅 sample-plugins/workflow 以获取一些入门示例。
但如果这些仍不足够,您可以禁用 ConfigurableTicketWorkflow 组件并创建一个完全替代它的插件。另请参阅 AdvancedTicketWorkflowPlugin,它提供了额外的操作。
将工作流状态添加到里程碑进度条
如果您的工作流中添加了额外的状态,您可能还需要定制您的里程碑进度条。请参阅 [milestone-groups] 节。
后续步骤构想
工作流系统的增强构想应作为增强工单提交给工单系统组件。您也可以将构想记录在TracIdeas/TracWorkflow页面。