从GitHub到Travis

Travis简介

图片源于[GitHub上Travis CI的介绍][1]

Travis CI lets your team test and deploy with confidence. Trusted by 250,000 users, on over 300,000 open source projects, Travis CI is the leading hosted continuous integration system.

Travis是一个为GitHub服务的CI,支持多数主流语言。

CI即持续集成系统。对个人而言,就是让你的代码在提交到远程——这里是GitHub——后,立即自动编译,并且在失败后可以自动给你发邮件的东西。当然,除了编译,还能做自动化测试、自动部署等。对团队或企业而言,这意味着更多的东西,是敏捷开发的一种践行。

目前大多数中、大型的软件公司里都有类似系统,最流行的应该是Jenkins。

Travis有两个网址:

如果对域名有基本的了解,应该立刻就可以猜个八九不离十:org的那个是非盈利的,为GitHub上public的repository提供免费服务;com的那个是盈利的,可以对private的提供付费服务。com前100次build是免费的,此后按月收费。

二者的账户是相互独立的,但都可以用GitHub账户注册、登录。

只需三步

(以下,以public为例。)

  1. travis-ci.org上以GitHub账户注册、登录。

  2. 在主页点加号【Add new repository】,添加需要CI的那个库。

  3. 在那个库的根目录下,添加一个.travis.yml文件。

流程很简明,但绝大多数复杂度都集中在这个.travis.yml文件。这是一个YAML文件,主要用来做CI的配置。Travis会按照这个文件配置的方式来运行。

Travis运行流程

可以把Travis看做一个远程服务器,目前(2016)默认为Ubuntu 12.04.5 LTS。它会监控你添加的GitHub库。如果有新的提交或Pull Request,就会触发一次在线编译。

这台服务器每次都从近乎裸机状态,把你的库clone过来,然后执行其中的.travis.yml

除了首行的language指定语言类型以外,其它可选的有10个步骤:

  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

最重要的步骤就是第5步的script,这步通常是测试、编译、打包。前面的步骤都是为了成功执行第5步而执行的裸机环境配置,后面的步骤都是在执行第5步后而做出的应对。

所有这些步骤,在language设置后基本都有默认值。所以,即使只有一行language: LANG,很多项目也可以build。

另外,如果多次提交同时push,默认只在最新提交执行一次build;在git commit中如果包含[skip ci][ci skip],该提交就不会触发一次build。

两个例子

比如,这就是一个简单的Groovy小项目的CI配置:

language: groovy

jdk:
    - oraclejdk8
    - openjdk7

script:
    ./gradlew build

Travis会让这个库在oraclejdk8和openjdk7两个环境下,分别做一次./gradlew build

再比如,这是一个稍微复杂点的Android项目的CI配置:

language: android

jdk: oraclejdk8

android:
  components:
    - tools
    - android-24
    - build-tools-24.0.2
    - platform-tools

script: ./gradlew build

after_success:
  - for name in $(find $TRAVIS_BUILD_DIR -name '*.apk'); do ls -hl $name;  done
  - date

after_failure:
  for name in $(find $TRAVIS_BUILD_DIR -name lint-results*.xml); do echo $name; cat -n $name; done

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

(复杂到,即使指定为yaml,简书也不知道怎么配置高亮。ಥ_ಥ)

详细解释下:

  • jdk:之前有介绍过。对Android项目,大多没必要设置多个JDK,因为一个就已经足够了。
  • android: 作为一台裸服务器,当然是没有Android SDK的。由于Android SDK各组建、版本既多且杂,这里就是指定下载哪些些SDK组建的。
    此处坑多,我就多介绍两句:
    • tools:这个推荐放在最前面。Travis其实会在指定编译方式为android后,预置一个tools,它也是通过tools/android这个命令行工具来安装SDK的。
      比如,更新它自己:android update sdk --no-ui --all --filter tools
      如果没有先更新它自己,那么很有可能导致其它组建无法更新至最新指定版本,造成环境缺失,引起build error。
    • android-24:Android主体,API level为24。
    • 其它:基本上与你本地安装的Android SDK目录差不多,后面-24.0.2则是指定版本。
    • 另外:如果使用了v7包、Google Play Services等组件,可能还需要添加几个extra:
      • extra-android-support
      • extra-google-google_play_services
      • extra-google-m2repository
      • extra-android-m2repository
  • after_success:编译成功后,执行那两行Bash脚本。(打印APK大小等信息。)
  • after_failure:编译失败后,执行那一行Bash脚本。(查看Android Lint的遗留问题。)
  • # vim:这个是注释,不用在意。(Vim配置脚本,当Vim读取此文件时执行。)

配置要按需添加,过多配置会极度影响Travis的执行时间。比如,第一个脚本其实要执行两个build,总共不足3分钟;而第二个由于需要下载整个Android SDK,至少需要5分钟;如果再加上那几个extra,10分钟也是会有的。

README中的“勋章”

Build Status
Build Status

在Travis网站上,点击上面那样的Status图标,可以在弹出界面中得到该项目的状态图标链接。选择Markdown版本的连接,放到repository的README.md中,就可以在GitHub页面得到编译状态的展示了。

这个链接通常是这种形式:

[![Build Status](https://travis-ci.org/YOUR/PROJECT.svg?branch=master)](https://travis-ci.org/YOUR/PROJECT)

上次编译是成功还是失败,从此一目了然。有了这个“勋章”的开源项目,看上去瞬间高大上了。

另外,如果只是想要各类“勋章”装点一下门面,可以去shield.ioprogressed.io定制。

参考

整篇文章,都只是为官网文档抛砖引玉。

Travis Docs: https://docs.travis-ci.com/

除了Travis,GitHub还支持很多其它CI

甚至,你也可以自行建立GitHub的CI服务:Building a CI server

相关文章:

后记

匿:build一连挂十几次,你也好意思写文章充高手?
蟒:Android就是无数坑,我只能踩一个填一个。
匿:人家没给你钱,辛苦写这种文章干嘛?
蟒:免费用了人家的产品,吃人嘴短嘛!
匿:人家愿意免费提供给开源项目,你开源不就是回馈吗?
蟒:我那点水平的项目,还回馈不了开源世界。这篇文章就算一点回馈吧。

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

推荐阅读更多精彩内容