使用 DaoCloud 与 FIR.im 为 CodingAndroid 项目开启持续集成的尝试 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
lijy91
V2EX    程序员

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

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

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

    由于之前公司项目一直迭代速度很快,几乎隔几天就需要发布测试包给同事们进行测试,所以希望把打包 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]( 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 部分内容已省略
    ...
    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'
    }

    测试验证一下修改是否正确,请使用 [GradleWrapper]( 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     Solana     969 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 23ms UTC 19:26 PVG 03:26 LAX 11:26 JFK 14:26
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86