基于Travis CI搭建Android持续集成以及自动打包发布流程

前言

最近项目进度比较轻松,闲来自己研究一些感兴趣的技术,恰好这两天研究了一下Travic CI, 用于Android持续集成以及自动打包,话不多说,下面大家就跟我一起踏入Travis CI的奇妙旅行

背景

我们在开发Android项目的时候,大致的流程是这样:


image

Question:这些步骤能否简化,能否自动化?
懒是码农的美德,作为资深码农应该善于用工具提高自己的工作效率,能自动化的要自动化。那么今天要讲的Travis CI就能简化我们的工作,上述流程如果使用Travis CI那么工作流程是这样的:

image

Tag提交后,Travis CI会自动编译代码,生成apk文件,并发到Github和相应地其他渠道(fir.im, 蒲公英等),分发完成后,会邮件通知参与测试的人员。如此一来,作为码农,只要安心Coding和打Tag就好了,轻松愉快啊😄,下面我们就来着重介绍Travis

什么是Travis CI

简单来说它是用来做持续集成的工具,可以为你自动构建、测试、打包等等,极大的简化了工作流程。它对Github的支持特别好,链接到你在Github上的项目以后,每当你把测试通过后的代码提交到master去,它会pull你的代码并按照你的要求构建执行

如何安装Travis CI

首先需要安装Ruby, 你可以通过运行ruby -v 检查系统是否安装Ruby:

$ ruby -v
ruby 2.0.0p645 (2015-04-13 revision 50299) [universal.x86_64-darwin15]

然后运行:

$ gem install travis -v 1.8.0 --no-rdoc --no-ri

安装完毕后,检验一下:

$ travis version
1.8.0

配置Android项目,启用Travis CI

先添加Travis CI到Github repo:

image

然后按照官网说法是大致三步走:

image

先选择要开启Travis CI的项目,将开关设为On即可:

image

在项目的根目录下新建一个文件.travis.yml,如下是一个Android 项目的配置模板:

language: android
android:
  components:
    # Uncomment the lines below if you want to
    # use the latest revision of Android SDK Tools
    # - platform-tools
    # - tools
    # The BuildTools version used by your project
    - build-tools-19.1.0
    # The SDK version used to compile your project
    - android-19
    # Additional components
    - extra-google-google_play_services
    - extra-google-m2repository
    - extra-android-m2repository
    - addon-google_apis-google-19
    # Specify at least one system image,
    # if you need to run emulator(s) during your tests
    - sys-img-armeabi-v7a-android-19
    - sys-img-x86-android-17

当Travis CI准备好我们所需要的环境后,将自动运行yml文件script部分所设置的指令,上例中运行的是./gradlew assembleRelease,运行成功的话会在项目的主模块下生成build/outputs/apk/app-release.apk

【备注】Travis CI目前有2个网站:如果是开源项目,直接进入travis-ci.org即可,如果是私有付费项目,则需要进入travis-ci.com,2个网站除了域名外所有的界面及操作几乎一模一样

Android项目自动化构建的密码和证书安全问题

安卓项目发布需要证书文件和若干密码,但无论是开源项目还是私有项目,任何时候都不应该将原始证书或密码放入代码库(原则上来讲证书和密码也不应该交于开发人员,而应该只能通过发布服务器进行编译)。Travis CI为此提供了2种解决方案,一种是对敏感信息、密码、证书等进行对称加密,在CI构建环境时解密,另一种是将密码等通过Travis CI的控制台(即网站)设置为构建时的环境变量。

由于前者会在Travis控制台生成一对环境变量,所以我的做法是尽量选择后者,但由于Travis控制台无法上传文件,因此涉及到文件加密的部分,则只能选择前者。
说了这么多,首先还是需要先对编译脚本进行改造,如果不考虑安全问题,项目的build.gradle文件可能会是这样:

android {
    signingConfigs {
        releaseConfig {
            storeFile file("../xx.keystore")
            storePassword "123456"
            keyAlias "key_alias"
            keyPassword "123456"
        }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.releaseConfig
        }
    }
}

而我们最终要的效果,还是希望一份编译脚本既可以用于开发环境,也可以在CI环境下使用,在Travis CI中,可以通过点击项目名称 -> Settings -> Environment Variables中设置环境变量,比如我们可以针对上面的配置,分别设置KEYSTORE_PASS、ALIAS_NAME、ALIAS_PASS三个环境变量:

image

在Travis CI环境下可以通过System.getenv()获得这些环境变量
本地开发环境中,我的做法是将这几个变量加到gradle.properties文件中,这样就可以在build.gradle内直接使用了。下面是开发环境的gradle.properties:

