热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

由于本人精力有限,如果内容有更新可能无法及时更新其他渠道的内容,请移步简书查看文章由于之前公司项目一直迭代速度很快,几乎隔几天就需要发布测试包给同事们进行测试,所以希望把打包Apk

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

由于之前公司项目一直迭代速度很快,几乎隔几天就需要发布测试包给同事们进行测试,所以希望把打包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 测试编译 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编译状态
《使用 DaoCloud 与 FIR.im 为 CodingAndroid 项目开启持续集成的尝试》

查看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
](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

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

《使用 DaoCloud 与 FIR.im 为 CodingAndroid 项目开启持续集成的尝试》
几分钟后,一个新鲜滚热辣的包已经被发布到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)

创建项目

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

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

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

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

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

Enjoy~

关于我

刚离职几天,这段时间在整理近两年的工作经验,把自己一些经验心得分享给大家,希望不断的优化开发体验,改进交付方式,将更多的时间花在学习以及生活上,也希望找一份为开发者服务的工作,坐标深圳。

4年工作经验,近2年从事Android应用开发,熟悉从项目启动到上线的完整流程,对产品及体验有一定的理解,对Node.js及前端有着强烈的兴趣,希望可以为优化开发体验改进交付软件交付方式出一点微薄之力~

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


推荐阅读
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • Android系统移植与调试之如何修改Android设备状态条上音量加减键在横竖屏切换的时候的显示于隐藏
    本文介绍了如何修改Android设备状态条上音量加减键在横竖屏切换时的显示与隐藏。通过修改系统文件system_bar.xml实现了该功能,并分享了解决思路和经验。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 3.223.28周学习总结中的贪心作业收获及困惑
    本文是对3.223.28周学习总结中的贪心作业进行总结,作者在解题过程中参考了他人的代码,但前提是要先理解题目并有解题思路。作者分享了自己在贪心作业中的收获,同时提到了一道让他困惑的题目,即input details部分引发的疑惑。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • 本文介绍了作者在开发过程中遇到的问题,即播放框架内容安全策略设置不起作用的错误。作者通过使用编译时依赖注入的方式解决了这个问题,并分享了解决方案。文章详细描述了问题的出现情况、错误输出内容以及解决方案的具体步骤。如果你也遇到了类似的问题,本文可能对你有一定的参考价值。 ... [详细]
author-avatar
将登太行的2602939913
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有