Jenkins 是基于Java开发的一种持续集成的工具,用于监控持续重复的工作。在Android这边使用的比较多的一般是自动化打包,或单元测试,项目中经常产品会找我们打包APK,有时候手上刚开正在开发,这时候就好先要stash再切分支,很是麻烦!今天我们讲一下如何实现Android自动化打包,解放我们的双手,让产品自己打包(づ。◕ᴗᴗ◕。)づ
安装
首先到Jenkins的官网下载https://jenkins.io,点击Download Jenkins按钮会弹出两个版本选择:LTS Release(长期支持版本),Weekly Release(每周更新版本)。一个开发版本一个稳定版,大家可以自行选择,功能上几乎没区别。可以选择对应的操作系统安装,也可以直接下载war包,然后放在Tomcat的webapps目录,新建Jenkins文件夹再放入。
我选择的是Windows安装版的,个人建议选择对应的操作系统的安装版安装!安装版和war版功能是没区别的,主要的区别在于目录上,安装版指定安装目录以后几乎所有的东西都会在对应的文件夹下生成,比如Jobs(即存放工程目录),不会在其他磁盘再生成多余的文件夹,而war版放在Tomcat目录下以后,用浏览器打开,所有的东西会在C盘生成.Jenkins文件夹。另外war版需要自己安装Tomcat ,安装版不需要,也不需要手动启动Jenkins,直接访问 http://localhost:8080/ 即可
插件
安装成功后,直接访问http://localhost:8080/ (当然,端口被占用的话另说,不在本次分享范围)
接下来说一下Jenkins最强大的部分之一,插件;Jenkins提供了非常多的插件,基本上涵盖了各种,几乎你想要的插件都有。
首次访问http://localhost:8080/ 时,会引导你对Jenkins做一些配置,

一般选择第一项即可,自动安装所推荐的插件;这里注意一下,并不一定所有推荐的插件都能安装成功,有的可能要翻墙,或网络原因,有些安装失败,但是没有关系,并不影响,直接进入下一步就可以了,等到后续有需要的话,也可以自己下载插件(下面会讲~)
下一页就是创建用户页面,这里建议创建用户,下面提供了Continue as admin按钮也可进入主页,但是后期想创建用户还是很麻烦的,所以建议创建用户。
创建好用户,就可以进入到主页了~
这时我们可以通过选择系统管理->管理插件->已安装插件检查下哪些插件已经安装成功
然后 在 系统管理->管理插件->可选插件 这边选择安装需要安装的插件

来安装我们需要的插件。
如果在这里没有找到,可以到Jenkins的官网上找,或百度,然后在系统管理->管理插件->高级,上传对应的插件

配置
插件安装完毕后,不要心急,记得先对Jenkins的全局变量进行配置一下,效果更佳
1.全局工具配置
在系统管理选项中找到Global Tool Configuration(全局工具配置)进入,如果上面的插件安装成功,在这里会看到三个板块,如图

Gradle这个目录最好是要自己配,而且目录路径最好简短,Jenkins可以默认下载Gradle目录,但是下载的文件目录是在用户目录下的.gradle\wrapper\dists文件夹下,路径比较深,Android在Windows下编译的时候文件目录路径太长的话,会编译失败(后面讲);
2.全局属性
在打包之前这个地方最好配置一下全局属性,不让编译的时候会遇到各种报错,不确定的可以先把基础的先配置,等到编译报错的时候,在进行配置;
在在系统管理->系统设置->全局属性版块勾选上Environment variables选项,然后添加

ANDROID_HOME:配置Android SDK的目录,没有配置的话,编译会报ANDROID_HOME not found
ANDROID_NDK_HOME: 如果项目有ndk的话,这个要配置一下,不然的话,编译会报错(后面会讲)
GRADLE_USER_HOME: gradle 资源文件下载指定目录,这个最好配置下,不配也没关系,Jenkins会默认下载到系统用户目录,Windows下,gradle编译如果资源文件太长的话,会报错
打包
配置完后,我们就可以开始准备打包啦~
1.创建项目
距离开始打包又近了一步,接下来就开始创建新项目了,点击首页的新建,进入下图界面

