
题目很长,本篇文章内容也如题目所示,介绍工作中借助自动化手段,提高团队间工作效率的一种很好的方法。
版权声明:本文为博主原创文章,未经博主允许不得转载。
对于移动端的开发和测试,一般流程是测试人员向移动端开发人员要测试包,开发通过本地IDE(Android开发一般是Android Studio)打好包后通过各种媒介传给测试人员。测试人员拿到包后开始测试,一但发现bug,会通知开发人员修改,然后再重复上面的过程。
为了简化工作流程,提高效率,可以选择jenkins做持续集成。将jenkins部署在服务器上,通过jenkins实现app自动化打包。这样一来,开发人员每次只需将代码提交到版本控制系统(如git)的远程代码库上,测试人员可以根据自己需求和时间使用jenkins进行自动打包。实现开发与测试的“解耦合”。
网上关于Android开发Jenkins部署的文档有很多,不过绝大部分文档都是上传蒲公英等网站,这些网站能自动生成下载二位码并返回,可以减少部署难度,网上可参考的资料也更多,推荐优先选择这些网站。但是如果你在的公司并没有用蒲公英(比如我目前的公司),而是用的七牛云等没有返回二维码只是可以生成下载链接的网站,那么这篇文章或许能够帮到你更多。
♨ 综上所述,没钱就要多努力,人丑就要多读书。
特别提示,下面的内容可能图比字多,因为配置这种东西我认为还是图更能说明问题。
1. Jenkins部署
这部分网上资料太多了,本人也是按照网上的教程一步一步配的。这里就不一一复制粘贴写了。可以自行百度,也有几个推荐的网址:
- http://blog.csdn.net/u011541946/article/details/78267097
- http://www.jianshu.com/p/38b2e17ced73
- http://blog.csdn.net/mabeijianxi/article/details/52680283
- http://blog.csdn.net/fengshi_sh/article/details/50669754
- http://www.jianshu.com/p/915c1ae69144
1.1 推荐安装插件
- Branch API Plugin
- build timeout plugin
- build-name-setter
- Credentials Binding Plugin
- description setter plugin
- Dynamic Parameter Plug-in
- Environment Injector Plugin
- fir-plugin(可选)
- Git plugin(可选)
- GIT server Plugin(可选)
- Gradle Plugin
- Pipeline: Basic Steps
- Pipeline: Build Step
- Pipeline: Input Step
- Pipeline: Nodes and Processes
- Pipeline: Stage Step
- Post-Build Script Plug-in
- SSH Slaves plugin
- Subversion Release Manager plugin(可选)
- Timestamper
- Workspace Cleanup Plugin
- Subversion Plug-in(可选)
(不一定都能用上,反正我是能装的都装了)
2. JDK、androidSDK、androidNDK等配置
回到主界面->系统管理->全局属性: 配置好JDK(NDK)与PYTHON。
注意:
1. 相关配置需要Overall权限,在 系统管理-ConfigureGlobal Security 里配置账户权限。
2. 这里的键需要和服务器环境变量内的Android SDK/NDK目录的键一致。
2.1 安装Gradle
点击系统管理-Global tool configuration
gradle可以直接用服务器的安装地址(如果服务器已安装),也可以选择自动安装,自动安装jenkins在第一次打包的时候回会自动下载,因此第一次打包时间会很长。
♨ 这里有个小问题,如果gradle勾选自动安装,勾选框的上面name这个输入框尽量以后不要改动,亲自入坑测试发现仅仅改动name后,下一次打包时会从新下载gradle(原因是自动安装的目录名就是配置的的name,改动name相当于改了安装路径,gradle会在新的安装路径下重新下载安装)。
3. 创建项目并打包
前面主要是在配置环境,环境搭好下面就可以配置项目了。
3.1 创建项目
回到主界面->新建->构建一个自由风格的项目->ok:
3.2 git配置
进入到刚创建的项目中点击“配置”,找到“源码管理”,选择“Git”。
3.3 构建–Invoke Gradle script

Gradle Version:选择系统管理里配置的gradle-name
Tasks:填gradle构建命令:clean是打包之前清除一下上一次编译记录。assembleRelease 或者assembleDebug,对应AS里release和debug版的包
其他请自行百度gradle构建命令
Pass job parameters as Gradle properties:如果需要参数化构建,需要勾选。参数化构建内容在下面一节。
3.4 参数化构建
参数化构建的主要功能是将jenkins里配置的参数注入到Android项目中的配置里,而勾选Pass job parameters as Gradle properties这个选择框可以帮我们侵入到gradle.properties文件中替换相同名称变量的值。达到入侵的效果。
由于build.gradle文件能够直接引用gradle.properties文件中的属性,因此入侵的参数如果要在build.gradle中使用的话可以直接调用。然而我们有些入侵的参数需要在java代码里用到,这就需要用到defaultConfig里面的buildConfigField方法。
上面一大波操作可能有点令人窒息,上干货:
3.4.1 先是参数配置
勾选参数化构建流程,选择添加参数:

