因为本人精力有限,若是内容有更新可能没法及时更新其余渠道的内容,请移步简书 查看文章html
因为以前公司项目一直迭代速度很快,几乎隔几天就须要发布测试包给同事们进行测试,因此但愿把打包Apk这个工做交给机器来作,而后就尝试了几种持续集成的方案,最多见的是Jenkins,Travis,但Jenkins配置略为复杂,Travis虽然很简单,但毕竟不支持Coding,并且费用也比较高。因此一直没能把持续集成搞起来。前端
后来接触到DaoCloudCI,因此尝试了一下把持续集成搭建在 DaoCloud 上了,经过下面这几步就能够实现CodingAndroid项目有新的提交后本身编译发布测试包到 FIR.im 上了。java
让咱们开始吧,文章发布后不少人说步骤过于复杂,其实你们仅须要使用CI功能,则能够跳过第一步,直接使用我已经编译好的 ci-android 镜像linux
P.S. 该项目已经托管在GitHub上,点此查看android
下载文件使用到了 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
镜像包含了 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 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
安装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
为了测试 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的编译状态:https://travis-ci.org/lijy91/ci-android
lijy91/ci-android
到 DaoCloud 镜像仓库这几步完成后台会开启首次构建,之后每次代码提交后就会自动开始新的构建
P.S. 构建完成后把镜像发布到公共仓库,daocloud.io/lijy91/ci-android 是本人发布到公共仓库的镜像,你们能够直接使用
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
build-tools-23.0.2
android-23
项目里用的就是这两个版本,下一步
请阅读 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.
随意修改点内容push 上去便可~~~
稍等几分钟,若是代码没有问题,新的安装包将会被发布到 http://fir.im/t5d6 ~~
Enjoy~
刚离职几天,这段时间在整理近两年的工做经验,把本身一些经验心得分享给你们,但愿不断的优化开发体验,改进交付方式,将更多的时间花在学习以及生活上,也但愿找一份为开发者服务的工做,坐标深圳。
4年工做经验,近2年从事Android应用开发,熟悉从项目启动到上线的完整流程,对产品及体验有必定的理解,对Node.js及前端有着强烈的兴趣,但愿能够为优化开发体验改进交付软件交付方式出一点微薄之力~