使用Travis-CI构建Android项目并自动打包部署到Gi

2017-10-17  本文已影响0人  faner

CI

CI (Continuous Integration,持续集成),CI 是 XP(Extreme Programming,极限编程)的实践之一。近年来
人们普遍使用 Jenkins 等软件来实现这一目的。

让 CI 软件监视仓库,可以在开发者发送提交后立刻执行自动测试构建。通过持续执行这样一个操作,可以检测出开发者意外发送的提交或无意的逻辑偏差,让代码保持在一定质量以上。

在现代的软件开发中持续集成已经不可或缺,甚至逐渐成为开发中的常识。在开源世界中也是同样。

常见的CI有: Travis CI 、 Jenkins 、Circle CI

基于Travis CI的Android自动发布流程

Travis CI对Github上的开源Repo是免费的,私有Repo收费。

可以将表示Travis CI的执行结果的图片嵌入到markdown中

参考:Caching Dependencies and Directories - Travis CI

加密自动化构建中使用到的密码和token

自动化构建中需要用到密码和证书,我们必须保证的安全性。为此Travis CI为此提供了2种解决方案:

获取GitHub的认证

将apk部署到GitHub Release需要向Github传送文件,就需要获得GitHub的相关认证。

获取认证的方法:

创建 Github Personal Access Token

在Github -> settings -> Personal access token 生成一个勾选了public_repo scope的Github Personal Access Token。

生成 token: Github auth token on TravisCI
Creating a personal access token for the command line - User Documentation

生成了Github Personal Access Token后我们就将其应用到 .travis.yml中。

应用Github Personal Access Token的两种方法

方法一:将GitHub的token设置为环境变量

然后在.travis.yml文件中这样使用该环境变量:

api_key:
    secure: ${GH_TOKEN}

Github Personal Access Token在第一次复制后就会自动隐藏,无法再次查看;如果忘记了token就只有重新生成 token。

方法二:在本地安装travis并使用travis的相关命令对token进行加密

token可以重复使用,但是对于特定的仓库必须重新运行上面的命令进行加密并指定仓库。

对于加密环境变量GITHUB_TOKEN的形式,需这样使用:

env:
  global:
    secure: "XR0ZYSp+eWOhHwO0az80nEZoOOyaOIeV7brTekEdl7APUfPziQHrV4G/xPxPZB2Fcn13efyiwpPbmXpSVkIqJJZg2Ok/efBviUIwgl5pqGrddgXEskW8+lebHJA/17JjmXoo2ZT9BcmMlVrT0Dj5WCJXH2QOSAXzVy/9DO7e3pEijAImCHgh0oH/hQzlO86IMBn3Fzlb520bplEI4fnuJNU/nKZrl05dTRCso2ZB2/MXt1X5vfYm4zrwjTgZXOpfSVur6kv/EMNQFDiGLa3F22m1FDQULDfHY7evT79hYlcRKVGx7hoQRrOxXr0Ag6wcb+4buvwaxutNPjaEXkH3FfocrIGxZtox1kE19ebqjc6fT/CH85Lf+AqT2rR86Wr5aaEQcKAxNZxUJtir5MAIo0j7vkx1PUi0MCb9K6JHca9lkFsoYP1L0pjDztD8w4J15rv5TCV/JjMxhCGQkGwDH+M3Z7dQOgikoRaO11o6C5/fC8qfCeGKT3GzL9966dy0UY9ZDQbB7y3donlWgoTZHn6xahGNlP4CYiP6Ax94egDmbSmyiJud5Y0NmwXMY0IEuJPWEFkmBdGEbZuqqsL3mxqxebox7q7gz613ToZSsfbNhKw3ouETftjXoMnlfRFIl7LSAOwAtL5Wig5zlwCMafGTFaGpLH0zl02Udjy3UbU="

deploy:
  api_key:
    secure: ${GITHUB_TOKEN}

这里可以对 secure: 字串的作用做一个猜测: Travis读取到 secure 时便会解密该字串,并将解密后得到的值替换 secure 这行内容。比如如果加密的是 变量=值,那么当其出现在上文的 global: 时,就是定义了一个全局的环境变量,然后就可在后面使用该变量。

可以使用 travis help encrypt查看命令帮助;
使用 travis repos列出所有仓库;参考:travis-ci/travis.rb: Travis CI Client (CLI and Ruby library)

Travis CI's use of GitHub API Scopes - Travis CI

加密签名apk时使用到的密码和keystore文件(方式一)

