加速构建
Travis CI 实现了一些优化,有助于加速构建,例如数据库文件的内存文件系统,但还可以采取一系列措施来进一步改进构建时间。
跨虚拟机并行化构建 #
要加快测试套件的速度,您可以使用 Travis CI 的 构建矩阵 功能将其分解成几个部分。
假设您想将单元测试和集成测试分成两个不同的构建作业。它们将并行运行,并充分利用您的帐户可用的构建容量。
以下是如何在您的 .travis.yml
中利用此功能的示例
然后,您更改脚本命令以使用新的环境变量来确定要运行的脚本。
Travis CI 将根据环境变量确定构建矩阵,并安排两个构建运行。
此设置的巧妙之处在于,单元测试套件通常会在集成测试套件之前完成,从而让您更快地获得基本测试覆盖率的视觉反馈。
根据测试套件的大小和复杂性,您可以将其进一步拆分。您可以将集成测试的不同关注点分离到不同的子文件夹中,并在构建矩阵的不同阶段运行它们。
然后,您可以调整脚本命令以对每个子文件夹运行 rspec
例如,Rails 项目使用构建矩阵功能为每个要测试的数据库创建单独的作业,并按关注点拆分测试。一组仅运行 railties 的测试,另一组运行 actionpack、actionmailer、activesupport,还有一系列集合针对多个数据库运行 activerecord 测试。请参阅其 .travis.yml 文件 以获取更多示例。
在一台虚拟机上并行化构建 #
在一台虚拟机上并行化测试套件取决于语言和测试运行器
- 对于 Ruby 和 RSpec,请使用 parallel_tests gem。
- 对于 Java,请使用内置功能 使用 JUnit 并行运行测试。
为了让您了解我们正在谈论的速度提升,我尝试在 travis-core
上并行运行测试,我能够看到跨 4 个作业从大约 26 分钟下降到大约 19 分钟。
在多台虚拟机上并行化 RSpec、Cucumber 和 Minitest #
如果您想在多台虚拟机上并行化 RSpec、Cucumber 或 Minitest 的测试以更快地从 CI 获得反馈,您可以尝试使用 knapsack gem。它将跨虚拟机拆分测试,并确保测试在每个虚拟机上运行的时间大致相同(每个作业将花费类似的时间)。您可以使用我们的矩阵功能来设置 knapsack。
RSpec 并行化示例 #
此配置将生成具有以下 2 行 ENV 的矩阵
MY_GLOBAL_VAR=123 CI_NODE_TOTAL=2 CI_NODE_INDEX=0
MY_GLOBAL_VAR=123 CI_NODE_TOTAL=2 CI_NODE_INDEX=1
Cucumber 并行化示例 #
Minitest 并行化示例 #
RSpec、Cucumber 和 Minitest 并行化示例 #
如果您想同时并行化 RSpec、Cucumber 和 Minitest 的测试套件,请在 .travis.yml
中将脚本定义如下
您可以在 knapsack 文档 中找到更多示例。
缓存依赖项 #
对于较大的项目,安装项目的依赖项可能需要相当长的时间。为了加快速度,您可以尝试缓存依赖项。
您可以使用我们的 内置缓存 或在 S3 上自行构建。如果您想自行构建并且您使用 Ruby 和 Bundler,请查看 优秀的 WAD 项目。对于其他语言,您可以直接使用 s3 工具上传和下载依赖项。
环境特定的加速构建方法 #
除了 Travis 实现的优化之外,您还可以考虑一些环境特定的方法来提高测试速度。
PHP 优化 #
Travis CI 上的 PHP VM 镜像提供了包含 XDebug 的多个 PHP 版本。如果您希望在 Travis 构建中生成代码覆盖率报告,则 XDebug 扩展很有用,但已证明对性能有负面影响。
如果您希望考虑 禁用 PHP XDebug 扩展 用于构建,如果
- 您没有在 Travis 测试中生成代码覆盖率报告;或者
- 您正在 PHP 7.0 或更高版本上进行测试,并且能够使用 PHP 调试器 (phpdbg),它可能更快。
使用 phpdbg 示例 #
Makefile 优化 #
如果您的 makefile 构建由可以安全并行化的独立部分组成,则可以 同时运行多个配方。请参阅 虚拟化环境 以确定环境通常有多少个 CPU,并将 make
作业参数设置为类似的数字(如果您的构建经常等待磁盘 I/O,则可以略高一些)。
请注意,这样做会导致并发配方输出交错。