基于Travis CI搭建Android持續集成以及自動打包發布流程

前言

最近項目進度比較輕松,閑來自己研究一些感興趣的技術,恰好這兩天研究了一下Travic CI, 用于Android持續集成以及自動打包,話不多說,下面大家就跟我一起踏入Travis CI的奇妙旅行

背景

我們在開發Android項目的時候,大致的流程是這樣:


image

Question:這些步驟能否簡化,能否自動化?
懶是碼農的美德,作為資深碼農應該善于用工具提高自己的工作效率,能自動化的要自動化。那么今天要講的Travis CI就能簡化我們的工作,上述流程如果使用Travis CI那么工作流程是這樣的:

image

Tag提交后,Travis CI會自動編譯代碼,生成apk文件,并發到Github和相應地其他渠道(fir.im, 蒲公英等),分發完成后,會郵件通知參與測試的人員。如此一來,作為碼農,只要安心Coding和打Tag就好了,輕松愉快啊??,下面我們就來著重介紹Travis

什么是Travis CI

簡單來說它是用來做持續集成的工具,可以為你自動構建、測試、打包等等,極大的簡化了工作流程。它對Github的支持特別好,鏈接到你在Github上的項目以后,每當你把測試通過后的代碼提交到master去,它會pull你的代碼并按照你的要求構建執行

如何安裝Travis CI

首先需要安裝Ruby, 你可以通過運行ruby -v 檢查系統是否安裝Ruby:

$ ruby -v
ruby 2.0.0p645 (2015-04-13 revision 50299) [universal.x86_64-darwin15]

然后運行:

$ gem install travis -v 1.8.0 --no-rdoc --no-ri

安裝完畢后,檢驗一下:

$ travis version
1.8.0

配置Android項目,啟用Travis CI

先添加Travis CI到Github repo:

image

然后按照官網說法是大致三步走:

image

先選擇要開啟Travis CI的項目,將開關設為On即可:

image

在項目的根目錄下新建一個文件.travis.yml,如下是一個Android 項目的配置模板:

language: android
android:
  components:
    # Uncomment the lines below if you want to
    # use the latest revision of Android SDK Tools
    # - platform-tools
    # - tools
    # The BuildTools version used by your project
    - build-tools-19.1.0
    # The SDK version used to compile your project
    - android-19
    # Additional components
    - extra-google-google_play_services
    - extra-google-m2repository
    - extra-android-m2repository
    - addon-google_apis-google-19
    # Specify at least one system image,
    # if you need to run emulator(s) during your tests
    - sys-img-armeabi-v7a-android-19
    - sys-img-x86-android-17

當Travis CI準備好我們所需要的環境后,將自動運行yml文件script部分所設置的指令,上例中運行的是./gradlew assembleRelease,運行成功的話會在項目的主模塊下生成build/outputs/apk/app-release.apk

【備注】Travis CI目前有2個網站:如果是開源項目,直接進入travis-ci.org即可,如果是私有付費項目,則需要進入travis-ci.com,2個網站除了域名外所有的界面及操作幾乎一模一樣

Android項目自動化構建的密碼和證書安全問題

安卓項目發布需要證書文件和若干密碼,但無論是開源項目還是私有項目,任何時候都不應該將原始證書或密碼放入代碼庫(原則上來講證書和密碼也不應該交于開發人員,而應該只能通過發布服務器進行編譯)。Travis CI為此提供了2種解決方案,一種是對敏感信息、密碼、證書等進行對稱加密,在CI構建環境時解密,另一種是將密碼等通過Travis CI的控制臺(即網站)設置為構建時的環境變量。

由于前者會在Travis控制臺生成一對環境變量,所以我的做法是盡量選擇后者,但由于Travis控制臺無法上傳文件,因此涉及到文件加密的部分,則只能選擇前者。
說了這么多,首先還是需要先對編譯腳本進行改造,如果不考慮安全問題,項目的build.gradle文件可能會是這樣:

android {
    signingConfigs {
        releaseConfig {
            storeFile file("../xx.keystore")
            storePassword "123456"
            keyAlias "key_alias"
            keyPassword "123456"
        }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.releaseConfig
        }
    }
}

而我們最終要的效果,還是希望一份編譯腳本既可以用于開發環境,也可以在CI環境下使用,在Travis CI中,可以通過點擊項目名稱 -> Settings -> Environment Variables中設置環境變量,比如我們可以針對上面的配置,分別設置KEYSTORE_PASS、ALIAS_NAME、ALIAS_PASS三個環境變量:

image

在Travis CI環境下可以通過System.getenv()獲得這些環境變量
本地開發環境中,我的做法是將這幾個變量加到gradle.properties文件中,這樣就可以在build.gradle內直接使用了。下面是開發環境的gradle.properties:

