Travis CI

a hosted continuous integration and deployment system

Posted on December 10, 2016

特点

  • 和github项目集成, 且开源github项目免费使用
  • 多语言支持

使用

  1. 打开travis-ci, 使用github账号登陆
  2. profile页面, 将需要CI的项目开启
  3. 在项目根目录下添加.travis.yml 声明相关环境信息, 已经CI执行的脚本
  4. 当代码push到github时, 将自动触发CI流程, 在travis用户项目页面, 可以看到CI流程和结果: https://travis-ci.org/{用户名}/{项目名}

自定义构建过程

.travis.yml 通常包括:

  • 项目语言
  • build之前的依赖安装/脚本
  • 测试命令
  • 构建失败时的通知方式

Build 生命周期

  1. install: 安装项目依赖
  2. script: 执行构建脚本

围绕install和script有若干hook, 完整的生命周期如下:

  1. Install apt addons
  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

Install

不同的语言项目有不同的依赖安装过程, 比如java使用Maven/Gradle, Ruby使用Bundler, 可以自定义安装脚本:

install: ./install-dependencies.sh

级联安装脚本:

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

如果其中一个脚本失败, 整个安装过程将结束, 并标记为errored

如果想跳过Install步骤, 可以这样: install: true

关于Build缓存: https://docs.travis-ci.com/user/caching/

Script

对于级联script:

script:
  bundle exec rake build
  bundle exec rake builddoc

如果上一条命令执行返回非零值(表示失败), 后续子命令还是会执行, 这样设计的原因主要是这些不同的子命令可能是测试不同的方向, 应该在一次CI中尽量跑完, 不过只要有一条非零返回, 整个构建结果将是失败的.

如果希望报错后续终止, 可以用: script: bundle exec rake build && bundle exec rake builddoc

  • before_install, install 或者 before_script 返回非零, 构建将标记为errored, 并且终止
  • script 返回非零, 构建将继续, 构建最终将标记为failed
  • after_success, after_failure, after_script 不影响构建结果, 除非是执行超时

更多请参考: Customizing the Build


Ruby 项目构建

指定ruby版本:

language: ruby
rvm:
  2.2

如果没有rvm配置, 将考虑需找项目下面的.ruby-version

执行测试:

Travis默认使用rake执行测试, 需要:

  1. rake加入Gemfile: gem 'rake', group: :test
  2. 如果项目使用的是rspec, Rakefile需要:

    begin
      require 'rspec/core/rake_task'
    
      RSpec::Core::RakeTask.new(:spec)
    
      task default: :spec
    rescue LoadError
        # no rspec available
    end
    

依赖安装:

默认使用Bundler, 默认命令: bundle install --jobs=3 --retry=3

如果检测到Gemfile.lock, 将增加参数--deployment

依赖安装可以通过重写install指令覆盖, 如install: gem install rails

Build 提速:

某些需要编译的组件会明显拖慢Build和测试过程, 这些组件有的不是在测试时必须的, 比如ruby-debug, unicorn or newrelic_rpm

可以将这部分组件放到production组里:

group :production do
  gem 'unicorn'
  gem 'newrelic_rpm'
end

然后在.travis.yml中指定构建参数: bundler_args: --without production

更多请参考: Building a Ruby Project


Node.js 项目构建

指定node版本:

language: node_js
node_js:
  "6"

node 版本将传递给nvm

如果没有指定nodejs版本, Travis将尝试使用.nvmrc来确定

依赖管理

默认命令: npm install, 在每次构建时, 依赖包都需要重新安装

另外还支持yarn

测试

默认命令npm test 这个命令具体执行的操作由package.json中决定:

"scripts": {
  "test": "vows --spec"
},

使用Gulp

TODO


其他