开始使用Travis CI持续集成你的项目吧

travis CI简介

travis CI是一项广受欢迎的持续集成服务,经过这项技术,咱们每次在向代码托管平台push咱们的代码时,travis就能够自动帮咱们完成一系列任务,好比自动将代码部署到咱们的服务器,测试等等。而这一系列任务则须要咱们在项目主目录下经过 .travis.yml 文件进行配置。javascript

travis CI的工做原理也不复杂,它使用了代码托管平台好比 github 提供的 webhooks API ,当咱们在代码库执行某些操做(好比将咱们的代码push到远程仓库)时,就会触发 travis 进行自动化任务的动做。而具体完成什么任务,则要根据咱们的须要经过配置文件进行配置。java

须要注意的是,travis 执行自动化任务并非在咱们本地,也不是在咱们的目标服务器上,而是在 travis 控制台(能够理解为在 travis 平台上搭建的虚拟环境)中。它会根据咱们项目使用的编程语言灵活搭建所须要的构建环境。node

下面咱们就直接上一个travis的实际使用案例:nginx

自动部署代码

像咱们每次写完代码,将代码部署到远程服务器,从新打包咱们的应用再重启服务器这样的体力活彻底能够交给咱们的主角 ——— travis CI 来完成。git

travis 根据咱们项目所使用的语言不一样,所执行的任务也会有所不一样,好比在 JavaScript 项目中,通常会先安装咱们项目中以及构建过程当中所须要的依赖,而后执行 npm test 测试命令(执行 npm test 命令是在不定义 script 参数时的默认行为,咱们也能够根据实际状况将 script 参数定义为须要执行的命令集合),在命令执行成功以后咱们还能够继续进行其余的操做,好比把代码部署到目标服务器。以上就是一次 build 过程会完成的内容。github

咱们的配置文件就是定义在依赖安装先后,脚本执行成功(或失败)以后等等一些时间节点须要 travis 帮咱们自动完成的工做。完整的 travis CI 构建过程包含如下这几个阶段:web

截图来源:travis CI官方文档npm

以 JavaScript 项目为例,按照官网的提示,首先须要在官网上对咱们要 build 的 github 项目启用持续集成,接着就能够在项目主目录下添加一个名为 .travis.yml 的配置文件,在里面能够定义咱们每次将本地代码 push 到远程仓库时build所要完成的操做。例如:编程

language: node_js
node_js:
- 6.10.23
after_success:
- ssh xxx@123.123.123.123 -o stricthostkeychecking=no 'cd /projectMain && git pull && npm run build'
复制代码

上面的配置文件指定咱们项目在 travis 控制台中 build 所须要的构建环境,而且在 travis 执行测试成功以后链接远程服务器,到服务器上的/projectMain目录拉取最新代码并打包。ssh命令能够经过选项 -o stricthostkeychecking=no 来跳过对远程服务器返回的 public_key 的检查。缓存

sshpass实现travis登陆服务器

在上面的配置中,travis控制台还须要咱们手动输入登陆服务器的密码,可是咱们并不能和travis控制台进行交互,并且ssh命令也没有提供一个选项能够用来指定登陆密码。这时咱们有两种方式可供选择:

  1. 使用 sshpass 传递服务器登陆密码
  2. travis 控制台经过 ssh 私钥文件实现免密链接服务器

首先介绍使用 sshpass 这种方式。sshpass能够从特定的环境变量 SSHPASS 中获取到登陆时所须要的密码(使用时须要加上 -e 选项表示从环境变量中读取)。这时候咱们的配置文件就变成这样子:

language: node_js
addons:
  apt:
    packages:
    - sshpass
node_js:
- 6.10.23
after_success:
- export SSHPASS=[your password here]
- sshpass -e ssh xxx@123.123.123.123 -o stricthostkeychecking=no 'cd /projectMain && git pull && npm run build'
复制代码

可是这样还有一个问题,就是咱们把项目公开出去以后也就暴露了咱们的服务器帐号和密码,这是至关危险的。travis 也替我们考虑到了这点,为此也提供了一个用于加密键值对的工具。咱们能够经过如下命令进行安装:

$ gem install travis
# 在第一次使用此命令时须要登陆
$ travis login
复制代码

而后咱们就能够对咱们不想公开的内容进行加密了,好比:

# 添加 --add 选项能够将加密以后的结果直接添加到.travis.yml文件中
$ travis encrypt DEPLOY_PASS=[your password here] --add
复制代码

而后咱们在配置文件中就可使用前面定义好的 $DEPLOY_PASS 变量来替换掉咱们前面在配置文件中使用的明文密码。至此,咱们就完成每次push代码时,travis都会自动登陆远程服务器,并更新服务器上的代码。

加密私钥文件

除了可使用sshpass这种方式来传递服务器登陆密码以外,另一种能够采用相似咱们平时使用ssh私钥文件来实现免密登陆远程服务器的方式,让travis拥有服务器ssh私钥文件来免密登陆到咱们的服务器上。

首先咱们须要在本地的系统中生成一对用于ssh链接的非对称密钥,并将公钥文件拷贝到咱们的服务器上,具体过程能够参考网上资料,这里就不赘述。

而后就是如何让travis控制台访问到我们在上一步生成的私钥文件,这里须要借助travis提供的另外一个工具:travis encrypt-file 子命令,它能够对咱们项目build过程要用到的,但又不能直接公开的文件进行加密,在加密过程当中能够经过 --add 这个可选选项自动向咱们的travis配置文件中添加一个命令用于在build过程当中执行解密操做,以得到加密前的源文件。具体使用方式以下:

$ travis encrypt-file ~/.ssh/id_rsa --add
复制代码

在项目主目录下执行完上面的指令以后,咱们能够看到当前目录下多出了 id_rsa.enc 文件,该文件在后面travis解密获得私钥文件时须要被用到。同时咱们在当前目录下的 .travis.yml 文件中也会发现多出了 before_install 这个字段,该字段指定的命令就是用来对 id_rsa.enc 文件进行解密,这就让travis控制台能够访问上面提到的私钥文件了。最后的 .travis.yml 就长下面这个样子(记得要删掉before_install 这个字段指定的命令中的 --out 选项后面多余的 \ 字符哦):

language: node_js
node_js:
- 8.11.1
after_success:
- ssh xxx@123.123.123.123 -o stricthostkeychecking=no -i ~/.ssh/id_rsa 'cd /projectMain && git pull && npm run build && nginx -s reload'
before_install:
- openssl aes-256-cbc -K $encrypted_xxxyyyxxx_key -iv $encrypted_xxxyyyxxx_iv
  -in id_rsa.enc -out ~/.ssh/id_rsa -d
- chmod 600 ~/.ssh/id_rsa
复制代码

这时候只须要为配置文件中的 ssh 命令添加 -i 指定输出的私钥文件保存路径便可,另外还须要在before_install字段增长一个命令,用来修改 ~/.ssh/id_rsa 文件的访问权限(600),不然在后面 build 的过程当中由于私钥文件访问权限过于open而直接致使build errored。注意到生成的 before_install 字段对应的命令中还用到了两个环境变量($encrypted_xxxyyyxxx_key$encrypted_xxxyyyxxx_iv),而它们的具体值能够在 travis CI 管理后台看到。

总结

本文主要介绍了travis CI这个工具的使用,并经过一个具体的🌰介绍了如何经过 travis CI 实现将咱们推送的代码自动部署到服务器上。

整体来讲,travis CI在解放咱们一部分生产力的同时,也为咱们及时定位代码在交付过程当中出现的问题提供了一个颇有效的方式。固然,在实际使用中,也发现这个工具自己存在的一些问题,好比build过程自己须要耗费大量的时间,不少操做在每次build都会从头开始,但每每都是没必要要的(好比安装项目中所须要的依赖),固然对此travis CI也有本身的解决方案,能够经过配置cache字段,缓存项目中的依赖,每次build只须要安装须要更新的 package,而不是从新安装所有依赖,这样也就能够缩短咱们的一部分等待时间。更多有趣的地方就等你发掘了~

更多细节能够参考 travis CI 官方文档

相关文章
相关标签/搜索