给自己的项目起个名字,然后选择构建一个自由风格的软件项目,点击OK按钮,进入项目的配置界面
2.项目配置
直接选择源码管理tab或者向下滚动找到源码管理,如图;

点击Add->Jenkins 配置凭证,

类型种类选择默认的Username with password,然后在Username和Pasword处分别输入Git账户的用户名和密码,然后滚动到下方点击Add,然后在Credentials中选择我们刚才添加的通行证。
接着滚动到构建Tab,点击添加构建步骤,然后选择Invoke Gradle script,如图:

然后配置构建时的Gradle版本,和需要执行的任务,然后点击保存按钮,马上就可以打包了。
3.开始构建
点击保存后,回到项目界面,如图:

点击左侧菜单栏的立即构建,开始构建项目,这时候Build History版块会出现构建任务列表,点击进入点击 Console Output 查看构建详情信息,如图

日志最后输出Finished: SUCCESS即构建成功。
成功之后,返回项目地址就可以点击工作空间,在app的build目录下面查看apk生成情况。
以上就是Jenkins打包最简单的配置了。
接下来讲一下在Android打包中比较常用的,也是比较实用的一些定制配置
1.参数化构建
在我们打包的时候,我们大多时候不想只是简简单单打一个版本的包,我们想通过配置一下参数,来满足一些需求,比如根据渠道打不同版本的包、根据Tag打不同的包等,下面就来说一下Jenkins参数化构建。
在我们项目中需要配置的选项有:版本(Release 或 Debug),版本号,渠道包,根据Tag打包。甚至项目需要的某些开关也是可以通过Jenkins参数进行动态配置
在Jenkins项目主页选择配置,进入配置页,在Generaltab将参数化构建过程选中,如图:

参数构建这边提供了很多种形式的参数配置,其中比较常用的有
● Git Parameter : git 参数可用来配置获取branch 分支或者是tag
● String Parameter: 配置字符串参数
● Boolean Parameter:配置boolean参数,可用来配置开关
● Choice Parameter:选择参数
● Active Choices Plugin:动态选择参数,安装这个插件会自动安装另外两个关联的插件Active Choices Reactive Plugin,Active Choices Reactive Plugin
1、Git Parameter

这里的git无需配置URL,默认映射到项目的Git URL,Git Parameter支持branch或是tag过滤,也支持配置默认值
配置好后,回到项目界面,这时候会发现Build 变成 Build with Parameters

点击Build with Parameters就可以在右边界面看到下面这个页面,我们可以根据对应的配置选择需要的tag和分支

点击 build,然后在Build History版块会出现构建任务列表,点击进入就可以看到参数,点击查看参数

2、 Choice Parameter

选项参数配置这边Choices 中每一行代表一个选项,第一个为默认值

*Active Choices Plugin这个插件基于选择参数插件,更灵活,可做更多的适配,支持groovy script

Active Choices Plugin支持4中选择类型,Single Select, Multi Select, Radio Buttons, Check Boxes,在Enable filters 打钩,可对选项进行过滤

Active Choices Reactive Plugin 的用法和 Active Choices Plugin 很像,只不过他可以根据变量参数(Referenced parameters)传递的值动态改变,除去Referenced parameters,其他用法和Active Choices Plugin一样


Active Choices Reactive Referenced Plugin 这个插件也是支持动态参数传递,但是他和Active Choices Plugin还是有些不一样

正常情况下,前面两个基本上就够用了,但是有些时候我们的参数需要自定义,这时候就可以用到Active Choices Reactive Referenced Plugin ,它支持HTML,这就意味着我们可以自己写一下简单的HTML,自定义我们需要的样式

这里要注意下,我们选择Formatted HTML类型时,设置HTML样式的时候,要记得在需要返回值的 element 记得配上 name=“value”,这样系统才会去识别这个标签的值,并返回赋值给对应的name

从上图我们可以看到我们Active Choices Parameters 如果是多选的话,返回的参数值是一个字符串,用逗号隔开。
你会发现,为什么BUILDE_TIME的返回 值后面为什么会多了一个逗号?我们来看下HTML源码

