PGYERドキュメントセンター

使用 Travis CI 实现持续集成 (Android)

这篇文章将会给大家介绍如何在 Android 项目上使用 Travis CI ,并发布签名 apk 到蒲公英。

关于 Travis CI 产品分类

Travis CI 是目前比较流行的持续集成工具之一,用来构建及测试在 Github 托管的代码,使用它可以极大的简化工作流程。Travis CI 产品分为:

  1. Travis CI.org (用于Github开源项目的免费产品)
  2. Travis CI.com (用于私有项目的付费产品)

注:本文中介绍的Demo是基于(Travis-ci.org)

准备工作

需要在本地安装 Travis CI 命令工具。

  1. 确保本地系统配置 Ruby 1.9 以上版本:

    ruby -v
    
  2. 安装Travis-CI (如果使用 Mac OS 最好先更新 Ruby 到最新版本,然后再安装)

    gem install travis --no-rdoc --no-ri
    
  3. 验证 Travis 是否安装成功 (有版本输出则说明安装成功)

    travis -v
    1.8.8
    

集成步骤

一、启用Travis-CI

通过Github账号登录Travis平台。Travis会自动同步Github账号上所有的开源项目。通过列表选择需要启动的项目。

添加项目

二、创建Travis-CI构建

  1. 在工程根目录下添加 .travis.yml文件。这个文件用于说明 Travis-CI 需要处理的构建。
  • Travis-CI 本身提供基本的构建和支持语言,同时开发者可以通过.travis.yml文件设置自己的构建操作,同时需要遵从 Travis-CI 自己规定的构建生命周期。具体可查阅这里

  • 在完成 .travis.yml 定义后, 可以通过 travis lint [path to your .travis.yml] 命令验证这个文件语法是否正确性。如果正确会出现以下的提示:

    验证构建文件

  1. 配置 Android 工程基本模板,在 .travis.yml 中定义以下内容:

    language: android        #语言说明
    jdk: oraclejdk8          #jdk版本
    sudo: required           #权限要求
    env:                 #环境变量
    global:
    - ANDROID_API=26
    - EMULATOR_API=21
    - ANDROID_BUILD_TOOLS=26.0.2
    - ADB_INSTALL_TIMEOUT=5 # minutes
    android:             #Android 环境要求
    components:
    - tools
    - platform-tools
    - build-tools-$ANDROID_BUILD_TOOLS
    - android-$ANDROID_API
    - android-$EMULATOR_API
    - extra-google-m2repository
    - extra-android-m2repository        # 配置design 库 
    - addon-google_apis-google-19       # 配置google play services
    - sys-img-armeabi-v7a-android-$ANDROID_API
    - sys-img-armeabi-v7a-android-$EMULATOR_API
    licenses:               #内容许可添加
    - android-sdk-preview-license-.+
    - android-sdk-license-.+
    - google-gdk-license-.+
    

    注:这里的 Android 版本需要和你项目中的版本一致。如果在构建过程需要用到不同的 adnroid版本或者 build-tool版本,则都需要再此声明,否则 CI 会出现类似以下的错误:

    错误信息

  2. 可以设置缓存机制,这样可以保证规定的缓存文件不需要每次下载,提高每次构建的速度(可选); 但是如果在更好环境的基础配置的情况(比如更新gradle 版本等,建议先清除缓存再跑CI)

    before_cache: 
    - rm -f $HOME/.gradle/caches/modules-2/modules-2.lock
    - rm -fr $HOME/.gradle/caches/*/plugin-resolution/
    cache:                   #指定缓存目录
    directories:
    - $HOME/.gradle/caches/
    - $HOME/.gradle/wrapper/
    

    可以手动删除 Travis CI cache ,如下图:

    删除缓存

  3. 启动模拟器(可选,只有在需要跑测试用到模拟器才添加)

    注:这里规定的模拟器 android 版本需要在 .travis.yml android 部分声明到相关的版本,否则在启动模拟器时会出现错误,停止构建。整个Travis-CI 的状态为 errored

    before_script:
    - echo no | android create avd --force -n test -t android-$EMULATOR_API --abi armeabi-v7a
    - emulator -avd test -no-skin -no-audio -no-window &
    - android-wait-for-emulator
    

    如果模拟器的 andorid 版本未添加会报以下错误:

    未添加模拟器andorid版本报错信息

  4. 运行脚本

    1. 用于跑测试的脚本:
    script:                  
    - ./gradlew clean build connectedCheck -PdisablePreDex --stacktrace" 
    
    1. 直接打包 release apk 脚本:
    script:
    - ./gradlew assembleRelease
    

三、自动打包签名apk

  1. 创建apk签名文件(Android Studio -> Build -> Generate singed APK -> Create new)

    生成一个.jks文件

    生成jks

  2. 先使用 Github 账户登录 travis 命令

    travis login  # 根据提示依次输入项目所属 Github 的账户和密码
    
  3. 使用Travis 命令对签名文件加密。(这个加密后的文件需要放在项目的根目录一同上传到仓库)

    travis encrypt-file [文件名].jks
    

    会生成一个加密以后的文件 *.jks.enc

    按照脚本提示将图中的命令添加到before_install生命周期下:

    命令加密文件输出

    before_install:
    - openssl aes-256-cbc -K $encrypted_df44b3ae1834_key -iv $encrypted_df44b3ae1834_iv -in demo.jks.enc -out demo.jks -d
    
  4. 使用Travis 命令对签名文件中的参数加密。

    travis encrypt storepass=YOUR_STORE_PASSWORD --add env.global
    travis encrypt keypass=YOUR_KEY_PASSWORD --add env.global
    

    命令生效以后会在.travis.ymlenv: global:中生成以下部分

    命令加密秘钥输出

    注:同一个签名文件和秘钥,如果更改了 Github 所属人的地址,需要通过命令退出,再使用新的 Github 账户登录,重新生成所有的加密部分。

    travis logout
    travis login
    
  5. 配置Travis-CI 打包流程

    after_success:
    - cp $TRAVIS_BUILD_DIR/demo.jks $HOME
    - cd app/build/outputs/apk/
    - jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore $HOME/demo.jks -storepass $storepass -keypass $keypass app-release-unsigned.apk demo #[ demo 是签名文件的key alias]
    - jarsigner -verify app-release-unsigned.apk # 验证未签名的 apk
    - "${ANDROID_HOME}/build-tools/24.0.2/zipalign -v 4 app-release-unsigned.apk yourapp.apk"  # apk优化并重命名
    

四、使用脚本上传 apk 到蒲公英

  1. before_install 添加蒲公英上传脚本:

    before_install:
    - cd $TRAVIS_BUILD_DIR
    - wget -c https://raw.githubusercontent.com/Pgyer/TravisFile/master/pgyer_upload.sh
     -O pgyer_upload.sh
    - chmod +x pgyer_upload.sh
    
  2. after_script添加上传步骤:

    after_script:
     - set -e 
     - $TRAVIS_BUILD_DIR/pgyer_upload.sh "${TRAVIS_BUILD_DIR}/app/build/outputs/apk/release/<apk名称>" <蒲公英 API_KEY>
    
  3. 蒲公英的 API_KEY 可以通过这里查看 本篇分享的 Demo 已经上传Github,欢迎大家浏览,地址是:https://github.com/Pgyer/TravisUploadAndroidDemo 。

结语

本文内容是 Android 项目使用 Travis CI简单的教程 。上传蒲公英的部分,单独使用脚本上传签名好的 apk 是由于在参数错误等的情况下,单纯使用 curl 命令会使 Travis CI 认为构建是正确,整个构建返回结果是 passed ,实际上并没有完成上传蒲公英的步骤。而在脚本中我们处理了比较常见的情况,并且根据不同结果做出不同的命令结果,这样就能使Travis CI 完整有效的返回整个集成的状态。

希望本文对各位有所帮助,同时欢迎指正。