Travis CI 教程

Travis CI 提供的是持续集成服务(Continuous Integration,简称 CI)。它绑定 Github 上面的项目,只要有新的代码,就会自动抓取。然后,提供一个运行环境,执行测试,完成构建,还能部署到服务器。

开始使用

Travis CI 只支持 Github,不支持其他代码托管服务。

首先,访问travis-ci 官方网站,使用 Github 账户登入 Travis CI。

Travis 会列出 Github 上面你的所有仓库,以及你所属于的组织。此时,选择你需要 Travis 帮你构建的仓库,打开仓库旁边的开关。一旦激活了一个仓库,Travis 会监听这个仓库的所有变化。

配置.travis.yml

Travis 要求项目的根目录下面,必须有一个.travis.yml文件。这是配置文件,指定了 Travis 的行为。该文件必须保存在 Github 仓库里面,一旦代码仓库有新的 Commit,Travis 就会去找这个文件,执行里面的命令。

这个文件采用 YAML 格式。下面是一个最简单的 python 项目的.travis.yml文件。

1
2
language: python
script: true

上面代码中,设置了两个字段。language字段指定了默认运行环境,这里设定使用 Python环境。script字段指定要运行的脚本,script: true表示不执行任何脚本,状态直接设为成功。

Travis 默认提供的运行环境,请参考官方文档。目前一共支持31种语言,以后还会不断增加。

下面是一个稍微复杂一点的.travis.yml

1
2
3
4
language: python
sudo: required
before_install: sudo pip install foo
script: py.test

上面代码中,设置了四个字段:运行环境是 Python,需要sudo权限,在安装依赖之前需要安装foo模块,然后执行脚本py.test

运行流程

Travis 的运行流程很简单,任何项目都会经过两个阶段。

  • install 阶段:安装依赖
  • script 阶段:运行脚本

install 字段

install字段用来指定安装脚本。

1
install: ./install-dependencies.sh

如果有多个脚本,可以写成下面的形式。

1
2
3
install:
- command1
- command2

上面代码中,如果command1失败了,整个构建就会停下来,不再往下进行。

如果不需要安装,即跳过安装阶段,就直接设为true

1
install: true

script 字段

script字段用来指定构建或测试脚本。

1
script: bundle exec thor build

如果有多个脚本,可以写成下面的形式。

1
2
3
script:
- command1
- command2

注意,scriptinstall不一样,如果command1失败,command2会继续执行。但是,整个构建阶段的状态是失败。

如果command2只有在command1成功后才能执行,就要写成下面这样。

1
script: command1 && command2

Node 项目

Node 项目的环境需要写成下面这样。

1
2
3
language: node_js
node_js:
- "8"

node_js字段用来指定 Node 版本。

Node 项目的installscript阶段都有默认脚本,可以省略。

  • install默认值:npm install
  • script默认值:npm test

更多设置请看官方文档

部署

script阶段结束以后,还可以设置通知步骤(notification)和部署步骤(deployment),它们不是必须的。

部署的脚本可以在script阶段执行,也可以使用 Travis 为几十种常见服务提供的快捷部署功能。比如,要部署到 Github Pages,可以写成下面这样。

1
2
3
4
5
6
deploy:
provider: pages
skip_cleanup: true
github_token: $GITHUB_TOKEN # Set in travis-ci.org dashboard
on:
branch: master

其他部署方式,请看官方文档

钩子方法

Travis 为上面这些阶段提供了7个钩子。

  • before_install:install 阶段之前执行
  • before_script:script 阶段之前执行
  • after_failure:script 阶段失败时执行
  • after_success:script 阶段成功时执行
  • before_deploy:deploy 步骤之前执行
  • after_deploy:deploy 步骤之后执行
  • after_script:script 阶段之后执行

完整的生命周期,从开始到结束是下面的流程。

  1. before_install
  2. install
  3. before_script
  4. script
  5. aftersuccess or afterfailure
  6. [OPTIONAL] before_deploy
  7. [OPTIONAL] deploy
  8. [OPTIONAL] after_deploy
  9. after_script

下面是一个before_install钩子的例子。

1
2
3
before_install:
- sudo apt-get -qq update
- sudo apt-get install -y libxml2-dev

上面代码表示before_install阶段要做两件事,第一件事是要更新依赖,第二件事是安装libxml2-dev
用到的几个参数的含义如下:-qq表示减少中间步骤的输出,-y表示如果需要用户输入,总是输入yes

运行状态

最后,Travis 每次运行,可能会返回四种状态。

  • passed:运行成功,所有步骤的退出码都是0
  • canceled:用户取消执行
  • errored:before_install、install、before_script有非零退出码,运行会立即停止
  • failed :script有非零状态码 ,会继续运行

使用技巧

环境变量

.travis.ymlenv字段可以定义环境变量。

1
2
3
4
env:
- DB=postgres
- SH=bash
- PACKAGE_VERSION="1.0.*"

然后,脚本内部就使用这些变量了。

有些环境变量(比如用户名和密码)不能公开,这时可以通过 Travis 网站,写在每个仓库的设置页里面,Travis 会自动把它们加入环境变量。
这样一来,脚本内部依然可以使用这些环境变量,但是只有管理员才能看到变量的值。具体操作请看官方文档

加密

如果不放心保密信息明文存在 Travis 的网站,可以使用 Travis 提供的加密功能。官方文档
如果要加密的是文件(比如私钥),Travis 提供了加密文件功能。官方文档
实际的例子可以参考下面两篇文章。

添加图标

添加build状态图标

我们可以在项目中添加 Travis CI build的状态图标,点击下图中的图标获取连接:

coverage 图标

Codecov是一个测试结果分析工具,travis负责执行测试,Codecov负责分析测试结果。很多项目通过他测试覆盖率。

使用

官网,使用 Github 账户登入。选择要分析的仓库。

修改.travis.yml文件:

1
2
3
4
5
6
script:
- npm run lint
- npm run test:coverage
after_script:
- npm install codecov
- ./node_modules/.bin/codecov

上面安装了codecov,因为不是全局安装,所以运行./node_modules/.bin/codecov

test:coverage:

1
"test:coverage": "nyc --reporter=html --reporter=text-lcov > coverage.lcov mocha"

这里使用 nyc生成覆盖率报告。nyc使用教程
注意> coverage.lcov这里不能漏掉,这个报告是要上传到Codecov的。

添加下面格式的链接到Readme

1
[![codecov](https://codecov.io/gh/{USER}/{REPO}/branch/master/graph/badge.svg)](https://codecov.io/gh/{USER}/{REPO})

更多配置参考官方文档

更多图标可以在这里找。

原文出自 持续集成服务 Travis CI 教程