• Pgyer document center

    使用 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 完整有效的返回整個集成的狀態。

    希望本文對各位有所幫助,同時歡迎指正。

  • 红豆视频