事先创建好key和keystore文件。 这里我把keystore文件的后缀名变为了.keystore,大家使用的都是 .jks

1、 加密keystore文件my.keystore: travis encrypt-file my.keystore -r FanDean/android_Travis_CI_Test。根据命令输出的提示,将加密后的keystore文件 my.keystore.enc 放入Android工程的根目录;并在 .travis.yml 文件中添加如下内容:

before_install:
  - openssl aes-256-cbc -K $encrypted_f6c9a5f058a8_key -iv $encrypted_f6c6a5f053a8_iv -in my.keystore.enc -out my.keystore -d

2、 加密keystore password 、 key password 和 keyAlias。方法和加密 GitHub Token 一样;也可使用添加环境变量的方式。

这里我们准备下面三个环境变量,并通过在travis网站添加环境变量的形式进行添加:

具体添加方式略(后面我们使用另外一种方法)。

.travis.yml 文件中添加如下内容对apk进行签名:

before_deploy:
- cp $TRAVIS_BUILD_DIR/.keystore $HOME
# 记住这里已经将当前工作目录切换到 apk 下
- cd app/build/outputs/apk/
# Signing 签名
- jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore $HOME/my.keystore -storepass $KEYSTORE_PWD -keypass $KEY_PWD app/build/outputs/apk/app-release-unsigned.apk $KEY_ALIAS

# Verification 验证您的 APK 是否已签署
- jarsigner -verify app-release-unsigned.apk
- "${ANDROID_HOME}/build-tools/24.0.2/zipalign -v 4 app-release-unsigned.apk app-release.apk"

jarsigner - JAR Signing and Verification Tool;也可以用来对apk进行签名。

看起来比较麻烦。

加密签名apk时使用到的密码和keystore文件(方式二)

参考下面的文章,我们可以使用一种新的方式:

创建并加密 keystore.properties 文件

在Android项目根目录创建 keystore.properties文件保存keyPwd等变量。

storePwd=***
keyPwd=***
keyAlias=test_key
storeFileLocal=/home/fan/.android/my_keystore/my.keystore
storeFileCI=../my.keystore

同样加密 keystore.properties 文件: travis encrypt-file keystore.properties -r FanDean/android_Travis_CI_Test
同样添加 "openssl aes-256-cbc -K $encrypted_ad23ea9b533c_key -iv $encrypted_ad23ca6e583c_iv -in keystore.properties.enc -out keystore.properties -d" 到 before_install 下面。

修改app/build.gradle 文件

然后在 app/build.gradle 文件中添加如下内容,用于保护您的密钥和判断当前是在本地还是在 CI服务器:

// Create a variable called keystorePropertiesFile, and initialize it to your
// keystore.properties file, in the rootProject folder.
def keystorePropertiesFile = rootProject.file("keystore.properties")

// Initialize a new Properties() object called keystoreProperties.
def keystoreProperties = new Properties()

// Load your keystore.properties file into the keystoreProperties object.
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))

def keyStoreFile = file(keystoreProperties['storeFileLocal'])

// 判断是位于本地还是CI服务器
if (!keyStoreFile.exists()){
    keyStoreFile = file(keystoreProperties['storeFileCI'])
}

android {
    signingConfigs {
        release {
            keyAlias keystoreProperties['keyAlias']
            keyPassword keystoreProperties['keyPwd']
            storeFile keyStoreFile
            storePassword keystoreProperties['storePwd']
        }
    }

  ...

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.release
        }
    }

  ...

忽略 keystore.properties文件

在 .gitignore_global 文件中添加:

keystore.properties

示例文件: android_Travis_CI_Test/.travis.yml

一些配置

script: ./gradlew testRelease assembleRelease

script:
- "./gradlew clean build connectedCheck -PdisablePreDex --stacktrace"

Travis Config · kawa89/Testing Wiki

script:
  - ./travis/test.sh

./gradlew clean testDebugUnitTest
./gradlew connectedAndroidTest --info
./gradlew clean assembleDebug

GoIV/.travis.yml at master · farkam135/GoIV

script:
   - ./gradlew assembleDebug testOnlineDebugUnitTest testOfflineDebugUnitTest checkstyle

查找android .travis.yml 的相关配置,可尝试在GitHub中搜索 "android travis"然后选择查看 issues 和 wiki 。

参考:

Jenkins学习资料 Jenkins Overview

上一篇下一篇

猜你喜欢

热点阅读