Fork me on GitHub

ContinuousIntegration-Travis

Travis CI 教程

我们编写软件代码,更多的时间是花费在 build 和 test 过程中,因为它们可以帮助发现代码中的 BUG。
这时候,如果存在这样的情况:把代码推送到仓库后,代码可以自动部署测试,并且反馈执行结果,那是一件多棒的事情。
这并不是一件不可能的事情,这是持续集成(Continuous Integration, CI)能够提供的一项功能。

持续集成

持续集成(Continuous Integration, CI)指代码仓库的代码一旦进行了变更,就会按照之前制定的脚本或文件,自动构建测试项目代码。如果运行结果正常,则将新代码集成到主干。

持续集成的好处在于,对于每次的变动,都会进行自动的检测,保证每次更新后都可以正常运行,而不用等到开发完成进行一次大合并,然后再不断解决出现的问题。

Travis CI

Travis CI 是目前比较受欢迎的 CI 工具,主要是因为它对 Github 的支持(也只支持 Github),使得许多开源项目都在使用它。使用 Gitlab 的话,它自己提供了一套 CI,所以并不需要 Travis CI

前期准备

在开始 Travis CI 体验之前,首先要做一点前期准备:

  • 拥有 Github 账号
  • Github 拥有自己的 repo
  • repo 内包含构建与测试脚本

这里的 repo 主要针对可运行项目,如果你要给一个 Markdown 项目运行 CI,当然也可以,只是没有太大的意义而已。

上面三点满足后,那么开始体验 Travis CI。

首先访问 Travis 的官方网站:travis-ci.org,使用你的 Github 账号登陆。这时,你会在 Travis 页面看到你 Gtihub 中的所有代码仓库,比如我的:

repo

当你将 repo 的 button 设为开启时,表示你激活了仓库,同意 Travis CI 监听这个仓库的变化。

Travis 配置

对于开启监听权限的仓库,我们还需要告诉 Travis 如何对项目代码进行构建测试。这里 Travis 使用 .travis.yml 来完成对于 CI 的配置。

在激活的仓库根目录下,我们创建 .travis.yml 文件。一旦 Travis 监听到仓库变化,它就会根据这个 yml 文件,进行自动构建部署。

它的语法也很简单,比如针对一个 Node 项目的简单 travis.yml 文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# specific project language
language: node_js

# target versions
node_js:
- '10.0'
- '9.0'

# dependency installation
install:
npm install

# script to run
script:
npm run test

# toggle branch
branches:
only:
- master

language是必须的,它告诉 Travis 运行一个支持何种语言的虚拟环境,然后下面可以指定测试的环境版本,比如上面测试了10.0和9.0版本的 node 环境。

install是告诉 Travis 如何安装项目依赖,对于默认的 node 项目,Travis 会默认执行 npm install 命令,但有可能你的项目有其他依赖,可以在这里说明。

script表明你希望如何测试你的项目

branches表示只有当该分支变动时,才会自动构建测试。

这里只是简单的介绍,还有更多的设置可以参考官方的文档

这里提供一个我写的 node 项目的 .travis.yml,其中包括了缓存依赖,指定版本的 mysql 服务,更改 mysql 密码,导入数据库和coveralls支持。

Travis Icon

相信你们在很多项目的 README 都看过这个 icon:icon

你当然也可以拥有!它不仅表明你在使用 Travis,同时也告诉别人,你的项目是可以正常构建部署的,同时也能通过你自己的测试代码,给人一种安心的感觉。

获得这个 Icon,只需要你在 Travis 网站,进入你激活的仓库。它会出现在你的项目名的右侧,点击之后可以选择你需要的链接方式。将该链接放入你的 README,它就会跟你的 Travis 自动同步了。

更进一步

只要激活了仓库,配置了 .travis.yml 文件就可以了,拥有了 Icon,就比没有用过 CI 的人要更进一步了。但这里,我还是想再说说 Travis 运行的流程,毕竟多学点东西,总是好的。

Travis 运行主要分为两个阶段:installscript

当 Travis 根据 .travis.yml 创建完虚拟环境,获取到指明的缓存后,它主要经历上述两个阶段,进入成功或失败的状态,最后还包括一个可选的 deploy 阶段。

Install

install 阶段安装项目的依赖,在这里你可以指定多个 command 来完成安装,比如:

1
2
3
install:
- wget ...
- ./install.sh

如果某一步安装失败,整个构建过程会直接退出,因为可以猜测项目无法正常运行。

Script

script阶段指定构建的测试脚本,同样,它也支持多个 command:

1
2
3
script:
- ./test1.sh
- ./test2.sh

install不同,某一步测试失败,并不会直接退出,Travis 会运行完所有的测试,以便发现都有哪些地方出错。当然,某一步失败当然会导致最终的构建失败。

Deploy

deploy阶段可以将项目直接部署,当然它并不是必须的,只是提供了便捷的构建后的部署方案。

由于我没有使用过 Travis 进行部署,所以具体的部署方式,参考官方文档

Life Cycle

最后,我们来看看 Travis 的完整生命周期:

  1. 创建虚拟环境
  2. before_install
  3. install
  4. before_script
  5. script
  6. after_success or after_failure
  7. [OPTIONAL] before_deploy
  8. [OPTIONAL] deploy
  9. [OPTIONAL] after_deploy
  10. after_script
  11. 结束

在每一个阶段,你都可以指明你希望进行的事情,Travis 也提供了对应的钩子。

其他

Travis 也提供了其他的业务,比如:

这里不多说,官方文档还是比较齐全的。