使用 DaoCloud 與 FIR.im 爲 CodingAndroid 項目開啓持續集成的嘗試

因爲本人精力有限,若是內容有更新可能沒法及時更新其餘渠道的內容,請移步簡書 查看文章html

因爲以前公司項目一直迭代速度很快,幾乎隔幾天就須要發佈測試包給同事們進行測試,因此但願把打包Apk這個工做交給機器來作,而後就嘗試了幾種持續集成的方案,最多見的是Jenkins,Travis,但Jenkins配置略爲複雜,Travis雖然很簡單,但畢竟不支持Coding,並且費用也比較高。因此一直沒能把持續集成搞起來。前端

後來接觸到DaoCloudCI,因此嘗試了一下把持續集成搭建在 DaoCloud 上了,經過下面這幾步就能夠實現CodingAndroid項目有新的提交後本身編譯發佈測試包到 FIR.im 上了。java

讓咱們開始吧,文章發佈後不少人說步驟過於複雜,其實你們僅須要使用CI功能,則能夠跳過第一步,直接使用我已經編譯好的 ci-android 鏡像linux

1. 建立一個基於 Docker 的 Android 編譯環境鏡像

P.S. 該項目已經託管在GitHub上,點此查看android

編寫 Dockerfile 文件

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

下載文件使用到了 wget 命令,其餘爲安裝 Android SDK 須要依賴的一些包c++

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

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 表達式請查看 Gradle Retrolambda Plugin 項目github

# 安裝 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 環境變量
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 環境變量
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會致使編譯過程漫長而且鏡像無比的大,因此只是提供了安裝的方法docker

# # 安裝 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 環境變量
# ENV NDK_HOME /usr/local/android-ndk-r10e
# ENV PATH $PATH:$NDK_HOME

利用 Travis CI 測試編譯 Dockerfile

爲了測試 Dockerfile 是否編寫正確,我使用了Travis CI的持續集成服務,目的是在我每次提交代碼時幫我編譯 Docker 鏡像,因爲國內的網絡環境問題,因此像經過 wget 下載 Android SDK 這種工做幾乎是沒法完成的,使用 docker build 命令幾乎也是沒法完成的,因此這個工做交給國外的 CI 是最合適不過了。api

添加 .travis.yml 文件到項目根目錄

sudo: required

services:
  - docker

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

script:
  - docker ps -a

如下是代碼提交後TravisCI編譯狀態
TravisCI編譯狀態

查看TravisCI的編譯狀態:https://travis-ci.org/lijy91/ci-android

發佈 lijy91/ci-android 到 DaoCloud 鏡像倉庫

  1. 註冊 DaoCloud 並登陸

  2. 進入控制檯 代碼構建 頁面

  3. 建立新項目,填寫項目名稱,選擇Git倉庫

這幾步完成後臺會開啓首次構建,之後每次代碼提交後就會自動開始新的構建

P.S. 構建完成後把鏡像發佈到公共倉庫,daocloud.io/lijy91/ci-android 是本人發佈到公共倉庫的鏡像,你們能夠直接使用

2. 爲 CodingAndroid 項目開啓持續集成作準備

Fork CodingAndroid 項目

Fork CodingAndroid項目並克隆到本地

官方: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

項目裏用的就是這兩個版本,下一步

配置並測試 FIR Gradle 插件

請閱讀 FIR.im 官方關於使用 Gradle 插件的文章:[使用 Gradle Plugin 發佈應用到 fir.im
](http://blog.fir.im/gradle/)

/build.gradle 部份內容已省略

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

app/build.gradle 部份內容已省略

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

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

    ...

    // 建立一個證書,並配置
    signingConfigs {
        release {
            storeFile file("app_release.jks")
            storePassword "n7yJipUzL3XQ"
            keyAlias "coding"
            keyPassword "n7yJipUzL3XQ"
        }
    }

    buildTypes {
        release {
            ...
            //須要使用正式證書籤名,才能發佈到fir.im
            signingConfig signingConfigs.release
        }
    }
    ...
}

...

fir {
    apiToken 'cb570ab95d2802a11387b02a65d01a42'
}

測試驗證一下修改是否正確, 請使用 Gradle Wrapper

./gradlew publishApkRelease

編譯發佈成功

猴子出現了~
幾分鐘後,一個新鮮滾熱辣的包已經被髮布到FIR.im上了,連接在此 http://fir.im/t5d6

添加 daocloud.yml 文件

這裏再重複說一次,本人已經將上方的 Android 環境鏡像發佈到DaoCloud 公共倉庫中,你們能夠直接使用 daocloud.io/lijy91/ci-android 這個鏡像

image: daocloud.io/lijy91/ci-android

script:
    - ./gradlew publishApkRelease

關於如何編寫 daocloud.yml,請閱讀DaoCloud官方文檔:daocloud.yml 的結構和寫法

提交代碼

測試成後提交代碼,準備下一步

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

不過不太順利的是今天Coding有更新,致使沒法 Push 代碼,估計是Merge GitCafe 時產生的 Bug!不過Coding迅速修復了,給個贊~

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. 開啓持續集成(DaoCloudCI)

建立項目

建立項目

驗證持續集成是否開啓成功

隨意修改點內容push 上去便可~~~

正在執行~

稍等幾分鐘,若是代碼沒有問題,新的安裝包將會被髮布到 http://fir.im/t5d6 ~~

Enjoy~

關於我

剛離職幾天,這段時間在整理近兩年的工做經驗,把本身一些經驗心得分享給你們,但願不斷的優化開發體驗,改進交付方式,將更多的時間花在學習以及生活上,也但願找一份爲開發者服務的工做,座標深圳。

4年工做經驗,近2年從事Android應用開發,熟悉從項目啓動到上線的完整流程,對產品及體驗有必定的理解,對Node.js及前端有着強烈的興趣,但願能夠爲優化開發體驗改進交付軟件交付方式出一點微薄之力~

聯繫我

相關文章
相關標籤/搜索