这是因为Active Choices Reactive Referenced Parameters 默认隐藏了一个<input name="value">,这时候我们需要再配置的时候在Omit value field 打钩,这样就可以去掉这个隐藏项了,更多详情请参考Active Chioce Reactive Reference Pluin HTML的详细用法
接下来,敲重点,经过上面步骤,我们配置好了要传递的参数,那我们要怎样做才能在我们构建的Android项目中获取到配置好的参数呢?
首先我们需要再Android 的gradle.properties文件中配置一样的参数值,然后在构建的如下图的红色框勾选对应的选项,这样就可以帮我们侵入到gradle.properties文件中替换对应的参数值,这样build.gradle 文件能够直接引用gradle.properties文件中的属性,起到了侵入的效果。这样Jenkins上打包的时候,gradle.properties文件配置的参数就会随着选择变化而变化了(至于怎样build.gradle 文件引用gradle.properties文件中的属性,这里就不加笔墨了,有需要的同学自行百度)

当然,我们也可以在Jenkins上的项目配置直接引用我们配置的参数,如下图,
GIT_BRANCH参数配置,可以直接在源码管理的Branch引用改为$GIT_Branch引用参数

提示:
●如果选中了GIT_TAG中的任意版本都无法取消选中,只能刷新;
●还有使用GIT_TAG时最好选择tag版本大于等于支持Jenkins打包的版本,因为之前版本代码 中没加需要侵入的属性
2.按时打包
Jenkins有提供这个功能,但是我没有用,这里就蛮提一下,感兴趣的可以请参考使用Jenkins搭建iOS/Android持续集成打包平台的配置构建触发器部分。

3.构建命名
每次构建的时候,Build History模块显示是这样的,如图:

有些强迫症党可能很不喜欢,那么我们想要他显示更多信息怎么办?

我们可以在构建环境这边,找到Set Build Name 对打包名进行重命名。
很多童鞋可能在构建环境这边没有找到Set Build Name 这个属性,找不到的话,在插件列表中安装一下Build Name Setter Plugin然后在重启Jenkins就可以看到了
配置完再次打包就变成这个样子了,如图:

当然,在这里我们还可以配置更多内容,感兴趣的同学可以参考如何在Build History里面显示二维码链接
4、Post-build Actions

打包完后,我想通知对应的人怎么办?可以add post-build action点击进行配置,最常用的是邮件通知(这里目前项目不需要,没有仔细研究过,就一笔带过)

好了,整个项目配置的功能基本上就讲到这里了,更多深入的内容,感兴趣的可以继续深入研究(づ ̄3 ̄)づ╭❤~
续篇,接下来讲下在构建过程中遇到的一些错误
1、找不到 NDK

这个错误主要是配置Android NDK路径没有配置。而且Jenkins只认ANDROID_NDK_HOME环境变量,配置其他的无效 ,所以在系统管理->系统设置->全局属性下面有一个Environment variables 勾上,然后添加ANDROID_NDK_HOME的变量即可
2、Error: Some file crunching failed, see logs for details
:app:merge360DebugResources** FAILED

出现该问题主要是gradle 编译时的 build-cache 目录路径太长,导致 jenkins 无法识别该路径,才会出现此错误。
如图所示,现在build-cache 目录是在 C:\Windows\System32\config\systemprofile.android\build-cache 下,目录太长(深),导致运行时找不到文件
解决此错误的方法,是在项目的gradle.properties 文件中增加 build-cache 目录,设置一个较短的目录
android.buildCacheDir=D:/android-studio/build-cache
3、file not found

这个问题和上面的是一样的,都是路径过长,Windows下Jenkins首先就去C:\Windows\System32\config里找,所以只要在Jenkins --> Manage Jenkins --> Configurate System下,增加一个Environment Variable,健:GRADLE_USER_HOME,值:(你自己的gradle 目录)
总结
Jenkins打包其实不难,只要按步骤配置就好了,但是坑的是第一次打包的时候,如果网络不给力的话,会下载失败,遇到这种情况的话,多打几个包就好了,嘻嘻
网友评论