规则和规则评估

Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019

规则用于设置或限制对工作项字段的值分配。 有两种主要的规则类型:自动生成的规则和为流程或项目定义的自定义规则。 自动生成的规则可最大程度地减少为应按标准方式工作的领域添加自定义规则的需要。

定义自定义规则以支持业务用例。 根据字段的数据类型,你可以针对能够输入该字段的数据设置各种限制。 你可以为选取列表(下拉菜单)指定值、设置默认值、清除条目或限制更改。 通过条件规则,你可以基于不同字段值之间的依赖关系对字段应用规则。 你还可以限制能修改字段的人员或将规则的作用域限制为仅适用于组。

阅读本文以了解以下内容:

  • 系统如何应用自动生成的规则
  • 对系统字段自定义规则的定义的限制
  • 可以应用的不同类型的自定义规则
  • 如何评估规则
  • 为继承进程定义的规则与本地 XML 进程之间的差异
  • 为何应最大程度地减少定义的自定义规则数

在定义自定义规则之前,请阅读 “配置和自定义 Azure Boards”,大致了解如何自定义 Azure Boards 以满足业务需求。

提示

最大程度地减少为 WIT 定义的规则数。 虽然可以为 WIT 创建多个规则,但当用户添加和修改工作项时,添加规则可能会对性能产生负面影响。 当用户保存工作项时,系统将验证与其工作项类型字段关联的所有规则。 在某些情况下,规则验证表达式过于复杂,SQL 无法计算。

自动生成的规则

自动生成的规则可最大程度地减少为应按标准方式工作的领域添加自定义规则的需要。

状态转换规则

继承的进程会针对添加到工作流的每个自定义工作项类型和自定义状态动态生成整个任意到任意状态转换规则集。 从任何状态转换到任何状态都有效。

对于本地 XML 进程,必须在工作项类型定义的节中 WORKFLOW 指定有效的转换。

状态转换和按/日期字段规则

“按/日期”字段对应于“创建者/日期”、“激活者/日期”、“已解决日期”和“关闭日期”。

对于继承的进程,在将工作项从一个状态转换为另一个状态时,将自动设置或清除这些字段。 更改的依据/日期字段不包含,因为它们随每个工作项保存而更新,并且与状态转换无关。

管理这些字段的默认规则和行为包括:

  1. 关闭状态始终包含在“已完成”状态类别中
  2. 已完成 ”状态类别不可配置,并且与一个状态相关联,并且仅与一个状态相关联。
  3. 对于敏捷和 CMMI 进程,此已关闭状态始终为 Closed,并且始终为 Scrum 和 Basic 进程完成
  4. 这些规则的自动生成受区域设置的影响,因为规则条件包含已本地化的状态名称。 系统为不同的区域设置生成不同的规则。
  5. 仅为包含这些字段的工作项类型指定自动生成的规则。 工作项类型可能不包含其中一个或多个字段。
  6. 当工作项类型具有自定义状态或工作项类型为自定义工作项类型时,需要这些规则。
  7. 这些规则仅适用于继承的进程;它们永远不会为托管 XML 或本地 XML 进程生成。

工作流状态与状态类别相关联,以支持板上的工作流。 有关详细信息,请参阅如何在积压工作和面板中使用工作流状态和状态类别

状态更改日期字段规则

这些规则在技术上比关闭日期/关闭日期规则要简单得多,因为它们不依赖于任何特定状态。 对于任何工作项类型,相同的规则将始终正常工作。 它们需要自动生成,因为某些 OOB 工作项类型不包含状态更改日期字段,因此当用户将此字段添加到自定义工作项类型时,也需要自动生成这些规则。 此处也适用于“已关闭日期”/“关闭日期”规则的相同原则。

自定义规则

所有自定义规则都是可选的。 对于继承的进程,可以指定一个规则,该规则由条件加操作组成。 对于本地 XML 进程,可以指定字段或工作流中的规则。

两个进程之间没有一对一映射。 在某些情况下,XML 元素规则是在 继承进程的“编辑”字段 对话框中定义的,而不是作为规则定义。 继承的进程中不支持其他 XML 元素,例如 FROZENMATCHNOTSAMEAS

