作业生命周期
Travis CI 提供默认构建环境和每种编程语言的默认阶段集。为您的作业创建虚拟机并配备构建环境,将您的存储库克隆到其中,安装可选插件,然后运行您的构建阶段。
继续阅读以了解如何通过您的 .travis.yml
自定义此过程中的任何阶段,并查看 Travis CI 构建配置参考。
构建 #
.travis.yml
文件描述了构建过程。Travis CI 中的构建是一系列阶段。每个阶段都包含并行运行的作业。
作业生命周期 #
每个作业都是一系列阶段。主要阶段为
install
- 安装所需的任何依赖项script
- 运行构建脚本
Travis CI 可以在阶段中运行自定义命令
before_install
- 在安装阶段之前before_script
- 在脚本阶段之前after_script
- 在脚本阶段之后。after_success
- 当构建成功时(例如,构建文档),结果位于TRAVIS_TEST_RESULT
环境变量中after_failure
- 当构建失败时(例如,上传日志文件),结果位于TRAVIS_TEST_RESULT
环境变量中
还有三个可选的部署阶段。
作业阶段的完整序列是生命周期。步骤如下:
- 可选安装
apt 插件
- 可选安装
缓存组件
before_install
install
before_script
script
- 可选
before_cache
(当且仅当缓存有效时) after_success
或after_failure
- 可选
before_deploy
(当且仅当部署处于活动状态时) - 可选
deploy
- 可选
after_deploy
(当且仅当部署处于活动状态时) 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-get
或 snap
来安装依赖项
跳过安装阶段 #
通过将以下内容添加到您的 .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
中运行该脚本
- 将其保存在您的存储库中,命名为
scripts/run-tests.sh
。 - 通过运行
chmod ugo+x scripts/run-tests.sh
使其可执行。 - 将其提交到您的存储库。
- 将其添加到您的
.travis.yml
中script: ./scripts/run-tests.sh
这是如何工作的?(或者,为什么不应该在构建步骤中使用 exit
) #
作业生命周期中指定的步骤被编译成单个 bash 脚本并在工作器上执行。
覆盖这些步骤时,请勿使用 exit
shell 内置命令。这样做会冒终止构建过程的风险,而不会给 Travis 机会执行后续任务。
在自定义脚本中使用
exit
是安全的。如果指示错误,则任务将被标记为失败。
构建中断 #
如果作业生命周期前四个阶段中的任何命令返回非零退出代码,则构建将中断。
- 如果
before_install
、install
或before_script
返回非零退出代码,则构建将出错并立即停止。 - 如果
script
返回非零退出代码,则构建将失败,但在被标记为失败之前会继续运行。
after_success
、after_failure
、after_script
、after_deploy
以及后续阶段的退出代码不会影响构建结果。但是,如果这些阶段之一超时,则构建将被标记为失败。
部署代码 #
作业生命周期中的一个可选阶段是部署。此阶段通过使用我们的持续部署提供商之一将代码部署到 Heroku、Amazon 或其他受支持的平台来定义。如果构建中断,则部署步骤将被跳过。
将文件部署到提供商时,通过在 .travis.yml
中添加 skip_cleanup
,防止 Travis CI 重置您的工作目录并删除构建期间所做的所有更改(git stash --all
)。
deploy:
skip_cleanup: true
您可以使用before_deploy
阶段在部署之前运行命令。此阶段中的非零退出代码将使构建出错。
如果您想在部署后运行任何步骤,可以使用after_deploy
阶段。
请注意,
after_deploy
不会影响构建状态。
请注意,
before_deploy
和after_deploy
分别在每个部署提供商之前和之后运行,因此如果有多个提供商,它们将运行多次。