从Travis回GitHub

图片来源于GitHub Help

Deployment

Deployment一般直译为部署,本是一个军事名词。在被新兴的软件工程借用后,现在多是用来指软件开发的一些后续过程,如发布、安装与激活、适配、更新等,详见维基百科Software_deployment

本文主要介绍如何用Travis,把自动编译后的某些文件,自动deploy到GitHub的Releases里。(以下均以“发布”来代称deploy与deployment。)

如果你还没用过GitHub Releases,可以自补官方文档:https://help.github.com/categories/releases/

自动发布配置

示例如下:

language: groovy

jdk:
  - oraclejdk8
  - openjdk7

script: "./gradlew build"

before_deploy:
  cp $TRAVIS_BUILD_DIR/build/libs/ARTIFACT_ID*.jar ARTIFACT_ID.jar

deploy:
  provider: releases
  skip_cleanup: true
  file: "ARTIFACT_ID.jar"
  api_key:
    secure: "KmMdcwTWGubXVRu93/lY1NtyHxrjHK4TzCfemgwjsYzPcZuPmEA+pz+umQBN\n1ZhzUHZwDNsDd2VnBgYq27ZdcS2cRvtyI/IFuM/xJoRi0jpdTn/KsXR47zeE\nr2bFxRqrdY0fERVHSMkBiBrN/KV5T70js4Y6FydsWaQgXCg+WEU="
  on:
    tags: true
    jdk: oraclejdk8

# vim: set shiftwidth=2 tabstop=2 softtabstop=-1 expandtab:

script以前的内容,上篇已经介绍了。下面介绍之后的配置:

  • before_deploy
    在发布前,把编译好的jar改名,放在容易伸手的地方。(我不确定下面的file字段是否支持通配符。)
  • deploy
    发布配置的主体。
    • provider
      指定发布到哪里,这里releases就是指GitHub Releases。
      目前(2016年),Travis支持GitHub ReleasesbintrayGoogle App EnginenpmPyPIRubyGems等,约30种发布方式。
    • skip_cleanup
      由于Travis很可能执行到这一步时,会清理掉之前编译的部分过程文件,其中就有可能包含要上传的那些。所以这一条通常设置为true
      不过,在本例中,在before_deploy中就已准备好要上传的jar文件,这一条其实未起作用。
    • file
      指定要上传到GitHub Releases的文件。可以指定多个文件。
    • api_key
      GitHub特有的认证字段,可用账户密码代替,必须要加密。下面几个小节会介绍如何加密。
      实际上,整个配置的难点就在这里,其它字段都没有什么理解、配置上的难度。
    • on
      条件发布(Conditional Releases)的指定。显然,发布这种事情,不是每次提交、每个分支都应该做的。
      除了下面两类外,还可以指定repo(不影响fork出去的库)、branch(默认为master)、以及condition(自定义条件)。
      • tags
        每次有新的git tag被提交时,GitHub都会自动生成一个release,默认带上源码的压缩包,这是本身就有的机制。
        所以,对Travis来说,在每次打tag时触发一次deployment,是比较合适的时机。
      • jdk
        这个项目虽然在两个JDK下分别进行编译、测试,但其实只需要在一个JDK下发布。
        同类的条件还有python、node等。

私有信息加密

由于Travis的运作,依赖于纯文本的.travis.yml配置文件,所以对public或有可能某一天变成public的项目来说,任何私密信息都不应该放在其中。

这是所有利用第三方CI时,都需要注意的信息安全问题。开源,分享的是文档、代码和创意,而不是银行账户。

Travis显然早已留意了这个问题,给出了加密方案。加密后,大致形式如下:

secure: "KmMdcwTWGubXVRu93/lY1NtyHxrjHK4TzCfemgwjsYzPcZuPmEA+pz+umQBN\n1ZhzUHZwDNsDd2VnBgYq27ZdcS2cRvtyI/IFuM/xJoRi0jpdTn/KsXR47zeE\nr2bFxRqrdY0fERVHSMkBiBrN/KV5T70js4Y6FydsWaQgXCg+WEU="

(注:这个secure拷贝于Travis某介绍文档。我实际使用的加密文本更长些。)

也就是把明文字段,加密成上面的模样,再放到配置文件.travis.yml中。

具体的保密原理,可见官方文档:《Encryption keys》。

安装travis.rb

为了实现加密功能,需要安装Travis的命令行客户端(Command Line Client),它就是GitHub上的travis-ci/travis。它既是一个基于Ruby的命令行程序,也是一个Ruby的库。

通常,使用gem install travis即可安装。

在中国,由于rubygems.org不够给力(也许可以换种说法),有时根本没法用,所以我们需要更给力的镜像。

ping rubygems.org如果没有好的结果,那么可以用https://ruby.taobao.org/。该镜像承诺每15分钟同步一次,可以解决大多数问题,装个travis显然没问题。(而且,看在逢年过节都大出血的份上,谢一声后,就可以心安理得地尽情使用。)

gem sources --add https://ruby.taobao.org/ --remove https://rubygems.org/

替换后,再执行前述安装命令,即可快速成功安装。

travis命令简介

任何一个网络服务的客户端,完整功能都需要先登录再使用,哪怕它是一个shell命令也一样。

最简单的上手是,执行travis login,根据提示输入GitHub账户、密码登录后,就可以正式开始使用了。但这有个权限过大的问题,它可以对GitHub进行完全控制,所以官方推荐另一种更好的登录方式:指定token。

travis login其实并未把账户密码发送到travis-ci.org,而是发给github.com,生成了一个完整权限token。它承诺,没有把账户密码发送到自家服务器,安全可靠。原理可见文档:travis.rb#login

不过,这个token其实也是GitHub生成的,专门提供给第三方来调用。可以去GitHub上自己生成(见下一小节),然后用travis login --github "TOKEN",可直接登录。

正式使用时,当前目录最好就是项目的根目录,这样travis可以自动识别需要处理的项目,省去很多麻烦。

登录后,在项目的根目录,开始加密:

travis encrypt "TOKEN" --add deploy.api_key

--add可以自动把加密好的内容放到.travis.yml文件的指定字段。也可省略这个参数,拿到secure密文后自行配置。

(注:这个token可以是和登录时的那个相同,也可以不同。)

另外,source ~/.travis/travis.sh后,travis命令就支持补全了。可以把这一行加到.bashrc或之类的shell配置文件中。

更多的使用教程,可以看其README,或执行travis -h

熟练使用后,基本可以不登录网站了。

生成GitHub的token

作为第三方CI,无论是发布到GitHub、还是其它地方,都需要足够识别身份的私密信息,或是账户密码,或是某种key。

GitHub里用的就是Personal access tokens

在这个页面可以生成一个token,并可修改相关权限。对公开项目Travis需要的权限如下:

  • user:email (read-only)
  • read:org (read-only)
  • repo_deployment
  • repo:status
  • write:repo_hook

相关介绍,可见官方文档:《Travis CI's use of GitHub API Scopes》。

验证

配置完毕后,打上tag,然后git push --tags就可触发。

由于.travis.yml的配置开始复杂起来,所以大改后,为避免语法错误,最好先做验证,再提交。可以选择:

参考

Travis官网文档:https://docs.travis-ci.com/

相关文章:

后记

匿:为什么不直接去发布,搞这么麻烦的配置文件?
蟒:我懒嘛!而且,据说优秀的程序员都懒,什么都要尽量自动化。
匿:有折腾这些的时间,你那小项目早就发布了,而且够手动发布一百回。这项目,你打算发布几百次?
蟒:……

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容