KEYSTORE_PASS=123456
ALIAS_NAME=key_alias
ALIAS_PASS=123456

這樣一來build.gradle就變成了:

releaseConfig {
            storeFile file("../xx.keystore")
            storePassword project.hasProperty("KEYSTORE_PASS") ? KEYSTORE_PASS : System.getenv("KEYSTORE_PASS")
            keyAlias project.hasProperty("ALIAS_NAME") ? ALIAS_NAME : System.getenv("ALIAS_NAME")
            keyPassword project.hasProperty("ALIAS_PASS") ? ALIAS_PASS : System.getenv("ALIAS_PASS")
        }

接下來處理證書文件,為了方便文件加密等功能,Travis CI提供了一個基于ruby的CLI命令行工具,可以直接使用gem安裝:

gem install travis

安裝后進入安卓項目根目錄,嘗試對證書文件加密:

travis encrypt-file xx.keystore --add

travis encrypt-file指令會做幾件事情:
1.在Travis CI控制臺自動生成一對密鑰: encrypted_59c5087c0788_keyencrypted_59c5087c0788_iv

image

2.基于密鑰通過openssl對文件進行加密,上例中會項目根目錄生成xx.keystore.enc文件
3.在.travis.yml中自動生成Travis CI環境下解密文件的配置,上例運行后可以看到.travis.yml中多了幾行:

before_install:
- gem install fir-cli
- openssl aes-256-cbc -K $encrypted_59c5087c0788_key -iv $encrypted_59c5087c0788_iv
  -in xx.keystore.enc -out xx.keystore -d

最后在.gitignore中忽略xx.keystore以及gradle.properties

Travis Ci自動發布安裝apk文件到Github Release

Travis CI的script部分運行成功后,可以通過配置文件進入到發布階段。下面是一個Travis CI發布的示例:

deploy:
  provider: releases
  user: "GITHUB USERNAME"
  password: "GITHUB PASSWORD"
  file: app/build/outputs/apk/app-release.apk
  skip_cleanup: true
  on:
    tags: true
  • provider:發布目標為Github Release
  • Github用戶名和密碼,因為Travis CI要上傳APK文件,因此需要有Github項目的寫入權限
  • file: 發布文件,輸入文件路徑即可
  • skip_cleanup: 默認情況下Travis CI在完成編譯后會清除所有生成的文件,因此需要將skip_cleanup設置為true來忽略此操作。
  • on: 發布的時機,這里配置為tags: true,即只在有tag的情況下才發布。

這邊直接暴露了Github密碼是我們更加不能接受的。更好的做法是在Github -> settings -> Personal access tokens 生成一個只能訪問當前項目并只有讀取權限的Github Access Token,并通過Travis CI將Access Token加密。好在Travis CLI中已經可以通過一行指令做好這一切:

travis setup release

根據提示填寫上述配置項目的信息后,Travis CLI會自動在.travis.yml文件中生成好所有的配置項:

deploy:
  provider: releases
  api_key:
    secure: XXX
  file: app/build/outputs/apk/app-release.apk
  skip_cleanup: true
  on:
    tags: true
    all_branches: true

其中api_key下的secure就是加密后的Access Token。

自動發布APK到fir.im

自動發布到Github對于開發人員已經足夠,但是考慮到項目實際需要以及國情,還是有必要選擇一個國內的App分發服務,fir.im是不錯的選擇,不但允許游客下載,還提供了二維碼等更適合對接手機的功能,國內下載速度也很快。由于fir.im提供了比較方便的CLI工具,因此本文以fir.im為例,在.travis.yml中添加以下幾行:

before_install:
- gem install fir-cli
after_deploy:
- fir p app/build/outputs/apk/app-release.apk -T $FIR_TOKEN -c "`git cat-file tag $TRAVIS_TAG`"

即在環境構建階段安裝fir-cli,在發布成功后通過fir命令行工具將apk上傳到fir。
其中$FIR_TOKEN可以在fir.im的用戶->API Token中找到,然后在Travis CI控制臺中創建環境變量FIR_TOKEN并粘貼即可。

image

總結

其實所有的yml文件配置不到30行,就能利用Travis CI進行自動化持續集成和打包。最后我們回顧一下Travis CI的工作流:
提交代碼:

git add .
git commit -m "注釋"
git push origin

打Tag:

git tag -a v0.0.1-alpha.1 -m "Tag注釋,說清楚這個版本的主要改動,也可以省略-m參數直接寫長文本"
git push origin --tags

這個是我集成了Travis CI的項目地址,供參考:
https://github.com/archmages/DYWeather

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,818評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,185評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,656評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,647評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,446評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,951評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,041評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,189評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,718評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,602評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,800評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,316評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,045評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,419評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,671評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,420評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,755評論 2 371

推薦閱讀更多精彩內容