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就会去找这个文件,执行里面的命令。
language: android
jdk: oraclejdk8
# 开启基于容器的Travis CI任务,让编译效率更高
sudo: false
android:
components:
# 构建项目所用的BuildTools版本
- build-tools-28.0.3
# 用来编译项目的SDK版本
- android-28
# 添加Android Support Repository组件
- extra-android-m2repository
# 添加Support Library组件
- extra-android-support
before_script:
- chmod +x gradlew
script:
# 生成release apk包
- ./gradlew assembleRelease
Travis生命周期:
before_install
install:安装依赖
before_script
script:运行脚本
aftersuccess or afterfailure:script阶段执行成功或失败时执行
[OPTIONAL] before_deploy
[OPTIONAL] deploy:部署
after_script
Tips:
- chmod +x gradlew
修改权限,解决gradlew: Permission denied
保证自动化构建的密码和证书安全
Android项目发布需要证书文件和密码,将原始正常和密码放入到代码库是很不安全的。
Travis CI为此提供了两种解决方案:
- 对敏感信息、密码、证书等进行对称加密,在CI构建环境时进行解密;
- 将密码等通过Travis CI的控制台设置为构建时的环境变量。
加密签名证书
因为Travis CI控制台无法上传文件,因此涉及到文件加密的部分,选择第一种方案。
加密签名文件需要安装Travis CLI命令行工具,由于windows下加密会有如下问题。
应使用Linux或者OS X.
windows下可以使用Ubuntu,模拟Linux环境。
Step1:本地安装Travis CLI命令行工具
gem install travis
Step2:命令行登录Travis(第一次登录才要),并输入GitHub的用户名和密码
travis login --org
Step3:进入项目根目录,加密证书
travis encrypt-file xch_android.jks --add
Tips:如果提示没有权限,可以在每条命令前加上sudo。
命令执行结果:
-
在Travis CI控制台自动生成一对秘钥,形如:
encrypted_d71df9144721_iv
、encrypted_d71df9144721_key
基于秘钥通过
openssl
对文件进行加密,并在根目录生成xch_android.jks.enc
文件在
.travis.yml
中自动生成Travis CI环境下解密文件的配置。
before_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
文件(用于本地命令打包),并包含以下信息:
KEYSTORE_PASS=myStorePassword
ALIAS_NAME=myKeyAlias
ALIAS_PASS=myKeyPassword
Step3. 在app
module 的build.gradle
配置签名信息,System.getenv()
用来获取Travis CI控制台配置的变量。
apply plugin: 'com.android.application'
// 加载本地keystore.properties中的签名配置
def keyPropertiesFile = rootProject.file("keystore.properties")
def keyProperties = new Properties()
if (keyPropertiesFile.exists()) {
keyProperties.load(new FileInputStream(keyPropertiesFile))
}
android {
compileSdkVersion 28
defaultConfig {
applicationId "com.github.xch168.androidtravisci"
minSdkVersion 16
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
signingConfigs {
release {
storeFile file("../xch_android.jks")
storePassword keyProperties.containsKey("KEYSTORE_PASS") ? keyProperties['KEYSTORE_PASS'] : System.getenv("KEYSTORE_PASS")
keyAlias keyProperties.containsKey("ALIAS_NAME") ? keyProperties['ALIAS_NAME'] : System.getenv("ALIAS_NAME")
keyPassword keyProperties.containsKey("ALIAS_PASS") ? keyProperties['ALIAS_PASS'] : System.getenv("ALIAS_PASS")
}
}
buildTypes {
release {
minifyEnabled false
signingConfig signingConfigs.release
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
Travis CI自动发布apk到GitHub Release
Step1. 执行travis命令自动生成deploy配置
travis setup releases
命令执行完后会自动在.travis.yml
添加如下配置:
deploy:
provider: releases
api_key:
secure: b7dhz7j5tY73qbQo2GNccev7NgI6BNWNeEpEfmLTxRZ7DJptxtQuJIHF026zhHtXfRom/pSXw7qlRJXamPWl7Bc1i1lUNKX7Mdt3Fo7Z70ZAyT/6vak3EGlKqDU7Ta96MOB2+5+2nQ7nlTX4kkkeObSTbD6py4eUzktoxsPSwtjiWrq7KM4KgcJTAEGnZx4LJdFm6pgE3drkbN83J0ZP3fT7sf+5Ggv4WLa8y3l/gM3rQ0tARebDo4OuigJOmknOfcxkiAlTtVt1qw1STMaW4H/M47K1mSvQK9DxSHUCD7ngvxEJlUMtqvYSIqQItyT7D8SvDxUqpZZM6y6qAcp+q5qrnA/uC7Qa3kju3skH1XBXyA20TN/pLYKk1yuH7TLg9W+512Pmgtpr4AiZayChnNn4morhhhncsdnQf1T6ziWUNGHmMK8QcUzjBdZHOVsNHGUuaGk4hOPeTRi7ozHYMnNF1E8HJEhtLf7/BHH4o17x5wI2QuSmgwqlCbhAYEwL8m9ZtyJ7saqimGo6m37XfBlomBgaTMrCDIybqOABjPxASlMVRh84XZeeAHHLgjSRMoP2cb+lksiyhO2TsCOvQEOmofFcjj4+iN+qIynPMb3bonuce/iD9nNC2cusibYaIrr1+r2VWE61EdIiLlamw99fFT1VZtliJuJe9tugMgA=
file: app/build/outputs/apk/app-release.apk
# 这句手动添加
skip_cleanup: true
on:
repo: xch168/AndroidTravisCI
# 这句手动添加
tags: true
说明:
- 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
git tag -a v0.0.1-alpha.1 -m "这里是Tag注释,说清楚这个版本的主要改动,也可以省略-m参数直接写长文本"
git push origin --tags
Step3: 自动化构建、部署
- 当打完tag并推送到GitHub仓库时,就会触发Travis CI任务。
-
当Travis CI任务执行成功后,在GitHub就能看到发布的apk。
最后配置完成后文件和目录结构如下:
项目地址:
https://github.com/SixSmall0Child/TestAppHooker
参考文章:
https://xucanhui.com/2018/12/15/android-travis-ci/