可选的参数类型有很多,这里只介绍Choice Parameter和Dynamic Parameter。其他参数类型可自行尝试。
Choice Parameter:是单选参数,配置时列出所有参数,用换行隔开,如下图:

配置完成后点击保存,回到项目页面,点击Build with Paramters,可看到刚刚配置的单选效果。开始构建后,所选择的值就会被注入到gradle.properties文件中替换相同名称变量的值。如下图:

Dynamic Parameter:这个参数的值会根据你添加的Groovy脚本自动生成。配置方式如图:

其他的参数以及使用方法请自行查阅。
3.4.2 jenkins入侵参数的调用
我们知道参数化构建是将jenkins配置的参数侵入到gradle.properties文件中替换相同名称变量的值。因此,第一步就是要在Android项目下的gradle.properties文件中写入相同名称和初始值。

构建成功后,这里的EXAMPLE的值就会被jenkins上配置的EXAMPLE多选框选中的值替换。因此在程序中可以像使用gradle.properties中的参数一样使用入侵的参数。
build.gradle中调用gradle.properties的参数:
build.gradle中可以直接可以调用gradle.properties中被jenkins修改过值的参数。这里以SDK_VERSION相关参数为例,如下图:
gradle.properties:
build.gradle:
java代码中调用gradle.properties的参数:
Java代码中调用gradle.properties文件里的参数需要build.gradle文件做一个桥梁,具体就是在build.gradle文件里调用buildConfigField方法。如下图:
这里的buildConfigField就是自定义一个常量,第一个参数表示类型,第二参数表示常量名,第三个参数传入的是值。这里${EXAMPLE}就是传入的gradle.properties里EXAMPLE变量的值。通过这个方法Gradle就会在BuildConfig这个类中加入常量API_HOST,如下图:
通过jenkins构建之后BuildConfig类里的的API_HOST的值就会被jenkins中配置的EXAMPLE的值替换。
下一步,在java代码里中调用BuildConfig.API_HOST,取到jenkins配置的变量的值:1
public static String LOGIN_URL = BuildConfig.API_HOST
参数注入在实际工作中还是有很多用途的,比如可以用来配置不同环境、修改某些参数等等。
4. 七牛上传
4.1 编译并安装七牛插件qiniu-plugin
经过上面几步出神入化的微操之后,我们已经可以在jenkins服务器上进行打包了,下面就是要将打好的apk上传到七牛云上,方便各位大佬下载(管开发要安装包的都是大佬,反正我是这么认为的)。
将apk上传七牛云有几种方法,Python好的同学可以自行研究下命令行上传。这里介绍一种老少皆宜的方法:使用七牛插件上传。但是,目前在七牛开发者中心-Jenkins七牛插件中已经找不到相关插件了,不过在万能的github上还可以找到源代码:https://github.com/ipy/qiniu-plugin
推荐一个网址可以参考:http://blog.csdn.net/fengshi_sh/article/details/50669754
但是该网址里面的很多代码有误,这里亲测并修改了:
下载好源码后,建议修改QiniuPublisher.java文件
- 1 注释掉
System.console().printf(profile.getName() + "/n")
2 在第107行
1
2
3 //String keyPath = path.getRemote().replace(wsPath, "");
//String key = keyPath.replace(File.separator, "/");
String key = path.getName();3 由于java8环境,还要修改pom.xml文件
1
2
3
4
5
6
7
8
9
10
11
12
13 diff --git a/pom.xml b/pom.xml
index 0f577be..4d7c73d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -13,7 +13,7 @@
<parent>
<groupId>org.jenkins-ci.plugins</groupId>
<artifactId>plugin</artifactId>
- <version>1.509.4</version>
+ <version>1.554.1</version>
</parent>
<groupId>org.6wind.jenkins</groupId>
修改完成后,就可以编译了,步骤如下:
在”终端”里执行
1
2
3
4
5
6
7 brew install maven
cd /Users/apple/Downloads/qiniu-plugin-master //进入源码文件夹
export MAVEN_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=8000,suspend=n"
mvn hpi:run //会运行起一个模拟环境
^q //退出该模拟环境,
mvn clean //删除target,第一次无需执行这个
mvn package //打包生成Tagret,新生成的.hpi文件就在target下
最后,将编译好的.hpi导入jenkins插件: 系统管理–管理插件–高级–上传插件
然后在增加操作后步骤选项框里就能看到上传到七牛的选项了!
4.2 七牛设置项(系统管理–系统设置)

