- 编写代码只是软件开发的一小部分,更多的时间往往花在构建(build)和测试(test)。
- 为了提高软件开发的效率,构建和测试的自动化工具层出不穷。Travis CI 就是这类工具之中,市场份额最大的一个。
是什么
Travis-CI 是一个开源的持续构建项目,能够测试和部署;Travis-CI 会同步你在 GitHub 上托管的项目,每当你 Commit Push 之后,就会在几分钟内开始按照你的要求测试部署你的项目。
目前 Travis-CI 分 http://travis-ci.org/ (GitHub 公开项目进这个)和 http://travis-ci.com/ (私有付费项目)
官方文档:[https://docs.travis-ci.com/ tarvis-ci ](https://docs.travis-ci.com/ tarvis-ci )会越来越好,具体请以官方为准。
什么是持续集成?
Travis CI 提供的持续集成服务(Continuous Integration,简称 CI)。它绑定 Github 上面的项目,只要有新的代码,就会自动抓取。然后,提供一个运行环境,执行测试,完成构建,还能部署到服务器。
持续集成指的是只要代码有变更,就自动运行构建和测试,反馈运行结果。确保符合预期以后,再将新代码"集成"到主干。
持续集成的好处在于,每次代码的小幅变更,就能看到运行结果,从而不断累积小的变更,而不是在开发周期结束时,一下子合并一大块代码。
使用
Travis CI 只支持 Github,不支持其他代码托管服务。这意味着,你必须满足以下条件,才能使用 Travis CI。
- 拥有 GitHub 帐号
- 该帐号下面有一个项目
- 该项目里面有可运行的代码
- 该项目还包含构建或测试脚本
- 如果这些条件都没问题,就可以开始使用 Travis CI 了。
首先,访问官方网站 travis-ci.org,点击右上角的个人头像,使用你的 Github 账户登入 Travis CI。
Travis 会列出 Github 上面你的所有仓库,以及你所属于的组织。此时,选择你需要 Travis 帮你构建的仓库,打开仓库旁边的开关。一旦激活了一个仓库,Travis 会监听这个仓库的所有变化。
添加 .travis.yml 文件到你项目根目录下,Travis-CI 会按照 .travis.yml 里的内容进行构建。
把 .travis.yml push 到你的 GitHub 上以触发 Travis-CI 进行构建。
最后你就可以到构建状态页面来查看你的项目是否构建成功。
理论
.travis.yml配置文件
Travis 要求项目的根目录下面,必须有一个.travis.yml
文件。这是配置文件,指定了 Travis 的行为。该文件必须保存在 Github 仓库里面,一旦代码仓库有新的 Commit,Travis 就会去找这个文件,执行里面的命令。
一个例子:
language: python # 声明构建语言环境
script: true
sudo: required
#sudo: false # sudo 权限
before_install: sudo pip install foo
script: py.test
notifications: # 每次构建的时候是否通知,如果不想收到通知邮箱(个人感觉邮件贼烦),那就设置 false 吧
email: false
- Travis 默认提供的运行环境,请参考官方文档 。目前一共支持31种语言,以后还会不断增加。
script
字段指定要运行的脚本,script: true表示不执行任何脚本,状态直接设为成功。- required表示需要
sudo
权限,false表示不需要 - 在安装依赖之前需要安装
foo
模块,然后执行脚本y.test
。
notifications:
email:
recipients:
- somenzz@163.com
on_success: change
on_failure: always
如果 commit 不想让 travis ci 构建,那么就在 commit message 里加上 [ci skip] 就行了。
git commit -m “[ci skip] commit message”
运行流程
Travis 的运行流程很简单,任何项目都会经过两个阶段(命令)。
- install 命令:安装依赖
- script 命令:运行脚本
install 命令
install命令用来指定安装脚本。
install: ./install-dependencies.sh
如果有多个脚本,可以写成下面的形式。
install:
- command1
- command2
上面代码中,如果command1
失败了,整个构建就会停下来,不再往下进行。
如果不需要安装,即跳过安装阶段,就直接设为true
。
install: true
script 命令
script字段用来指定构建或测试脚本。
script: bundle exec thor build
如果有多个脚本,可以写成下面的形式。
script:
- command1
- command2
注意,script与install不一样,如果command1失败,command2会继续执行。但是,整个构建阶段的状态是失败。
如果command2只有在command1成功后才能执行,就要写成下面这样。
script: command1 && command2
Travis 部署
script阶段结束以后,还可以设置通知步骤(notification)和部署步骤(deployment),它们不是必须的。
部署的脚本可以在script阶段执行,也可以使用 Travis 为几十种常见服务提供的快捷部署功能。比如,要部署到 Github Pages,可以写成下面这样。
部署的脚本可以在script阶段执行,也可以使用 Travis 为几十种常见服务提供的快捷部署功能。比如,要部署到 Github Pages,可以写成下面这样。
其他部署方式,请看官方文档。
Travis 钩子方法
Travis 为上面这些阶段提供了7个钩子。
- before_install:install 阶段之前执行
- before_script:script 阶段之前执行
- after_failure:script 阶段失败时执行
- after_success:script 阶段成功时执行
- before_deploy:deploy 步骤之前执行
- after_deploy:deploy 步骤之后执行
- after_script:script 阶段之后执行
完整的生命周期,从开始到结束是下面的流程。
- before_install
- install
- before_script
- script
- aftersuccess or afterfailure
- [OPTIONAL] before_deploy
- [OPTIONAL] deploy
- [OPTIONAL] after_deploy
- after_script
下面是一个before_install钩子的例子。
before_install:
- sudo apt-get -qq update
- sudo apt-get install -y libxml2-dev
上面代码表示before_install
阶段要做两件事,第一件事是要更新依赖,第二件事是安装ibxml2-dev
。用到的几个参数的含义如下:-qq表示减少中间步骤的输出,-y
表示如果需要用户输入,总是输入yes
。
Travis 运行状态
最后,Travis 每次运行,可能会返回四种状态。
- passed:运行成功,所有步骤的退出码都是0
- canceled:用户取消执行
- errored:before_install、install、before_script有非零退出码,运行会立即停止
- failed :script有非零状态码 ,会继续运行
我们经常看到的
这样一个标识,只看文字就可以看出这个项目是否已经构建成功(让大家知道项目没有问题),如果不成功则会显示 Build failing。