前言

今天学习并使用了Travis.CI,遇到了不少问题,所幸都一一得到了解决,为了让自己印象深刻,决心写个blog,既可当成是一个问题记录,也可以看作是一个有关travis.ci的教程

什么是CI

CI,英文全称:Continuous Integration,即持续集成。那么什么又是持续集成?

持续集成指的是只要代码有变更,就自动运行构建和测试,反馈运行结果。确保符合预期以后,再将新代码”集成”到主干。

持续集成的好处在于,每次代码的小幅变更,就能看到运行结果,从而不断累积小的变更,而不是在开发周期结束时,一下子合并一大块代码。

本文要介绍的就是大名鼎鼎的Travis CI

Travis CI

Travis CI提供的就是一个持续集成服务,它在开源社区(github)上非常流行,想必你在逛github时会经常看到这样的徽章

Build Status

是的,这就是使用Travis.CI的标志啦,有木有觉得很有逼格呢~

Travis CI的特点

简单易学(学会了之后就是这种感觉呗😏)

高端大气上档次😎

免费!(Travis CI对github上公开的仓库完全免费,对于私有仓库则会收取一定费用,如果你已经付费购买了github的私有仓库,那么就不必再额外支付Travis CI的费用)

Travis CI的使用条件

前面有提到过…Travis CI在开源社区中十分的流行…事实上…Travis CI也只能结合Github去使用

对于免费版Travis CI,它的地址在这里 travis CI 免费版,对于付费版Travis CI,它的地址如下travis CI 付费版

对Travis CI的使用条件总结如下

  • 拥有 GitHub 帐号
  • 该帐号下面有一个项目
  • 该项目里面有可运行的代码
  • 该项目还包含构建或测试脚本

无论是免费版还是付费版,它们的使用方法都是相同的

Travis CI的使用

  1. 使用github账号登录Travis.CI
  2. 选择需要集成CI服务的仓库并激活,如下图所示

选择并激活仓库

  1. 在你项目的根目录下新建一个.travis.yml的文件,该文件指定了travis CI的行为且必须保存在github的仓库中

    一旦仓库中有了新的commit,Travis就会去找这个文件,并执行其中的相关命令,该文件使用YAML文件格式进行描述,不得不多提一句,一旦你的YAML文件格式错误,Travis将无法识别并自动build,报错如下

    解析错误

    这里有一个在线工具可用于检验你.travis.yml文件的格式是否正确。在线检测YAML文件格式

  2. 编写你的.travis.yml文件

    有关该文件的内容,Travis 提供了很多功能,详情请移步官网

    下面就一些简单的内容做一下解释,假设有.travis.yml文件内容如下

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

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

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

    1
    2
    install 阶段:	安装依赖
    script 阶段: 运行脚本
  3. 使用Travis.CI登录服务器实现服务的持续集成

    想要实现此功能,需要一定的前提:

    • ssh key
    • ruby 2.0 +
    • 基于某些原因下的科学上网

    在具备上述条件后就可以开始我们的Travis CI与服务器的交互集成了

    首先需要安装一个gem包:travis

    1
    gem install travis

    安装完成后,切换到你仓库根目录,执行

    1
    travis login

    根据提示,输入你刚刚用于travis-ci网站登录的Github账户名及密码。

    做好基本的项目配置之后,我们需要配置持续部署的自动运行脚本。

    首先使用travis encrypt-file命令对你刚刚在开发环境生成的密匙进行加密(这样一来可以放心地将密匙保存在公开的开源项目当中)

    1
    2
    # 此处的--add参数表示自动添加脚本到.travis.yml文件中
    travis encrypt-file ~/.ssh/id_rsa --add

    之后再打开.travis.yml文件,会发现多了一个before_install的钩子

    1
    2
    3
    before_install:
    - openssl aes-256-cbc -K $encrypted_830d3b21a25d_key -iv $encrypted_830d3b21a25d_iv
    -in id_rsa.enc -out ~\/.ssh/id_rsa -d

    Travis 一共提供了7个钩子,总结如下

钩子名称 阶段解释
before_install install 阶段之前执行
before_script script 阶段之前执行
after_failure script 阶段失败时执行
after_success script 阶段成功时执行
before_deploy deploy 步骤之前执行
after_deploy deploy 步骤之后执行
after_script script 阶段之后执行

注意!!!😡😈默认生成的命令可能会在/前面带转义符\,我们不需要这些转义符,手动删掉所有的转义符,否则可能在后面引发莫名的错误 like this

转义错误

在完成上述内容后,我们还需要正确地设置权限和认证,这是为了避免…出现诸如..需要添加ssh key…确认提示…然而travis CI并没有一个交互式环境…错误如下

权限错误

在全部的准备工作都完成后,就可以添加部署脚本了,这里以我自己的Python项目为例,给出我的.travis.yml文件内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
script:
- ls
after_success:
- ssh ubuntu@139.199.7.86 'cd /www/ynpublaw && git pull && env/bin/pip install -r requirements.txt'
- ci.sh

before_install:
- openssl aes-256-cbc -K $encrypted_fed0778d0d20_key -iv $encrypted_fed0778d0d20_iv
-in id_rsa.enc -out ~/.ssh/id_rsa -d
- chmod 600 ~/.ssh/id_rsa
- echo -e "Host 139.199.7.86\n\tStrictHostKeyChecking no\n" >> ~/.ssh/config

# safelist
branches:
only:
- dev

参考

本文参考如下:
《一点都不高大上,手把手教你使用Travis CI实现持续部署》

《持续集成服务 Travis CI 教程》

留言

⬆︎TOP