本篇开始介绍Jenkins项目实际应用,那就是安卓打包。一般都是测试人员向安卓开发人员要测试包,安卓开发人员就在android studio上打包,然后通过聊天工具传给测试,测试拿到包后,启动app测试。我想,这个场景,在很多公司存在。我们公司,打包任务就测试自己打,开发一般不打包,我也帮app组测试人员打过一段时间的不同测试环境的安装包。最近,项目间歇期,没什么任务,领导要求我,去研究一下app自动化打包,主要是在jenkins上实现,我就先研究android,在自己工作机器上尝试了搭建环境。从不知道什么是gradle到成功可以根据不同参数打出不同环境的安装包,整个过程持续了3到4天。期间遇到了很多问题,自己根据log也网上查资料也解决了一部分,总之,坑很多,最终,还是成功实现,这里,把基本的过程和我认为的细节写出来,分享给大家。

打包需求:

根据公司实际工作需要,我大概要实现这么一个场景或者需求。

1)Jenkins根据源码自动打包

2)支持参数化构建

3)支持打完包通过邮件发送消息

4)支持安装包二维码下载

5)支持打完包,通过钉钉机器人发送消息

       需求分析:先实现前面三点,后面的不是重点,本篇先实现第一点需求。目前,我实现了前面三点需求,第四和第五点需求,暂时没有启动研究,因为要去研究iOS自动化打包,所以二维码和钉钉机器人发送消息,优先级不高,放最后去学习和研究。好了,开始介绍环境搭建过程。

1. 所需软件

我们需要提前准备下载一些软件或者工具。

1.1 Java jdk 1.8

      很简单,android是基于java语言开发的,编译环境当然需要jave jre,所以,我们一般都会提前安装好Java jdk,这里我选择jdk 1.8,具体安装过程和配置环境变量请看我之前写过的一篇文章:http://blog.csdn.net/u011541946/article/details/72848401

1.2 Tomcat

      这里下载tomcat是因为,我们要支持打包后文件下载,这个文件下载路径,就是通过tomcat来实现一个简单的基于http的文件地址,我把打出来的包,拷贝到tomat设置的下载路径,用户点击邮件中的下载地址,就可以找到安卓包。

1.3 Jenkins

      这里核心的来了,我整个系列文章都在介绍Jenkins,关于如何安装和配置Jenkins,和如何Jenkins挂载在tomcat下启动,请看这篇文章:http://blog.csdn.net/u011541946/article/details/78004622

1.4 android sdk

      因为是android项目,肯定需要用到android sdk环境,具体安装和环境变量设置,请看这篇文章:http://blog.csdn.net/u011541946/article/details/77142045

2. Jenkins上安装必要的插件

       由于Jenkins上大部分设置和实现都是通过安装不同功能的插件来达到目的。例如,现在android基本上都是采用基于gradle的构建来实现打包。一般,在一个android的代码里的\app\build.gradle,这个就是打包控制文件。还有源码管理需要插件,一般有svn和git,jenkins上用户角色和权限管理也有插件,通过发送邮件,邮件内容模板也需要插件。

2.1 安装角色插件

点击jenkins的系统管理-插件管理,然后点击可选插件,搜索输入Role

安装完之后,点击系统管理-ConfigureGlobal Security,把你配置的第一个jenkins用户,添加全部权限。

       输入admin这个用户,然后点击Add,我们把admin这个用户勾选全部权限。点击右侧红圈那个图标,可以快速全部勾选这些权限,然后点击Save.


2.2 安装gradle插件

点击jenkins的系统管理-插件管理,然后点击可选插件,搜索输入gradle,我们勾线gradle plugin,然后点击安装。

2.3 安装svn插件

由于公司是用svn来管理源码,所以下载svn,如果你们公司是采用git,这个你就下载git。

2.4 安装extent email plugin

由于我们需要设置一个邮件内容模板,最后还是借助这个邮件插件。

2.5 设置SMTP信息

这个需要根据你公司或者个人邮箱的对于smtp信息来设置,测试发送下能收到邮件就可以。

SMTP设置就不贴图了,涉及到个人邮箱信息。

3. 设置全局变量和global tools

3.1 全局环境变量

主要有三个全局环境变量,JAVA_HOME,ANDROID_HOME,GRADLE_HOME

       点击系统管理-系统设置,找到全局属性,勾选enviroment variables,分别添加这三个环境变量。主要添加变量路径要和你系统的保持一致。

3.1 添加Global Tools

点击系统管理-Global tool configuration

这里举例如何添加gradle,同理,添加jdk,这里不需要android_sdk。

4. 新建一个Job

4.1 General

      我们先从简单到复杂,这里暂时不勾选参数化构建。本篇文章是测试通过gradle执行\app\build.gradle能顺利打出包,不管打出什么环境的包,先打出一个包再说其他的。如果调用这个能打出包,说明这个打包脚本build.gradle没有问题,否则去问问开发吧。

