使用DaoCloud與FIR.im為Android項(xiàng)目開啟持續(xù)集成的嘗試

由于之前公司項(xiàng)目一直迭代速度很快,幾乎隔幾天就需要發(fā)布測(cè)試包給同事們進(jìn)行測(cè)試,所以希望把打包Apk這個(gè)工作交給機(jī)器來做,然后就嘗試了幾種持續(xù)集成的方案,最常見的是Jenkins,Travis,但Jenkins配置略為復(fù)雜,Travis雖然很簡(jiǎn)單,但畢竟不支持Coding,而且費(fèi)用也比較高。所以一直沒能把持續(xù)集成搞起來。

后來接觸到DaoCloudCI,所以嘗試了一下把持續(xù)集成搭建在 DaoCloud 上了,通過下面這幾步就可以實(shí)現(xiàn)CodingAndroid項(xiàng)目有新的提交后自己編譯發(fā)布測(cè)試包到 FIR.im 上了。

讓我們開始吧,文章發(fā)布后很多人說步驟過于復(fù)雜,其實(shí)大家僅需要使用CI功能,則可以跳過第一步,直接使用我已經(jīng)編譯好的 ci-android 鏡像

1. 創(chuàng)建一個(gè)基于 DockerAndroid 編譯環(huán)境鏡像

P.S. 該項(xiàng)目已經(jīng)托管在GitHub上,點(diǎn)此查看

編寫 Dockerfile 文件

添加軟件源并更新軟件列表

下載文件使用到了 wget 命令,其他為安裝 Android SDK 需要依賴的一些包

在 Ubuntu 上安裝 Android SDK 的官方文檔:
http://developer.android.com/intl/zh-cn/sdk/installing/index.html?pkg=tools

RUN dpkg --add-architecture i386                                    && \\
    apt-get update                                                  && \\
    apt-get install -y wget                                         && \\
    apt-get install -y libncurses5:i386 libstdc++6:i386 zlib1g:i386 && \\
    apt-get clean

安裝 JDK

鏡像包含了 Java7 和 Java8,目的是為了可以支持 Retrolambda,Android Studio 上要支持 Lambda 表達(dá)式請(qǐng)查看 Gradle Retrolambda Plugin 項(xiàng)目

# 安裝 Java 7
RUN wget -q --no-check-certificate -c --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/7u79-b15/jdk-7u79-linux-x64.tar.gz && \\
    tar -xzf jdk-7u79-linux-x64.tar.gz -C /usr/local && \\
    rm jdk-7u79-linux-x64.tar.gz && \\
# 安裝 Java 8
    wget -q --no-check-certificate -c --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u66-b17/jdk-8u66-linux-x64.tar.gz && \\
    tar -xzf jdk-8u66-linux-x64.tar.gz -C /usr/local && \\
    rm jdk-8u66-linux-x64.tar.gz

# 配置 Java 環(huán)境變量
ENV JAVA7_HOME /usr/local/jdk1.7.0_79
ENV JAVA8_HOME /usr/local/jdk1.8.0_66
ENV JAVA_HOME /usr/local/jdk1.7.0_79
ENV PATH $PATH:$JAVA_HOME/bin

安裝 Android SDK

# 安裝 Android SDK
RUN wget -q http://dl.google.com/android/android-sdk_r24.4.1-linux.tgz && \\
    tar -xzf android-sdk_r24.4.1-linux.tgz -C /usr/local              && \\
    rm android-sdk_r24.4.1-linux.tgz

# 配置 Android SDK 環(huán)境變量
ENV ANDROID_HOME /usr/local/android-sdk-linux
ENV PATH $PATH:$ANDROID_HOME/tools
ENV PATH $PATH:$ANDROID_HOME/platform-tools
ENV PATH $PATH:$ANDROID_HOME/build-tools/23.0.2

RUN echo yes | android update sdk --no-ui --all --filter platform-tools             && \\
    echo yes | android update sdk --no-ui --all --filter build-tools-23.0.2         && \\
    echo yes | android update sdk --no-ui --all --filter android-23                 && \\
    echo yes | android update sdk --no-ui --all --filter android-22                 && \\
    echo yes | android update sdk --no-ui --all --filter extra-android-m2repository && \\
    echo yes | android update sdk --no-ui --all --filter extra-google-m2repository  && \\
    echo yes | android update sdk --no-ui --all --filter extra-android-support

安裝 Android NDK

安裝NDK會(huì)導(dǎo)致編譯過程漫長(zhǎng)并且鏡像無比的大,所以只是提供了安裝的方法

# # 安裝 Android NDK

# RUN wget -q http://dl.google.com/android/ndk/android-ndk-r10e-linux-x86_64.bin && \\
#     chmod a+x android-ndk-r10e-linux-x86_64.bin                                && \\
#     ./android-ndk-r10e-linux-x86_64.bin -o/usr/local                           && \\
#     rm android-ndk-r10e-linux-x86_64.bin

# # 配置 Android NDK 環(huán)境變量
# ENV NDK_HOME /usr/local/android-ndk-r10e
# ENV PATH $PATH:$NDK_HOME

利用 Travis CI 測(cè)試編譯 Dockerfile

為了測(cè)試 Dockerfile 是否編寫正確,我使用了Travis CI的持續(xù)集成服務(wù),目的是在我每次提交代碼時(shí)幫我編譯 Docker 鏡像,由于國(guó)內(nèi)的網(wǎng)絡(luò)環(huán)境問題,所以像通過 wget 下載 Android SDK 這種工作幾乎是無法完成的,使用 docker build 命令幾乎也是無法完成的,所以這個(gè)工作交給國(guó)外的 CI 是最合適不過了。

