V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lijy91
V2EX  ›  程序员

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

  •  1
     
  •   lijy91 · 2016-03-04 10:33:11 +08:00 · 2724 次点击
    这是一个创建于 2968 天前的主题,其中的信息可能已经有所发展或是发生改变。

    由于本从精力有限,如果内容有更新可能无法及时更新其他渠道的内容,请移步简书 查看文章

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

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

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

    1. 创建一个基于 Docker 的 Android 编译环境镜像

    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]( https://travis-ci.org) 测试编译 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 [email protected]:lijy91/Coding-Android.git
    

    确保编译工具版本与 ci-android 安装的保持一致

    • build-tools-23.0.2
    • android-23

    项目里用的就是这两个版本,下一步

    配置并测试 FIR Gradle 插件

    请阅读 FIR.im 官方关于使用 Gradle 插件的文章:使用 Gradle Plugin 发布应用到 fir.im

    /build.gradle 部分内容已省略
    gradle
    buildscript {
    repositories {
    maven { url "http://maven.bughd.com/public" }
    ...
    }
    dependencies {
    ...
    classpath 'im.fir:gradle-fir-publisher:1.0.2'
    ...
    }
    }

    app/build.gradle 部分内容已省略
    ```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]( https://docs.gradle.org/current/userguide/gradle_wrapper.html)
    

    ./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
    
    Error: language "yml" is not supported

    关于如何编写 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 及前端有着强烈的兴趣,希望可以为优化开发体验改进交付软件交付方式出一点微薄之力~

    联系我

    1 条回复    2016-03-04 21:21:50 +08:00
    dphdjy
        1
    dphdjy  
       2016-03-04 21:21:50 +08:00 via Android
    呦~正好需要一个 dockerfile 来做自动化构建~
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3480 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 04:52 · PVG 12:52 · LAX 21:52 · JFK 00:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.