KEYSTORE_PASS=123456
ALIAS_NAME=key_alias
ALIAS_PASS=123456

这样一来build.gradle就变成了:

releaseConfig {
            storeFile file("../xx.keystore")
            storePassword project.hasProperty("KEYSTORE_PASS") ? KEYSTORE_PASS : System.getenv("KEYSTORE_PASS")
            keyAlias project.hasProperty("ALIAS_NAME") ? ALIAS_NAME : System.getenv("ALIAS_NAME")
            keyPassword project.hasProperty("ALIAS_PASS") ? ALIAS_PASS : System.getenv("ALIAS_PASS")
        }

接下来处理证书文件,为了方便文件加密等功能,Travis CI提供了一个基于ruby的CLI命令行工具,可以直接使用gem安装:

gem install travis

安装后进入安卓项目根目录,尝试对证书文件加密:

travis encrypt-file xx.keystore --add

travis encrypt-file指令会做几件事情:
1.在Travis CI控制台自动生成一对密钥: encrypted_59c5087c0788_keyencrypted_59c5087c0788_iv

image

2.基于密钥通过openssl对文件进行加密,上例中会项目根目录生成xx.keystore.enc文件
3.在.travis.yml中自动生成Travis CI环境下解密文件的配置,上例运行后可以看到.travis.yml中多了几行:

before_install:
- gem install fir-cli
- openssl aes-256-cbc -K $encrypted_59c5087c0788_key -iv $encrypted_59c5087c0788_iv
  -in xx.keystore.enc -out xx.keystore -d

最后在.gitignore中忽略xx.keystore以及gradle.properties

Travis Ci自动发布安装apk文件到Github Release

Travis CI的script部分运行成功后,可以通过配置文件进入到发布阶段。下面是一个Travis CI发布的示例:

deploy:
  provider: releases
  user: "GITHUB USERNAME"
  password: "GITHUB PASSWORD"
  file: app/build/outputs/apk/app-release.apk
  skip_cleanup: true
  on:
    tags: true
  • provider:发布目标为Github Release
  • Github用户名和密码,因为Travis CI要上传APK文件,因此需要有Github项目的写入权限
  • file: 发布文件,输入文件路径即可
  • skip_cleanup: 默认情况下Travis CI在完成编译后会清除所有生成的文件,因此需要将skip_cleanup设置为true来忽略此操作。
  • on: 发布的时机,这里配置为tags: true,即只在有tag的情况下才发布。

这边直接暴露了Github密码是我们更加不能接受的。更好的做法是在Github -> settings -> Personal access tokens 生成一个只能访问当前项目并只有读取权限的Github Access Token,并通过Travis CI将Access Token加密。好在Travis CLI中已经可以通过一行指令做好这一切:

travis setup release

根据提示填写上述配置项目的信息后,Travis CLI会自动在.travis.yml文件中生成好所有的配置项:

deploy:
  provider: releases
  api_key:
    secure: XXX
  file: app/build/outputs/apk/app-release.apk
  skip_cleanup: true
  on:
    tags: true
    all_branches: true

其中api_key下的secure就是加密后的Access Token。

自动发布APK到fir.im

自动发布到Github对于开发人员已经足够,但是考虑到项目实际需要以及国情,还是有必要选择一个国内的App分发服务,fir.im是不错的选择,不但允许游客下载,还提供了二维码等更适合对接手机的功能,国内下载速度也很快。由于fir.im提供了比较方便的CLI工具,因此本文以fir.im为例,在.travis.yml中添加以下几行:

before_install:
- gem install fir-cli
after_deploy:
- fir p app/build/outputs/apk/app-release.apk -T $FIR_TOKEN -c "`git cat-file tag $TRAVIS_TAG`"

即在环境构建阶段安装fir-cli,在发布成功后通过fir命令行工具将apk上传到fir。
其中$FIR_TOKEN可以在fir.im的用户->API Token中找到,然后在Travis CI控制台中创建环境变量FIR_TOKEN并粘贴即可。

image

总结

其实所有的yml文件配置不到30行,就能利用Travis CI进行自动化持续集成和打包。最后我们回顾一下Travis CI的工作流:
提交代码:

git add .
git commit -m "注释"
git push origin

打Tag:

git tag -a v0.0.1-alpha.1 -m "Tag注释,说清楚这个版本的主要改动,也可以省略-m参数直接写长文本"
git push origin --tags

这个是我集成了Travis CI的项目地址,供参考:
https://github.com/archmages/DYWeather

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

推荐阅读更多精彩内容