添加 .travis.yml 文件到項(xiàng)目根目錄

sudo: required

services:
  - docker

before_install:
  - docker build -t lijy91/ci-android .

script:
  - docker ps -a

以下是代碼提交后TravisCI編譯狀態(tài)


TravisCI編譯狀態(tài)

查看TravisCI的編譯狀態(tài):https://travis-ci.org/lijy91/ci-android

發(fā)布 lijy91/ci-android 到 DaoCloud 鏡像倉(cāng)庫(kù)

  1. 注冊(cè) DaoCloud 并登錄
  2. 進(jìn)入控制臺(tái) 代碼構(gòu)建 頁(yè)面
  3. 創(chuàng)建新項(xiàng)目,填寫項(xiàng)目名稱,選擇Git倉(cāng)庫(kù)

這幾步完成后臺(tái)會(huì)開啟首次構(gòu)建,以后每次代碼提交后就會(huì)自動(dòng)開始新的構(gòu)建

P.S. 構(gòu)建完成后把鏡像發(fā)布到公共倉(cāng)庫(kù),daocloud.io/lijy91/ci-android 是本人發(fā)布到公共倉(cāng)庫(kù)的鏡像,大家可以直接使用

2. 為 CodingAndroid 項(xiàng)目開啟持續(xù)集成做準(zhǔn)備

Fork CodingAndroid 項(xiàng)目

Fork CodingAndroid項(xiàng)目并克隆到本地

官方:https://coding.net/u/coding/p/Coding-Android/git
Fork后:https://coding.net/u/lijy91/p/Coding-Android/git
順便吐槽一下 Coding 的URL路由真的好丑~

$ git clone git@git.coding.net:lijy91/Coding-Android.git

確保編譯工具版本與 ci-android 安裝的保持一致

  • build-tools-23.0.2
  • android-23

項(xiàng)目里用的就是這兩個(gè)版本,下一步

配置并測(cè)試 FIR Gradle 插件

請(qǐng)閱讀 FIR.im 官方關(guān)于使用 Gradle 插件的文章:使用 Gradle Plugin 發(fā)布應(yīng)用到 fir.im

/build.gradle 部分內(nèi)容已省略

buildscript {
    repositories {
        maven { url "http://maven.bughd.com/public" }
        ...
    }
    dependencies {
        ...
        classpath 'im.fir:gradle-fir-publisher:1.0.2'
        ...
    }
}

app/build.gradle 部分內(nèi)容已省略

...
apply plugin: 'im.fir.plugin.gradle'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

    ...

    // 創(chuàng)建一個(gè)證書,并配置
    signingConfigs {
        release {
            storeFile file("app_release.jks")
            storePassword "n7yJipUzL3XQ"
            keyAlias "coding"
            keyPassword "n7yJipUzL3XQ"
        }
    }

    buildTypes {
        release {
            ...
            //需要使用正式證書簽名,才能發(fā)布到fir.im
            signingConfig signingConfigs.release
        }
    }
    ...
}

...

fir {
    apiToken 'cb570ab95d2802a11387b02a65d01a42'
}

測(cè)試驗(yàn)證一下修改是否正確, 請(qǐng)使用 Gradle Wrapper

./gradlew publishApkRelease
編譯發(fā)布成功

猴子出現(xiàn)了~

幾分鐘后,一個(gè)新鮮滾熱辣的包已經(jīng)被發(fā)布到FIR.im上了,鏈接在此 http://fir.im/t5d6

添加 daocloud.yml 文件

這里再重復(fù)說一次,本人已經(jīng)將上方的 Android 環(huán)境鏡像發(fā)布到DaoCloud 公共倉(cāng)庫(kù)中,大家可以直接使用 daocloud.io/lijy91/ci-android 這個(gè)鏡像

image: daocloud.io/lijy91/ci-android

script:
    - ./gradlew publishApkRelease

關(guān)于如何編寫 daocloud.yml,請(qǐng)閱讀DaoCloud官方文檔:daocloud.yml 的結(jié)構(gòu)和寫法

提交代碼

測(cè)試成后提交代碼,準(zhǔn)備下一步

$ git add .
$ git commit -m "DaoCloudCI支持"
$ git push -u origin master

不過不太順利的是今天Coding有更新,導(dǎo)致無法 Push 代碼,估計(jì)是Merge GitCafe 時(shí)產(chǎn)生的 Bug!不過Coding迅速修復(fù)了,給個(gè)贊~

Coding.net Tips : [Project not found!]
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

3. 開啟持續(xù)集成(DaoCloudCI)

創(chuàng)建項(xiàng)目

創(chuàng)建項(xiàng)目

當(dāng)點(diǎn)擊開始創(chuàng)建的時(shí)候會(huì)提示找不到Dockerfile文件,直接忽略即可,DaoCloud的主要業(yè)務(wù)是Docker,而持續(xù)集成只是其中一個(gè)功能,而我們只需要使用到持續(xù)集成

驗(yàn)證持續(xù)集成是否開啟成功

隨意修改點(diǎn)內(nèi)容push 上去即可~~~

正在執(zhí)行~

稍等幾分鐘,如果代碼沒有問題,新的安裝包將會(huì)被發(fā)布到 http://fir.im/t5d6 ~~

Enjoy~

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

推薦閱讀更多精彩內(nèi)容