加速构建

Travis CI 实现了一些优化,有助于加速构建,例如数据库文件的内存文件系统,但还可以采取一系列措施来进一步改进构建时间。

跨虚拟机并行化构建 #

要加快测试套件的速度,您可以使用 Travis CI 的 构建矩阵 功能将其分解成几个部分。

假设您想将单元测试和集成测试分成两个不同的构建作业。它们将并行运行,并充分利用您的帐户可用的构建容量。

以下是如何在您的 .travis.yml 中利用此功能的示例

env:
  - TEST_SUITE=units
  - TEST_SUITE=integration
YAML

然后,您更改脚本命令以使用新的环境变量来确定要运行的脚本。

script: "bundle exec rake test:$TEST_SUITE"
YAML

Travis CI 将根据环境变量确定构建矩阵,并安排两个构建运行。

此设置的巧妙之处在于,单元测试套件通常会在集成测试套件之前完成,从而让您更快地获得基本测试覆盖率的视觉反馈。

根据测试套件的大小和复杂性,您可以将其进一步拆分。您可以将集成测试的不同关注点分离到不同的子文件夹中,并在构建矩阵的不同阶段运行它们。

env:
  - TESTFOLDER=integration/user
  - TESTFOLDER=integration/shopping_cart
  - TESTFOLDER=integration/payments
  - TESTFOLDER=units
YAML

然后,您可以调整脚本命令以对每个子文件夹运行 rspec

script: "bundle exec rspec $TESTFOLDER"
YAML

例如,Rails 项目使用构建矩阵功能为每个要测试的数据库创建单独的作业,并按关注点拆分测试。一组仅运行 railties 的测试,另一组运行 actionpack、actionmailer、activesupport,还有一系列集合针对多个数据库运行 activerecord 测试。请参阅其 .travis.yml 文件 以获取更多示例。

在一台虚拟机上并行化构建 #

在一台虚拟机上并行化测试套件取决于语言和测试运行器

为了让您了解我们正在谈论的速度提升,我尝试在 travis-core 上并行运行测试,我能够看到跨 4 个作业从大约 26 分钟下降到大约 19 分钟。

在多台虚拟机上并行化 RSpec、Cucumber 和 Minitest #

如果您想在多台虚拟机上并行化 RSpec、Cucumber 或 Minitest 的测试以更快地从 CI 获得反馈,您可以尝试使用 knapsack gem。它将跨虚拟机拆分测试,并确保测试在每个虚拟机上运行的时间大致相同(每个作业将花费类似的时间)。您可以使用我们的矩阵功能来设置 knapsack。

RSpec 并行化示例 #

script: "bundle exec rake knapsack:rspec"
env:
  global:
    - MY_GLOBAL_VAR=123
    - CI_NODE_TOTAL=2
  jobs:
    - CI_NODE_INDEX=0
    - CI_NODE_INDEX=1
YAML

此配置将生成具有以下 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 并行化示例 #

script: "bundle exec rake knapsack:cucumber"
env:
  global:
    - CI_NODE_TOTAL=2
  jobs:
    - CI_NODE_INDEX=0
    - CI_NODE_INDEX=1
YAML

Minitest 并行化示例 #

script: "bundle exec rake knapsack:minitest"
env:
  global:
    - CI_NODE_TOTAL=2
  jobs:
    - CI_NODE_INDEX=0
    - CI_NODE_INDEX=1
YAML

RSpec、Cucumber 和 Minitest 并行化示例 #

如果您想同时并行化 RSpec、Cucumber 和 Minitest 的测试套件,请在 .travis.yml 中将脚本定义如下

script:
  - "bundle exec rake knapsack:rspec"
  - "bundle exec rake knapsack:cucumber"
  - "bundle exec rake knapsack:minitest"
YAML

您可以在 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 示例 #

before_script:
  - phpenv config-rm xdebug.ini
  - composer install

script:
  - phpdbg -qrr phpunit
YAML

Makefile 优化 #

如果您的 makefile 构建由可以安全并行化的独立部分组成,则可以 同时运行多个配方。请参阅 虚拟化环境 以确定环境通常有多少个 CPU,并将 make 作业参数设置为类似的数字(如果您的构建经常等待磁盘 I/O,则可以略高一些)。

请注意,这样做会导致并发配方输出交错。

Makefile 并行化示例 #

env:
  global:
    - MAKEFLAGS="-j 2"
YAML