Nov November 2012

把Travis-ci的结果上传回Github

介绍

半年前我写了篇博客Travis CI会替代Jenkins吗?后就一直在使用它,因为它实在是简单又好用。

基本原理

当你把代码推送到Github时,就可以触发Travis-ci的构建。Travis-ci会启动一个基于Virtualbox的Ubuntu的虚拟机(当前是12.04版本),然后根据你的.travis-ci.yml中的配置来构建你的产品。构建结束后,虚拟机会被删除掉。

问题

但是有一个问题一直很好没有解决,就是如何把它的构建结果传递出来。Travis-ci本身并不提供像Jenkins一样的归档(archive)功能把需要的结果寄存起来,如构建产生的可执行文件。

当然你可以写些脚本上传到你自己的系统中,但这又不可避免的暴露你的安全信息,因为访问你的私有服务需要密码之类的,而Travis-ci运行你的构建是开放的,每个人都可以看到你的脚本和里面的信息。

最近在和人讨论到这个问题时,突然看到这个问题已经可以完美解决了。

解决方案

Travis-ci网站本身还是没有提供归档功能,但是它提供了优雅的方法,Github的API也提供了极好的方法来上传文件。

方法就是:Github API和Travis-ci的保密环境变量

Github API

Github早已经提供了“仓库下载API”来帮助你上传文件到你Git仓库的"下载(Download)"页,详见http://developer.github.com/v3/repos/downloads/

你可以使用curl命令来获取令牌,并且使用开源的脚本github-upload.rb (https://github.com/wereHamster/ghup)来处理余下的事情。建议看看里面的README文件,还是简单明了的,这里就不重复了。

保密环境变量

保密环境变量(Secure environment variables)是Travis-ci提供的功能,它能确保你的私有信息(如密码或私钥)安全。实现方法很优雅,也很实用。就是提前加密(其中包含了你的用户名和Git仓库名),拿到加密串,到时凭加密串拿到你的环境变量,因为系统自动上传你的用户名和Git仓库名,其他人看到令牌也没用。

具体使用就是,先用travis命令(先下载travis gem包)加密你的信息,这里是GITHUB_TOKEN=66b79b8c91e236b16ab99d88cb3379839ce98d25

$ gem install travis
$ travis encrypt larrycai/sdcamp GITHUB_TOKEN=66b79b8c91e236b16ab99d88cb3379839
ce98d25

About to encrypt 'GITHUB_TOKEN=66b79b8c91e236b16ab99d88cb3379839ce98d25' for 'la
rrycai/sdcamp'

Please add the following to your .travis.yml file:

secure: "qkE5/TVKQV/+xBEW5M7ayWMMtFwhu44rQb9zh3n0LH4CkVb+b748lOuW3htc\nXfnXU8a
GzOsQBeCJZQstfzsHFPkll+xfhk38cFqNQp7tpMo/AOZIkqd2AIUL\n0bgaFD+1kFAxKTu02m11xzkDN
w6FuHMVvoMEQu/fo115i2YmWHo="

在travis-ci的构建中,你需要告诉系统这一串加密的令牌来拿回你的环境变量GITHUB_TOKEN和它的值,因为它是绑定你的用户名和Git仓库,是安全的。

然后你就可以在github-upload.rv脚本中使用$GITHUB_TOKEN这个令牌去访问你的github库了。

env:
global:
  - secure: "qkE5/TVKQV/+xBEW5M7ayWMMtFwhu44rQb9zh3n0LH4CkVb+b748lOuW3htc\nXfnXU8aGzOsQBeCJZQstfzsHFPkll+xfhk38cFqNQp7tpMo/AOZIkqd2AIUL\n0bgaFD+1kFAxKTu02m11xzkDNw6FuHMVvoMEQu/fo115i2YmWHo="  

after_script:
- ./github-upload.rb sdcamp.zh.pdf larrycai/sdcamp --description "generated by travis-ci, $TRAVIS_JOB_ID" --force --name sdcamp.zh.snapshot.pdf --skip-ssl-verification -t $GITHUB_TOKEN

希望你喜欢这个解决方案。

总结

这里只是使用了Github API这个例子,你也可以使用其他的方式来灵活运用。

国内的云服务也可以考虑类似的方案,简介高效,怎么就没人搞个travis-ci克隆版呢?

相关阅读

  1. 我自己的“Travis CI会替代Jenkins吗?” http://www.larrycaiyu.com/2012/03/06/travis-ci-is-evolution.html
  2. Juven Xu的“Travis CI,翩翩而至的CI云” http://www.juvenxu.com/2012/03/06/travis-ci/
  3. http://stackoverflow.com/questions/12724139/add-secret-environment-variable-to-travis-ci
  4. https://github.com/wereHamster/ghup
  5. http://stackoverflow.com/questions/12343452/publish-artifacts-in-travis-ci-how
  6. 这篇博客的英文版http://codeslife.com/2012/10/25/publish-the-artifacts-inside-travis-ci-to-github/
blog comments powered by Disqus
comments powered by Disqus