调度优化策略¶
构建和测试的大多数优化都是通过 SCHEDULES
处理的。其概念如下:我们将任务分配到命名组件中,并将一组这样的组件与源代码树中的每个文件关联起来。给定推送中更改的一组文件,我们计算每个文件影响的组件的并集,并删除未标记任何这些组件的任务。
此优化系统旨在保持 保守。它表示可能受影响的内容,而不是任何关于哪些任务对特定文件更改有用的直观概念。例如
dom/url/URL.cpp
将任务调度到所有平台上,并且可能导致任何测试套件出现故障dom/system/mac/CoreLocationLocationProvider.mm
不可能影响除macosx
之外的任何平台,但可能影响任何测试套件python/mozbuild/mozbuild/preprocessor.py
可能影响任何平台,并且还应调度 Python lint 任务
排他性和包含性¶
这个“简单”计划中的第一个问题是文件很多,而且在大多数情况下,它们都影响大多数组件。但是,有一些组件仅受一组定义明确的文件影响。例如,仅当 Python 文件更改时,才需要调度 Python lint 组件。
我们将组件分为“排他性”和“包含性”组件。在没有其他配置的情况下,存储库中的任何文件都被认为会影响所有排他性组件,而不会影响任何包含性组件。
排他性组件可以被认为是一系列族。例如,平台 (linux、windows、macosx、android) 是一个组件族。测试套件 (mochitest、reftest、xpcshell 等) 是另一个。默认情况下,源文件与每个族中的每个组件相关联。这意味着标记有排他性组件的任务将始终运行,除非修改的源文件都不与该组件相关联。
但是,如果我们只想在修改预先确定的文件时运行特定任务怎么办?这就是包含性组件的使用场景。标记有包含性组件的任何任务将仅在修改与该组件关联的源文件时运行。Lint 任务和良好分离的单元测试任务是您可能希望包含性调度的良好示例。
保持清晰的一个好方法是考虑排他性平台族组件 (macosx
、android
、windows
、linux
) 和包含性 lint 组件 (py-lint
、js-lint
)。存储库中的任意文件都会影响所有平台族,但不一定需要 lint 运行。但是,我们可以将 macOS 专用文件(例如 CoreLocationLocationProvider.mm
)配置为专门影响 macosx
,并将 Python 文件(例如 preprocessor.py
)配置为除了排他性组件之外还影响 py-lint
。
还可以将文件定义为影响包含性组件,而不影响其他任何组件。例如,Python lint 任务的源代码和配置不会影响除 lint 之外的任何任务。
注意
大多数单元测试套件任务都分配给其平台族和测试套件的组件。这表示如果平台族受到影响(例如,android
),那么该平台的构建应执行,以及完整的测试套件。如果仅影响单个套件(例如,通过更改 reftest 源文件),则应为所有平台执行 reftests。
但是,某些测试套件(其贡献文件集已明确定义)表示为包含性组件。这些组件默认情况下不会为任何平台族执行,而仅在更改一个或多个贡献文件时执行。
规范¶
组件在 mozbuild.schedules
中定义为包含性或排他性。
文件注释¶
文件在其受影响的组件中使用 moz.build
文件进行注释,其片段如下所示:
with Files('**/*.py'):
SCHEDULES.inclusive += ['py-lint']
用于包含性组件,以及
with Files('*gradle*'):
SCHEDULES.exclusive = ['android']
用于排他性组件。请注意,对于包含性组件使用 +=
(因为这会添加到受影响组件的现有集中),但对于排他性组件使用 =
(因为这会将受影响集重置为更小的内容)。对于包含性组件被排他性影响的情况(例如上面示例中的 python-lint 配置),该组件可以分配给 SCHEDULES.exclusive
with Files('**/pep8rc'):
SCHEDULES.exclusive = ['py-lint']
如果多个片段设置 SCHEDULES.exclusive
,则最后一个片段将优先。因此,以下内容将为除 docs/
下的文件之外的所有文件将 SCHEDULES.exclusive
设置为 hpux
。
with Files('**'):
SCHEDULES.exclusive = ['hpux']
with Files('**/docs'):
SCHEDULES.exclusive = ['docs']
任务注释¶
使用 "skip-unless-schedules"
优化为任务注释其所属的组件,该优化采用此任务的组件列表
task['optimization'] = {'skip-unless-schedules': ['windows', 'gtest']}
对于测试,此值由基于套件名称和平台族的测试转换自动设置,为包含性测试套件执行正确操作。测试还可以使用各种其他优化器,例如 relevant_tests
、bugbug
(使用机器学习)或 backstop
(确保不会错过回归)。