由于之前公司項(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è)基于 Docker 的 Android 編譯環(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):https://travis-ci.org/lijy91/ci-android
發(fā)布 lijy91/ci-android
到 DaoCloud 鏡像倉(cāng)庫(kù)
- 注冊(cè) DaoCloud 并登錄
- 進(jìn)入控制臺(tái) 代碼構(gòu)建 頁(yè)面
- 創(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
幾分鐘后授帕,一個(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)目
當(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 上去即可~~~
稍等幾分鐘,如果代碼沒(méi)有問(wèn)題裁蚁,新的安裝包將會(huì)被發(fā)布到 http://fir.im/t5d6 ~~
Enjoy~