使用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 需要依賴(lài)的一些包

在 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)目名稱(chē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)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容