注意以下事项:

  • 始终强制实施规则,不仅当你与表单交互,而且当与其他工具交互时也是如此。 例如,将字段设置为只读不仅将规则应用于工作项窗体,还通过 API 和 Excel Azure DevOps Server 外接程序应用规则。
  • 继承的进程条目指定条件和操作以生成完整的规则。 XML 元素不区分这些。
  • 字段规则不支持分配其他两个字段的总和或执行其他数学计算的值。 但是,可以通过 TFS 聚合器(Web 服务)市场扩展找到符合需求的解决方案。 另 请参阅工作和其他字段的汇总。
  • 你可能会发现使用市场扩展(例如 工作项窗体控件库扩展)将自定义规则应用于字段的其他解决方案。

规则组合

对于继承的进程,每个规则由两个部分组成:条件和操作。 条件定义必须满足的条件才能应用规则。 操作定义要执行的操作。 对于大多数规则,每个规则最多可以指定两个条件和 10 个操作。 所有自定义规则都需要满足所有条件才能运行。

例如,可以根据分配给状态的值和另一个字段创建所需的字段。 例如:

   (Condition) When a work item State is积极
   (Condition) And when the value of值区域 =
   (Action) Then make required故事点

注意

目前,状态转换规则仅支持一个条件。 如果要基于状态应用规则,请参阅 “将规则应用于工作流状态”。

下表总结了所选条件中可用的操作。

条件

支持的操作

设置字段值或进行必需或只读

条件、工作项已创建

操作,工作项已创建

根据状态限制转换

条件,工作项已移动

操作,基于状态限制事务。

隐藏字段或根据状态和用户或组成员身份使字段只读或必需

条件、用户组成员身份

操作,基于状态和成员身份限制事务。

根据用户或组成员身份设置字段属性或限制状态转换

条件、用户组成员身份

操作,基于状态和成员身份限制事务。

定义过多规则时会发生什么情况

每个项目定义一个 SQL 表达式,以便在创建或更新工作项时验证工作项。 此表达式随为项目定义的所有工作项类型指定的规则数增长。 为字段指定的每个行为限定符会导致子表达式的数量增加。 嵌套规则、仅适用于转换或条件为其他字段的值的规则,会导致将更多条件添加到 IF 语句中。 表达式达到特定大小或复杂性后,SQL 将无法再对其进行计算并生成错误。 删除某些 WIT 或消除某些规则可以解决此错误。

你可以为选取列表(下拉菜单)指定值、设置默认值、清除条目或限制更改。 通过条件规则,你可以基于不同字段值之间的依赖关系对字段应用规则。 你还可以限制能修改字段的人员或将规则的作用域限制为仅适用于组。

工作项规则不存在为单个集合。 这些规则实际上是从不同的数据源动态生成和合并的。 合并逻辑是一个简单的规则,合并相同的规则,但不剪裁冲突规则。

绕过规则

通常,当用户修改工作项时,规则引擎会验证所有工作项。 但是,为了支持某些方案,分配了 “绕过”工作项规则更新 项目级权限的用户可以保存工作项,而无需评估规则。

可以通过以下两种方式之一绕过规则。 第一个是通过 工作项 - 更新 REST API 并将参数设置为 bypassRules true。 第二种是通过客户端对象模型(通过旁路模式初始化)进行初始化(初始化 WorkItemStore 方式 WorkItemStoreFlags.BypassRules)。

系统字段和自定义规则

系统字段具有“系统”。名称 引用名称,例如 System.TitleSystem.State

以下系统字段必须具有一个值:区域 ID更改日期、创建日期、创建者状态原因

规则引擎将设置条件或操作限制为系统字段,但如下所示:

  • 可以将 “状态 ”和 “原因” 字段设为只读。
  • 可以将大多数规则应用于“标题”、“分配给”、“说明”和“更改者”字段。

如果未看到继承过程的规则用户界面下拉菜单中列出的字段,这就是原因。 例如,如果尝试根据条件使 区域路径(System.AreaPath)只读,则“区域路径 ”字段不适用于选择。 即使能够指定系统字段,规则引擎也可以限制你保存规则。

