使用DaoCloud与FIR.im为Android项目开启持续集成的尝试

由于之前公司项目一直迭代速度很快,几乎隔几天就需要发布测试包给同事们进行测试,所以希望把打包Apk这个工作交给机器来做,然后就尝试了几种持续集成的方案,最常见的是Jenkins,Travis,但Jenkins配置略为复杂,Travis虽然很简单,但毕竟不支持Coding,而且费用也比较高。所以一直没能把持续集成搞起来。

后来接触到DaoCloudCI,所以尝试了一下把持续集成搭建在 DaoCloud 上了,通过下面这几步就可以实现CodingAndroid项目有新的提交后自己编译发布测试包到 FIR.im 上了。

让我们开始吧,文章发布后很多人说步骤过于复杂,其实大家仅需要使用CI功能,则可以跳过第一步,直接使用我已经编译好的 ci-android 镜像

1. 创建一个基于 DockerAndroid 编译环境镜像

P.S. 该项目已经托管在GitHub上,点此查看

编写 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 表达式请查看 Gradle Retrolambda Plugin 项目

# 安装 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会导致编译过程漫长并且镜像无比的大,所以只是提供了安装的方法

# # 安装 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 是最合适不过了。

添加 .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

/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)

创建项目

创建项目

当点击开始创建的时候会提示找不到Dockerfile文件,直接忽略即可,DaoCloud的主要业务是Docker,而持续集成只是其中一个功能,而我们只需要使用到持续集成

验证持续集成是否开启成功

随意修改点内容push 上去即可~~~

正在执行~

稍等几分钟,如果代码没有问题,新的安装包将会被发布到 http://fir.im/t5d6 ~~

Enjoy~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容