前言:
做android移动开发的肯定经常会面临被公司各个人员索要apk包的情况,身为程序员的我们最讨厌的就是在写代码的时候被不停的被测试产品或者其他人打测试环境生产环境或者开发环境的包,有的需要改版本号,有的需要改动版本code,有的需要对apk包进行加固,甚至在给对方打好包用微信传过去的时候,微信同志还会自动给你加上一个.1的后缀,导致小白用户始终装不上apk,而对你啧啧,这个时候多么想要给人家提供一个二维码,让他们自己玩去,针对以上的种种,我结合网上的其他前辈的道路配置出了一套可以为android自动打对应的包,并生成本地相应的二维码进行下载,版本之前不存在冲突的情况,为后续需要旧版本时提供留档,下面让我们开始吧,我的文章分为以下几个部分,请耐心阅读:
1.安装jenkins并配置jenkins环境
2.配置android的build.gradle文件
3.jenkins配置 android打包所需要参数的可变变量
4.jenkins 与build.gradle参数关联
5.配置输出的apk产物
6.将生成的apk包,发布到第三方二维码平台可供扫码下载
7.模拟步骤6 将生成的apk包,生成二维码展示到jenkins上,并将apk包保存到私有服务器上
8.将打好的apk包,设置可变参数,选择360命令加固
大致思路:
对jenkins不太了解的前台伙伴,可以把它想象成一个exe或者apk,我们可以通过浏览器对其进行访问。有人估计会问为何要设计成浏览器的方式进行访问时,我们会知道我们jenkins工作的电脑是针对好多人,并且他运行的机器很有可能在阿里云或者腾讯云最起码也是公司自己买的服务器上面,这样的话jenkins在打包的时候,不占用咱们工作的电脑的资源,配置到服务器上那打包速度是你从未体验过的。jenkins他管理的是好多项目可以是andoid项目也可以是后台的war包,也可以是ios的包,可以对这些项目进行一些响应的操作,比如说编译运行打包,他只是一个平台如果想要实现这些功能的话必须安装一些插件来实现具体的功能。
为了提供给其他人使用,我们需要jenkins可以通过浏览器的形式访问,要不是将jenkins放到服务器上,要不是配置jenkins的服务地址。刚开始我是在本机上,首先安装了一个tomcat,然后去jenkins官网上面下载了一个jenkins.war,放到tomcat的webapps里面,然后重启服务器,在浏览器里面直接输入http://localhost:8080/jenkins/ 就会出现jenkins的一些设置界面,这些流程不在赘述
tomcat的官网可以直接下载 http://tomcat.apache.org/
jenkins的下载官网可以直接下载对应的war或者exe https://jenkins.io/download/
对于Android打包来讲一般需要的插件有
- Git plugin git的插件
- svn Plugin svn的插件
- Gradle Plugin gradle的插件
- description setter plugin 后续说
- build-name-setter 后续说
- SSH plugin 后续说
-fir plugin 后续说
插件可能不全,后续使用过程中会再添加
在jenkins的界面中的管理插件的部分,可以搜索想要安装的插件,如果搜索不到对应的插件,可以去以下地址查找
插件镜像地址http://updates.jenkins-ci.org/download/
crtl+f搜索你想要的插件吧,下载之后你会发现是一个后缀为.hpi的文件,你需要在管理插件的高级部分中的上传插件部位,将下载的插件上传至jenkins即可,想要jenkins支持什么样的功能就去下载对应的插件,然后安装即可,有些插件需要重启jenkins才生效,请格外注意 这些不清楚的同学可以参见 https://blog.csdn.net/zzy1078689276/article/details/77477619
设置jenkins全局都需要的变量,具体在系统管理中的系统配置
第一个变量必须创建,先别问为什么,这个变量对应的地址,可以自己随意创建一个,但是必须对应好相应的路径,是jenkins所在电脑的这个文件夹的地址,别写错了,
第二个变量设置全局的输出编码格式为utf-8的模式,防止乱码,这些不用我说你们都知道
然后在系统管理的全局工具配置里面配置以下android所需要的环境 jdk 跟gradle 路径均是jenkins所在服务器的地址,jdk的版本最好1.8以上防止有问题 gradle可以自己下载好的,也可以自动安装
开始创建我们的job
1,点击 New Item,输入工程名点击Freestyle project 创建一个新工程
2,配置新项目
上面的参数构建,都会在我们在构建项目之前需要选择的选项,然后打出我们想要的包,当然你可以在这个地方配置更多的参数,供自己使用,配置后出来的结果是这个样子
配置以下我们jenkins要从哪里获取要执行的代码,其实jenkins是从svn或者git上checkout下来,然后在远程安装jenkins的服务器上进行编译的,每次编译前,jenkins会从svn更新代码,然后重新编译,下面设置svn的地址以及账号密码,Reposrtory depth仓库深度选择infinity 最深层
这个打钩的位置是为了在构建的同时在打印日志的工作台上面,添加系统时间,方便查阅
下面重点来了,构建任务是按照配置的先后顺序进行执行,我们在上面参数化配置中优这个buildtype的参数,我们可以根据相应的debug或者release选择打什么类型的apk包,
make gradle wrapper勾上,是为了执行gradlew的命令,android开发应该都不陌生吧
clean assemble${BUILD_TYPE} --stacktrace --debug
这个命令是首先对项目clean一下,然后进行gradlew assembledebug 或者gradlew assemblerelease 进行打包
然后指定我们项目app要编译的注册表build.gradle这里面描述了要如何构建这个项目,jenkins如同是一个主持人,而这个build.gradle像是一个节目流程单子,这样来说比较容易明白吧!
最后一个打钩的位置是,将我们jenkins上面构建的参数,与项目本地的gradle.properties对应起来,在我们选好参数开始构建之后,会将对应的参数给与gradle.properties中的变量进行重新赋值,这样就jenkins跟项目的桥梁就创建起来了,
对于倒数第二个选项GRADLE_UER_HOME,这个参数,我在编译过程中报了一个莫名其妙的错误,但是错误跟代码环境均没有关系,大意是不能打开png文件什么鬼的,后来经过小半天的查找说是一个全栈网上有一个人翻墙的时候说这个选项勾起来,还必须在全局设置这个变量,然后随意指定一个文件夹即可,然后这个问题解决了 ,不知道怎么设置的同学可以参见上述安装插件左右的红色字体部分
上面的构建动作完成之后,我们就会在app/build/outputs/的目录下看见我们的apk包了.比如我的项目的工作空间下可以一级一级目录点开然后可以查看
这样总是很麻烦,我们可以设置输出产物
这样子打完包之后,在我们的结果区间可以直接看见
先不管android下的build,.gradle该怎么配置,我们先把jenkins上面的配置完之后再说那个。
对于常规来说,到这一步只需要点击产物的那个包,就会自动下载了,这是针对我们开发或者测试来说还是很容易操作的,但是对于产品或者客户来说他们不可能一步一步的登陆上去然后编译出结果然后下载吧,再说这个jenkins上面很可能配置了公司的其他项目,一个操作不慎的话其他项目也会受到牵连,所以最好的办法是我们在jenkins编译好apk包之后分享给他们,但是有些时候产品或者客户很脑残,连个压缩包都不知道该怎么处理,真的很令人绝望。于是乎发现了第三方的蒲公英或者fir平台,我们可以将我们的apk包上传至他们的服务器上然后他们会生成一个二维码,然后分享给小白用户,
首先安装fir的jenkins的插件,在fir上创建账号密码,登录上去之后复制一下token
然后在job的配置中的构建后的操作是
填写 API Token
到这个之后,在构建成功之后,会自动将apk上传至fir平台,但是还是需要我们登上fir网站上面将二维码截图给小白,实在是不方便,网上有说可以给它配置用命令行的形式将apk包上传给fir之后,fir会给jenkins一个回调里面有一个参数是二维码的图片的地址,然后我们可以让他回显到jenkins结果视图上面,我没有做这个东西,因为一天免费下载99次,之后要收费,并且可能要面临的是不停的往fir上上传apk包,并不会存档,而是覆盖,也就是说,apk的二维码分享给小白之后,我又换了个环境打了个包然后上传上去了,小白再去扫码下载的是最新包,这是不合理的,按道理上来说,一个二维码对应一个apk,他们之间没有关系,并且总感觉上传到fir的平台上感觉怪怪的。先看下我们的想要的结果
这个二维码的回显可以设置
是支持html形式的,但是首先要改动一点,在jenkins的全局系统配置中的全局安全配置中改成safehtml才可以支持上述二维码的展示
下面我们只需要根据不同的apk生成不同的二维码,然后将二维码的图片地址放到
<img height="300" width="300" src=""><br> 这个标签src中即可,
https://download.csdn.net/download/o279642707/10516116
qrcode.jar使用这个jar包即可完成,首先看下我们使用的语法
java -jar jar包的路径 url=公网apk要下载的地址包含apk的名称 image=要生成二维码的名称 save=要生成二维码的路径
将上面的汉字均替换一下,你看下自己的二维码的路径下有没有生成这个图片,我走了很多弯路这里,你可以直接在cmd的命令行下直接运行,看结果对不对即可,然后将上面的汉字均替换成jenkins服务器所在地址即可。然后我们在jenkins上面配置这个dos命令如下,是在构建成功apk之后添加这个命令,也就是生成apk之后我们要生成对应的二维码图片。
java -jar D:\jenkins\Progra~1\************\qr.jar url=******************/JM_%BUILD_TYPE%_v%APP_VERSION%_code_%APP_CODE%_%BUILD_TIMESTAMP%.apk image=JM_%BUILD_TYPE%_v%APP_VERSION%_code_%APP_CODE%_%BUILD_TIMESTAMP%.jpg save=D:\jenkins\Progra~1\workspace\******************\jpg\
这个地方给你们提供复制,这个地方的代码设计可供你们参考,
生成二维码之后我们需要将apk上传至自己服务上面具体可配置构建后的操作
因为我们选择不同的buildtype会将apk包生成到不同的文件夹,我们上面根据不同的变量去不同的文件夹下找对应的apk包
这里需要交代下,dos下变量取值用%%
shell下用$
上面这俩个图必须一一对应,不懂的话,多看俩边
java -jar D:\jenkins\Progra~1\************\qr.jar url=******************/JM_%BUILD_TYPE%_v%APP_VERSION%_code_%APP_CODE%_%BUILD_TIMESTAMP%.apk image=JM_%BUILD_TYPE%_v%APP_VERSION%_code_%APP_CODE%_%BUILD_TIMESTAMP%.jpg save=D:\jenkins\Progra~1\workspace\******************\jpg\
多理解一下,一一对应,不行的话阶段进行测试,先看下是否正确生成二维码,然后用浏览器扫描二维码,扫描出来的文字信息,跟我们想要的路径是否一致,生成的二维码所代表的的公网地址,跟image的标签里面的是否对应,对了,可能有人要问我为啥要加入这么多的参数干啥,其实是为了保证我们apk包唯一性,最后的buildtimesta其实取值buildid,也是为了区别相同参数,不同时间操作的重复性,对,去重!
另外,需要说明我将生成的二维码均保存到项目下的jpg文件夹下了
上面说了这么多已经走了一大半了,后面我们说下android代码项目中的配置首先看。gradle.properties中
org.gradle.jvmargs=-Xmx1536m
APP_VERSION=1.0.0
APP_CODE=0
BUILD_TYPE=Debug
APP_SERVER=TEST_ENV
IS_JENKINS=true
android.enableBuildCache=false 这行不可缺少 其余可配置
BASEURL="http://112.35.3.124:8082"
appReleaseDirect=""
appDebugDirect=""
BUILD_TIMESTAMP=""
环境前缀比如说要请求的 10086.com/abc/
在公共前缀钱需要修改成这个样子
如果buildconfig下面没有baseurl,先同步编译之后看看能不能出来这个。
到此讲解完毕!360加固的暂未实现,不过还是跟自动打包流程一样,需要实现命令行
群号:231463949 不懂的可以加群交流