默认规则和复制规则

默认规则和复制规则修改工作项字段的值。 它们定义运行时行为和约束,例如指定默认值、清除字段、需要定义字段等。

可以根据当前用户的组成员身份限制来限制这些规则的应用,如用户或组成员身份规则限制中所述

大多数这些规则操作都可以随任何条件的选择一起应用。

继承的进程操作

描述

Copy the value from...

指定要复制到当前字段的值的另一个字段。

Clear the value of...

清除它包含的任何值的字段。

Use the current time to set the value of ...

根据当前用户的时间设置设置设置字段的时间。

约束规则

约束规则限制更改字段的值。 它们定义工作项的有效状态。 每个约束在单个字段上运行。 约束在工作项保存的服务器上进行评估,如果违反任何约束,则会拒绝保存操作。

可以根据当前用户的组成员身份限制来限制这些规则的应用,如用户或组成员身份规则限制中所述

大多数这些规则操作都可以随任何条件的选择一起应用。

继承的进程操作

描述

Hide the field...
仅当选择组成员资格条件时可用。

指定不显示工作项窗体上的字段,实质上是删除当前用户更改字段值的能力。

Make read-only

防止字段完全被修改。 你可能希望在某些条件下应用此规则。 例如,关闭工作项后,你想要使字段只读,以保留数据以供报告。
若要指定字段默认值为只读,请在“编辑字段”对话框“ 选项 ”选项卡中指定。

Make required

要求用户指定字段的值。 在为所有必填字段分配值之前,用户无法保存工作项。
若要指定字段默认值,请在“编辑字段”对话框“ 选项 ”选项卡中指定。

选取列表

选取列表定义用户可为字符串或整数字段选择的值。 在选取列表中定义的值显示在工作项窗体和查询编辑器上。

对于继承的进程,选择列表是通过“编辑”字段对话框定义的。

“编辑字段”对话框

描述

选取列表字段的定义 选项卡

定义字段允许的值的列表。 允许的值是可用于在工作项窗体和查询生成器的字段列表中选择的值。 必须从其中一个值中进行选择。

选中“允许用户在”选项“选项卡中输入自己的值复选框,以允许用户指定自己的条目

定义字段的建议值的列表。 建议的值是可用于在工作项窗体和查询生成器的字段列表中选择的值。 还可以向列表中的值输入其他值。

条件字段值或更改

条件规则根据字段的值指定操作,该值等于或不等于特定值,或者更改或未对特定字段的值进行更改。 通常,条件规则首先应用于无条件规则。 当多个条件规则的计算结果为 true 时,执行顺序为:When、WhenNot、WhenChanged、WhenNotChanged。

可以为每个字段指定多个条件规则。 但是,只能为每个条件规则指定一个驾驶字段。

继承的条件

描述

The value of ... (equals) [When]

指定当另一个字段具有特定值时应用于当前字段的一个或多个规则。

A change was made to the value of ... [WhenChanged]

更改特定字段的值时,将一个或多个规则应用于当前字段。

The value of ... (not equals) [WhenNot]

当另一个字段没有特定值时,将一个或多个规则应用于当前字段。

No change was made to the value of ... [WhenNotChanged]

当特定字段的值未更改时,将一个或多个规则应用于当前字段。


继承的操作

描述

Clear the value of ...
Copy the value from ...
Make read-only ...
Make required ...
Set the value of ...
Use the current time to set the value of ...
Use the current user to set the value of ...

指定要对特定字段执行的操作。

用户或组成员身份规则限制

可以根据当前用户的成员身份限制规则的应用程序。 建议将规则范围限定为 Azure DevOps 安全组,而不是单个用户,不过可以指定后者。 若要将规则限定为多个组,必须创建包含要使用的组集的父 Azure DevOps 组。

进程实现

提示

若要避免可能出现的规则评估问题,请指定 Azure DevOps 安全组,而不是Microsoft Entra ID 或 Active Directory 安全组。 有关详细信息,请参阅 默认规则和规则引擎