4.2 源码管理

这里安装了svn,所有需要配置svn信息,来拉取代码到本地。

默认是这样界面,这里需要注意,如何把svn账户添加到jenins上。

点击Add,输入你自己svn账号和密码。

      这个地方添加svn账号和密码,其他除jenkins之外的账号和密码都是通过这样方式添加。然后选择添加的账号,输入svn地址,如果没有显示红色报错,说明设置正确。

SVN更新策略选择如下


4.3 构建触发器

       这里暂时不勾选任何,提示poll SCM,其实就是自动化构建,SCM是source code managerment的缩写。这里涉及到由于5个参数设置不同周期自动化进行触发构建。本篇,这里暂时不勾选。一个job点击立即构建,这种构建方式叫手动触发,如果设计了SCM触发,这个叫自动构建。

4.4 构建

在Build这部分,选择gradle插件

输入gradle命令

       解释下,其实上面Gradle Version,如果你在Global tool configuration设置了Gradle的路径和名称,这个地方是可以下拉,选择你本地版本。clean是打包之前清除一下上一次编译等记录,这个在android和iOS打包都存在这个命令。assembleRelease 或者assembelDebug,这两个都是gradle能识别的打不同包的命令,一般来说,Debug就是公司内部环境测试,就叫debug版本,如果是发布到安卓市场包,就是Release版本。

继续来看gradle设置,一下设置打包脚本位置和脚本名称


       这个地方有一个需要注意的地方,我这里填写了源码文件夹\app,这个源码文件夹需要通过svn拉取才会在jenkins对应的workspage文件夹生成。所以,你在这里,需要,点击保存当前配置,暂时不设置Root Build Script和Build File,然后点击立即构建,这个第一次构建,会发生拉取代码操作,然后去jenkins的家目录找到workspace下对应当前Job名称的源码文件夹。然后设置如上面图片效果。如果你不知道你们android项目打包文件是什么名称,什么位置,赶紧去问问开发人员。

5.第一次构建和可能遇到问题

       首先,点击立即构建,会立即去svn服务器拉取代码到本地。代码拉取好了,才会执行gradle命令去执行打包。这个肯定会出错,因为我们还没有设置build.gradle的位置,这里,回到这个打包job,点击配置这个job,然后设置好Root Build script的路径和Build File,这个路径你可以直接写上绝对路径,或者利用${workspace}来简写路径。

5.1 可能出现问题

       这里,我们点击立即构建,再来一次。目前,svn代码已经拉取,如何gradle执行命令也没有问题,那么就开始执行打包。这个时候,会根据build.gradle的写入的编译工具和插件和依赖版本,会自动下载一些插件,特别是maven插件到本地。所以,这个第一次执行gralde命令打包会感觉很多,需要下载很多很多插件。


这里,举例一个可能遇到问题。

        根据提示,说没有接受SDKPlatform 25的license,我们可以先cd 到%ANDROID_HOME%\tools\bin下输入sdkmanger.bat –licenses回车,然后根据提示输入y,如果这样的方式不工作。那么我们需要双击SDK Manger.exe,勾选SDK Platform 25,对应是android 7.1,然后点击accept licenst,然后点击安装,安装结束后就不会提示这个报错。


6.我们build.gradle的配置

       我们开发在build.gradle文件设置好了,默认调用这个文件,如果打的是Release类型包,那么会默认直接打23个安卓市场包。这里我注销大部分市场,只保留一两个,然后测下打Release包,是否在路径app\build\outputs\apk\生成对应市场包。

6.1 看看我们build.gradle设置

我这里为了节约打包时间(默认打全部市场包,预计需要30到40分钟),注销大部分市场。


再次点击立即构建,然后观察日志和安卓打包输出文件夹,看看是否打包成功。

       通过日志,发现构建成功,也看到了xiaomi release字段,那么是否成功生成了我们保留的豌豆荚和小米两个市场包呢?找到${workspace}/${job_name}/app/build/outputs/apk/。果然能找到两个市场包。

总结:

       通过上面整个流程走下来,只能证明我通过gradle插件调用build.gradle能打出全部市场包,至少证明build.gradle是写法没有问题的。如果你不放心,可以拿一个安卓手机安装测试下,看看是不是市场包,也就是app数据是线上环境的数据。那么问题来了,如果我要打一个测试环境的包呢,或者一个准生产环境,有些公司是有准生产环境的。这就需要涉及到参数化构建,Jenkins上通过用户选择什么打包需求,来决定传入什么参数去修改build.gradle的对于代码,从而决定打出什么包来。关于这个,下一篇介绍。

PS:本篇是基于我对jenkins有一定了解基础上写的一篇总结,我认为是很详细的步骤记录,如果你在阅读本篇,遇到什么问题,可以给我发私信或者QQ群找我,我在实现自动化打包过程期间,确实遇到很多错误,填了很多坑。


Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