作业生命周期

Travis CI 提供默认构建环境和每种编程语言的默认阶段集。为您的作业创建虚拟机并配备构建环境,将您的存储库克隆到其中,安装可选插件,然后运行您的构建阶段。

继续阅读以了解如何通过您的 .travis.yml 自定义此过程中的任何阶段,并查看 Travis CI 构建配置参考

构建 #

.travis.yml 文件描述了构建过程。Travis CI 中的构建是一系列阶段。每个阶段都包含并行运行的作业。

作业生命周期 #

每个作业都是一系列阶段主要阶段

  1. install - 安装所需的任何依赖项
  2. script - 运行构建脚本

Travis CI 可以在阶段中运行自定义命令

  1. before_install - 在安装阶段之前
  2. before_script - 在脚本阶段之前
  3. after_script - 在脚本阶段之后。
  4. after_success - 当构建成功时(例如,构建文档),结果位于 TRAVIS_TEST_RESULT 环境变量中
  5. after_failure - 当构建失败时(例如,上传日志文件),结果位于 TRAVIS_TEST_RESULT 环境变量中

还有三个可选的部署阶段

作业阶段的完整序列是生命周期。步骤如下:

  1. 可选安装 apt 插件
  2. 可选安装 缓存组件
  3. before_install
  4. install
  5. before_script
  6. script
  7. 可选 before_cache(当且仅当缓存有效时)
  8. after_successafter_failure
  9. 可选 before_deploy(当且仅当部署处于活动状态时)
  10. 可选 deploy
  11. 可选 after_deploy(当且仅当部署处于活动状态时)
  12. after_script

构建可以由许多作业组成。

自定义安装阶段 #

默认依赖项安装命令取决于项目语言。例如,Java 构建使用 Maven 或 Gradle,具体取决于存储库中存在哪个构建文件。当存储库中存在 Gemfile 时,Ruby 项目使用 Bundler。

您可以指定自己的脚本以安装项目依赖项

install: ./install-dependencies.sh

使用自定义脚本时,它们应可执行(例如,使用 chmod +x)并包含有效的 Shebang 行,例如 /usr/bin/env sh/usr/bin/env ruby/usr/bin/env python

您还可以提供多个步骤,例如同时安装 ruby 和 node 依赖项

install:
  - bundle install --path vendor/bundle
  - npm install

当安装中的某个步骤失败时,构建会立即停止并标记为出错

您还可以使用 apt-getsnap安装依赖项

跳过安装阶段 #

通过将以下内容添加到您的 .travis.yml 中来完全跳过安装步骤

install: skip

自定义构建阶段 #

默认构建命令取决于项目语言。Ruby 项目使用 rake,这是大多数 Ruby 项目的共同点。

您可以在 .travis.yml 中覆盖默认构建步骤

script: bundle exec thor build

您也可以指定多个脚本命令

script:
- bundle exec rake build
- bundle exec rake builddoc

当某个构建命令返回非零退出代码时,Travis CI 构建也会运行后续命令并累积构建结果。

在上面的示例中,如果 bundle exec rake build 返回退出代码 1,则后续命令 bundle exec rake builddoc 仍会运行,但构建将导致失败。

如果您的第一步是运行单元测试,然后运行集成测试,您可能仍希望查看集成测试在单元测试失败时是否成功。

您可以使用一些 shell 技巧来更改此行为,以便随后运行所有命令,但在第一个命令返回非零退出代码时仍使构建失败。这是您 .travis.yml 的代码片段

script: bundle exec rake build && bundle exec rake builddoc

此示例(注意 &&)在 bundle exec rake build 失败时立即失败。

关于 $? 的说明 #

script 中的每个命令都由一个特殊的 bash 函数处理。此函数操作 $? 以生成适合显示的日志。因此,您不应该依赖于 script 部分中 $? 的值来更改构建行为。有关更技术的讨论,请参阅 此 GitHub 问题

复杂的构建命令 #

如果您有一个复杂的构建环境,难以在 .travis.yml 中配置,请考虑将步骤移动到单独的 shell 脚本中。该脚本可以是您存储库的一部分,并且可以轻松地从 .travis.yml 中调用。

考虑这样一个场景:您想要运行更复杂的测试场景,但仅针对非拉取请求构建。shell 脚本可能是

#!/bin/bash
set -ev
bundle exec rake:units
if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then
  bundle exec rake test:integration
fi

注意顶部的 set -ev-e 标志导致脚本在某个命令返回非零退出代码后立即退出。如果您希望您的任何脚本尽早退出,这将非常有用。它还有助于在复杂的安装脚本中,否则单个失败的命令不会导致安装失败。

-v 标志使 shell 在执行之前打印脚本中的所有行,这有助于识别哪个步骤失败了。

要从您的 .travis.yml 中运行该脚本

  1. 将其保存在您的存储库中,命名为 scripts/run-tests.sh
  2. 通过运行 chmod ugo+x scripts/run-tests.sh 使其可执行。
  3. 将其提交到您的存储库。
  4. 将其添加到您的 .travis.yml
     script: ./scripts/run-tests.sh
    

这是如何工作的?(或者,为什么不应该在构建步骤中使用 exit#

作业生命周期中指定的步骤被编译成单个 bash 脚本并在工作器上执行。

覆盖这些步骤时,请勿使用 exit shell 内置命令。这样做会冒终止构建过程的风险,而不会给 Travis 机会执行后续任务。

在自定义脚本中使用exit是安全的。如果指示错误,则任务将被标记为失败。

构建中断 #

如果作业生命周期前四个阶段中的任何命令返回非零退出代码,则构建将中断。

  • 如果before_installinstallbefore_script返回非零退出代码,则构建将出错并立即停止。
  • 如果script返回非零退出代码,则构建将失败,但在被标记为失败之前会继续运行。

after_successafter_failureafter_scriptafter_deploy以及后续阶段的退出代码不会影响构建结果。但是,如果这些阶段之一超时,则构建将被标记为失败

部署代码 #

作业生命周期中的一个可选阶段是部署。此阶段通过使用我们的持续部署提供商之一将代码部署到 Heroku、Amazon 或其他受支持的平台来定义。如果构建中断,则部署步骤将被跳过。

将文件部署到提供商时,通过在 .travis.yml 中添加 skip_cleanup,防止 Travis CI 重置您的工作目录并删除构建期间所做的所有更改(git stash --all)。

deploy:
  skip_cleanup: true

您可以使用before_deploy阶段在部署之前运行命令。此阶段中的非零退出代码将使构建出错

如果您想在部署后运行任何步骤,可以使用after_deploy阶段。

请注意,after_deploy不会影响构建状态。

请注意,before_deployafter_deploy分别在每个部署提供商之前和之后运行,因此如果有多个提供商,它们将运行多次。