如下表所示,若要根据当前用户的成员身份限制规则,请指定继承进程的两个条件之一。 这些规则适用于 Azure DevOps 2020 及更高版本。

适用于

规则

条件

Current user is a member of group ...
Current user is not member of group ...

操作

Hide the field ...
Make read-only ...
Make required ...
Restrict the transition to state ...

使用令牌引用用户或组

标识或人员选取器字段可以接受引用用户和组的值。 将规则限制为组时,指示组的域或范围。 对于某些值,可以使用令牌。

令牌示例包括:

  • [ProjectName],如 [Fabrikam], [FabrikamFiber], [MyProject]
  • [OrganizationName],如 [fabrikam], [myorganization]
  • [CollectionName],如 [fabrikam], [myorganization]

若要了解项目或组织可用的范围,请转到 “项目设置>权限>组 ”或 “组织设置>权限>组 ”页,可以根据需要筛选列表。 例如,下图显示了基于 Azure DevOps 筛选列表的前四个条目。 有关详细信息,请参阅 “更改项目级权限 ”或 “更改项目集合级权限”。

筛选的权限组列表的屏幕截图。

若要了解有关默认安全组的详细信息,请参阅 权限和组

规则评估

根据修改工作项的用户或组成员身份指定条件的规则以两种方式之一进行评估。 评估规则时,应用程序需要通过检查该用户是否是指定组的成员来确定该规则是否适用于当前用户。

  • 从 Web 门户、REST API 或 azure boards 命令修改工作项时,会发出对 Microsoft Entra ID 或 Active Directory 的请求。 此操作不会出现任何问题。
  • 使用 WIT 客户端对象模型从 Visual Studio、Excel 或其他自定义工具修改工作项时,评估成员身份的请求基于客户端缓存。 客户端缓存不知道 Active Directory 组。

注意

使用 GIT 的项目 Visual Studio 2019 团队资源管理器已重新编写为使用 REST API。

若要避免用户从各种客户端更新工作项时出现问题,请指定 Azure DevOps 安全组而不是 Active Directory 组。 可以轻松创建 Azure DevOps 安全组,以对应于 Active Directory 组。 若要了解如何操作,请参阅 添加或删除用户或组,管理安全组

注意

WIT 客户端 OM 已弃用。 自 2020 年 1 月 1 日起,在处理 Azure DevOps Services 和 Azure DevOps Server 2020 时不再支持它。

计算规则的顺序

规则通常按照列出规则的顺序进行处理。 但是,所有规则评估的完整顺序并不完全确定。

本部分介绍应用条件、复制和默认规则时的预期行为和交互。

以下步骤按正确的顺序显示 Azure DevOps 执行的交互以及工作项窗体的用户。 用户仅执行步骤 1、8 和 13。

  1. 从 Azure DevOps 客户端(例如 Web 门户或 Visual Studio 团队资源管理器)用户创建新的工作项或编辑现有工作项。

  2. 填写字段默认值。 对于所有字段,请应用分配给不属于条件子句的字段的任何默认值。

  3. 复制或设置字段值。 对于所有字段,请应用任何规则来复制值或设置不属于条件子句的字段的值。

  4. 对于具有“当条件规则匹配”的所有字段,应用规则来设置或复制字段值。

  5. 对于具有匹配的 When Not 条件规则的所有字段,应用规则来设置或复制字段值。

    系统始终在“何时不规则”之前处理 When 规则。

  6. 对于自步骤 1 以来其值已更改且包含 “更改时” 规则的所有字段,请应用规则来设置或复制字段值。

  7. 允许用户开始编辑。

  8. 用户更改字段值,然后从字段中移动焦点。

  9. 处理与新值匹配的字段的任何 When 规则。

  10. 处理与新值匹配的字段的任何 When Not 规则。

  11. 处理与新值匹配的字段的任何 “更改时” 规则。

  12. 向用户返回编辑功能。

  13. 用户将更改保存到数据存储。

  14. 对于所有字段,应用在条件规则下直接或间接为字段定义的任何 Use the current time to set the value of ... 操作。