概述
编写代码只是软件开发的一小部分,更多的时间往往花在构建(build)和测试(test)。
为了提高软件开发的效率,构建和测试的自动化工具层出不穷,Travis就是这类工具,用好这个工具不仅可以提高效率,还能使开发流程更可靠和专业。
CI简介
CI(Continuous Integration,持续集成):指的是只要代码有变更,就自动运行构建和测试,反馈运行结果。确保符合预期以后,再将新代码集成到主干。
持续集成的好处在于,每次代码的小幅变更,就能看到运行结果,从而不断累积小的变更,而不是在开发周期结束时,一下子合并一大块代码。
Travis-CI简介
Travis CI提供的是持续集成服务。它绑定GitHub上面的项目,只要有新的代码,就会自动抓取,然后,提供一个运行环境,执行测试,完成构建,还能部署到服务器。
Travis CI与Github结合比较紧密,对GitHub上的开源Repo是免费的,私有Repo收费。
免费Travis-CI:https://travis-ci.org
收费Travis-CI:https://travis-ci.com
启用Travis CI
Step1:使用GitHub账户授权登录Travis CI。
Step2:同步GitHub上的库,对指定的库启用Travis CI
配置.travis.yml
Travis要求项目的根目录下面,必须有一个
.travis.yml
文件。这是配置文件,指定了Travis的行为。该文件必须保存在GitHub仓库里面,一旦代码仓库有新的Commit,Travis就会去找这个文件,执行里面的命令。
1 | language: android |
Travis生命周期:
- before_install
- install:安装依赖
- before_script
- script:运行脚本
- aftersuccess or afterfailure:script阶段执行成功或失败时执行
- [OPTIONAL] before_deploy
- [OPTIONAL] deploy:部署
- after_script
保证自动化构建的密码和证书安全
Android项目发布需要证书文件和密码,将原始正常和密码放入到代码库是很不安全的。
Travis CI为此提供了两种解决方案:
- 对敏感信息、密码、证书等进行对称加密,在CI构建环境时进行解密;
- 将密码等通过Travis CI的控制台设置为构建时的环境变量。
加密签名证书
因为Travis CI控制台无法上传文件,因此涉及到文件加密的部分,选择第一种方案。
Step1:本地安装Travis CLI命令行工具
1 | gem install travis |
Step2:命令行登录Travis(第一次登录才要),并输入GitHub的用户名和密码
1 | travis login --org |
Step3:进入项目根目录,加密证书
1 | travis encrypt-file xch_android.jks --add |
命令执行结果:
在Travis CI控制台自动生成一对秘钥,形如:
encrypted_d71df9144721_iv
、encrypted_d71df9144721_key
基于秘钥通过
openssl
对文件进行加密,并在根目录生成xch_android.jks.enc
文件在
.travis.yml
中自动生成Travis CI环境下解密文件的配置。1
2
3before_install:
- openssl aes-256-cbc -K $encrypted_d71df9144721_key -iv $encrypted_d71df9144721_iv
-in xch_android.jks.enc -out xch_android.jks -d
加密证书密码
Step1. 在Travis CI控制台配置KEYSTORE_PASS
、ALIAS_NAME
、ALIAS_PASS
三个环境变量。
Step2. 在项目的根目录下创建一个名为keystore.properties
文件(用于本地命令打包),并包含以下信息:
1 | KEYSTORE_PASS=myStorePassword |
Step3. 在app
module 的build.gradle
配置签名信息,System.getenv()
用来获取Travis CI控制台配置的变量。
1 | apply plugin: 'com.android.application' |
配置缓存机制
Travis CI在每次构建完成后,就会删除所有文件,设置缓存机制,可以保证规定的缓存文件不需要每次下载,提高每次构建的速度;但是如果在更好的基础配置的情况(比如更新Gradle版本等,建议先清除缓存在跑CI)。
在.travis.yml
文件添加如下配置:
1 | before_cache: |
可以在后台手动删除Travis CI Cache:
Travis CI自动发布apk到GitHub Release
Step1. 执行travis命令自动生成deploy配置
1 | travis setup releases |
命令执行完后会自动在.travis.yml
添加如下配置:
1 | deploy: |
说明:
provider
:发布目标为GitHub Release,除了GitHub外,Travis CI还支持发布到AWS、Google App Engine等数十种provider。secure
:是加密后的GitHub Access Token。file
:发布的文件。skip_cleanup
:默认情况下Travis CI在完成编译后会清除所有生成的文件,因此要将skip_cleanup
设置为true
来忽略此操作。on
:发布的时机,这里配置为tags: true
,即只在有tag
的情况才发布。
Step2: 打tag
1 | git tag -a v0.0.1-alpha.1 -m "这里是Tag注释,说清楚这个版本的主要改动,也可以省略-m参数直接写长文本" |
Step3: 自动化构建、部署
- 当打完tag并推送到GitHub仓库时,就会触发Travis CI任务。
当Travis CI任务执行成功后,在GitHub就能看到发布的apk。
上传apk到蒲公英
蒲公英是APP内测分发平台,提供免费的APP内测分发托管,不但允许游客下载,还提供了二维码,下载速度快。
Step1. 使用GitHub授权登录https://www.pgyer.com/user/login
Step2. 获取API Key
Step3. 将获取的API Key配置到Travis CI的环境变量PGYER_API_KEY
:
Step4. 在.travis.yml
文件中,添加如下配置:
1 | # 添加蒲公英上传脚本 |
Step5. 打完tag,Travis CI自动构建后,将在蒲公英的控制台看到上传的apk
上传apk到fir.im
fir.im和蒲公英的一样,都是免费的应用内测分发平台。
Step1. 登录https://fir.im/
Step2. 获取API Token。
Step3. 将获取的API Token配置到Travis CI的环境变量FIR_API_TOKEN
。
Step4. 在.travis.yml
文件中,添加如下配置:
1 | before_install: |
Step5. 打完tag,Travis CI自动构建后,将在fir.im的控制台看到上传的apk
发送完毕后自动发送邮件通知
虽然Travis CI也有邮件通知功能,但是不能定制模板,通知内容仅仅为提示CI运行的结果,显然更适合开发人员。我们希望最终能以更友好的方式通知团队成员,同时考虑到邮件送达率,可优先选择 Submail、SendCloud等国内邮件发送服务。
这里以Submail为例:
Step1. 注册登录Submail
Step2. 添加发信域名(这需要有自己的域名)
Step3. 创建APPID,并将APPKEY配置到Travis CI控制台的环境变量SUBMAIL_SIGN
。
Step4. 创建一封触发式邮件模板
1 | @var(TRAVIS_REPO_SLUG)新版本@var(TRAVIS_TAG)已经发布了,功能更新: |
Step5. 配置.travis.yml
1 | after_deploy: |
Step5. 运行结果
参考链接
- 基于Travis CI搭建Android自动打包发布工作流
- 用TRAVIS CI给ANDROID项目部署GITHUB RELEASE
- 持续集成服务 Travis CI 教程
- 如何给你github上的Android项目添加travis-ci
- 如何简单入门使用 Travis-CI 持续集成
- 使用Travis-CI构建Android项目并自动打包部署到GitHub-Release
- 基于Travis CI搭建Android持续集成以及自动打包发布流程
- Android Travis CI与fir.im、GitHub集成
- 使用 Travis CI 实现持续集成 (Android)
- fir-cli 使用说明
- Gradle 提示与诀窍
- Travis CI Doc