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

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

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

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

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

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

編寫(xiě) 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)致編譯過(guò)程漫長(zhǎng)并且鏡像無(wú)比的大轻局,所以只是提供了安裝的方法

# # 安裝 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 是否編寫(xiě)正確,我使用了Travis CI的持續(xù)集成服務(wù)样刷,目的是在我每次提交代碼時(shí)幫我編譯 Docker 鏡像仑扑,由于國(guó)內(nèi)的網(wǎng)絡(luò)環(huán)境問(wèn)題,所以像通過(guò) wget 下載 Android SDK 這種工作幾乎是無(wú)法完成的置鼻,使用 docker build 命令幾乎也是無(wú)法完成的镇饮,所以這個(gè)工作交給國(guó)外的 CI 是最合適不過(guò)了。

添加 .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ě)項(xiàng)目名稱储藐,選擇Git倉(cāng)庫(kù)

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

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

2. 為 CodingAndroid 項(xiàng)目開(kāi)啟持續(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è)證書(shū)俊啼,并配置
    signingConfigs {
        release {
            storeFile file("app_release.jks")
            storePassword "n7yJipUzL3XQ"
            keyAlias "coding"
            keyPassword "n7yJipUzL3XQ"
        }
    }

    buildTypes {
        release {
            ...
            //需要使用正式證書(shū)簽名,才能發(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ù)說(shuō)一次,本人已經(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)于如何編寫(xiě) daocloud.yml彤路,請(qǐng)閱讀DaoCloud官方文檔:daocloud.yml 的結(jié)構(gòu)和寫(xiě)法

提交代碼

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

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

不過(guò)不太順利的是今天Coding有更新芥映,導(dǎo)致無(wú)法 Push 代碼洲尊,估計(jì)是Merge GitCafe 時(shí)產(chǎn)生的 Bug!不過(guò)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. 開(kāi)啟持續(xù)集成(DaoCloudCI)

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

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

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

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

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

正在執(zhí)行~

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

Enjoy~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末矢渊,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子枉证,更是在濱河造成了極大的恐慌矮男,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件室谚,死亡現(xiàn)場(chǎng)離奇詭異毡鉴,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)舞萄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)眨补,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人倒脓,你說(shuō)我怎么就攤上這事撑螺。” “怎么了崎弃?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵甘晤,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我饲做,道長(zhǎng)线婚,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任盆均,我火速辦了婚禮塞弊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己游沿,他們只是感情好饰抒,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著诀黍,像睡著了一般袋坑。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上眯勾,一...
    開(kāi)封第一講書(shū)人閱讀 51,679評(píng)論 1 305
  • 那天枣宫,我揣著相機(jī)與錄音,去河邊找鬼吃环。 笑死也颤,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的模叙。 我是一名探鬼主播歇拆,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼范咨!你這毒婦竟也來(lái)了故觅?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤渠啊,失蹤者是張志新(化名)和其女友劉穎输吏,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體替蛉,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡贯溅,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了躲查。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片它浅。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖镣煮,靈堂內(nèi)的尸體忽然破棺而出姐霍,到底是詐尸還是另有隱情,我是刑警寧澤典唇,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布镊折,位于F島的核電站,受9級(jí)特大地震影響介衔,放射性物質(zhì)發(fā)生泄漏恨胚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一炎咖、第九天 我趴在偏房一處隱蔽的房頂上張望赃泡。 院中可真熱鬧寒波,春花似錦、人聲如沸升熊。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)僚碎。三九已至,卻和暖如春阴幌,著一層夾襖步出監(jiān)牢的瞬間勺阐,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工矛双, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留渊抽,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓议忽,卻偏偏與公主長(zhǎng)得像懒闷,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子栈幸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

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