Accesskey/Secretkey 值可在七牛账户中查看,对应AK和SK
4.3 配置上传到七牛的相关参数
增加构建后造作步骤—>上传到七牛

选择上传到七牛后显示如下:

需填写的内容:
七牛配置项:系统设置-七牛-设置项名称
文件路径:需要上传的文件路径
要上传到的 bucket:上传到七牛的空间(文件夹)名称
勾选“构建失败则不上传”
上传成功后,七牛官方给出的反馈日志如图
构建后在jenkins构建项目的Console Output里能看到相关日志,证明上传成功。
5 生成七牛下载链接和二维码
最终效果如下图,构建完成后会显示在项目主页的构建历史里。

5.1 生成七牛下载链接
由于请求七牛的返回值里没有具体链接,只有目标资源的最终名字。而七牛的bucket文件夹一旦创建,这个bucket的外链默认域名是固定的,因此七牛的链接需要手动把bucket下载链接拼上。(目前七牛bucket文件夹生成的临时域名需要绑定自定义域名,但是在这里并不影响我们的配置,配置了的话换成自定义域名就好。)
链接的展示需要用到:构建后操作—Set build description
在这个插件里写好的链接会出现在此项目主页的构建历史里。
使用这个插件之前,需要到系统配置—安全配置中,将MarkUp Formatter修改为Safe HTML,这样展现的二维码和链接才能显示成H5标签,否则会显示成文本。
接下来配置Set build description。
- 第一行是正则表达式,这里的”key”:”(.*)”是用来匹配七牛返回链接里的”key”:””的值。
- 第二行是显示的h5代码,这里是生成了能点击的链接,\1表示引用上面正则里的第一个值。
构建成功后生成这样的下载链接:
5.2 生成下载链接的二维码
由于七牛并不像蒲公英等网站能自动生成二维码,因此需要自己手动去生成。

在gradle版本升级到了4.1以上的时候,由于每次生成文件目录是一样的,而gradle又执行了clean命令,因此每次执行打包命令时output下的目录都会被清理(但是可以节省空间),因此用本地apk的路径生成二维码不太合适。这里选择将七牛的下载链接生成二维码,保证可控时间内链接都有效,而且可以外网访问。
按照正常逻辑来讲,应该是先上传七牛之后再生成七牛下载链接的二维码,毕竟没有上传的时候下载链接应该是不存在的。但是,由于生成二维码需要用到Execute shell这个插件,而这个插件在jenkins中是在“构建”这个模块下配置的,而七牛上传插件是在“构建后操作”这个模块下配置的。如图所示:

也就是说,在上传七牛以前就要生成下载链接二维码!!!

是的,就是这种令人窒息的操作。方法其实很简单,这里还是用了那个小技巧:七牛的bucket(文件夹)一旦创建,这个bucket的外链默认域名是固定的。
也就是说,七牛的下载链接在上传七牛以前我们就能自己拼好(上传的文件名是自己定义的),二维码因而也可以在上传之前生成。
下面是具体配置:
需要用到python和qrcode这个库。
第一步:下载安装Python和pip
windows和Ubuntu安装方式有点区别,请自行百度。
命令行输入:pip list 检查是否安装成功
第二步:安装Pillow
由于PIL仅支持到Python 2.7,加上年久失修,于是一群志愿者在PIL的基础上创建了兼容的版本,名字叫Pillow,支持最新Python 3.x,又加入了许多新特性,因此,我们可以直接安装使用Pillow。
命令行输入:pip install Pillow
第三步:安装qrcode
命令行输入:pip install myqr
第四步:Jenlins中配置Python环境变量
进入 →系统管理 →系统设置 找到 Enviroment variables

第五步:生成二维码指令
进入项目→构建→增加构建步骤,选择Execute shell(Ubuntu),或者Execute windows batch command(windows),填写qrcode生成二维码的python命令:

格式如下:
myqr apk下载链接 -n 二维码命名 -v 1 -l L -d 二维码存储路径
具体指令含义详见: https://github.com/sylnsfar/qrcode
第六步:展示二维码
构建后操作 → 增加构建后操作步骤→Set build description
在原有七牛下载链接上添加刚才二维码保存的图片路径:

最后点击保存。
在项目页面点击
大功告成!!!!