Jenkins构建安卓项目配置
# 1,简单介绍。
公司安卓打包都是开发小伙伴每次用自己的 IDE 进行打包,有时候测试需要某个包,还需要找开发去要,两相权衡,都要废掉不少时间。有时候浪费一些时间还好,当你沉浸在自己的思路当中工作时,最烦别人突然打断,这种打断不仅仅是眼前的事情无法继续,更是将充满光芒的思想的慧根给切断了。
为了避免这种情况,我打算利用 Jenkins 来作出打包功能,然后权限开放给测试小伙伴,他们可以自己按需进行打包并下载使用,而不用再依赖于开发人员,简直是测试小伙伴的福音。
# 2,效果展示。
开始正式的配置之前先看一下最终的效果,来刺激一下学习的劲头。
利用 Jenkins 的插件直接在项目的构建历史当中显示可以下载的二维码。网上的一般都是打码分享的,我这里放心大胆分享,等会儿再细说可以这么做的原因。
而且在邮件通知当中,测试小伙伴也可以直接保存二维码或者点击链接进行下载。
好啦,现在开始吧。
# 3,准备工作。
# 1,一个可用的 Jenkins 环境
这个不多说了,不会的参考本人其他 Jenkins 文章。
# 2,配置 gradle。
官网:https://gradle.org/
下载地址:http://services.gradle.org/distributions/
找到与自己公司安卓开发所使用的版本下载即可(注意下载后缀是 all.zip 的,不要下载别的)。我一开始就有遇到版本太低了的情况,这里就不重现了,直接下载公司现在用着的 4.4 版本。
下边是一波命令的操作
cd /opt
wget http://downloads.gradle.org/distributions/gradle-4.4-all.zip
unzip gradle-4.4-all.zip
vim /etc/profile
#gradle
export GRADLE_HOME=/opt/gradle-4.4
export PATH=$PATH:$GRADLE_HOME/bin
source /etc/profile
gradle -v
2
3
4
5
6
7
8
9
10
11
12
最后用查看版本号的方式验证安装情况。
写教程的时候已经忘掉自己配置 gradle 的时候遇到的一个问题,那就是系统的 glibc 版本过低的问题,这个真的是让人非常难受,前两天在自己服务器配置 mindoc 的时候也是碰到这个问题,意思就是 CentOS 6 版本上用的 glibc 版本只到 2.12,然而很多依赖需要 2.14 的,好了,升级去吧,有够受的,即便是看上去升级可以了,但是又会搞乱系统的编码,现在想起来,当时我在 6 上碰到这个问题了,直接跳过,去到 CentOS 7 上部署了。
有时候,不要死磕,也是一种好的精神。
# 3,配置 sdk。
一个比较不错的下载地址:tools.android-studio.org/index.php/sdk
再来一波操作
cd /opt
wget https://dl.google.com/android/android-sdk_r24.4.1-linux.tgz
tar xf android-sdk_r24.4.1-linux.tgz
vim /etc/profile
#SDK
export ANDROID_HOME=/opt/android-sdk-linux
export PATH=$PATH:$ANDROID_HOME/tools
2
3
4
5
6
7
8
9
然后通过下边的命令来验证安装的情况
cd android-sdk-linux/tools
./android list sdk --all #通过这个命令列出所有的sdk版本。
2
3
./android update sdk -u --all --filter 1,2,3
#再通过这个命令安装需要的sdk版本。其中1,2是对应版本的标签。
2
公司这边需要的是 24.0.0 26.0.0 27.0.3 这三个,那么对应的安装就可以了,命令如下:
./android update sdk -u --all --filter 4,11,19
其实一开始并不知道该安装的是哪些,只听公司开发说代码里写了一个需要 26 的,一开始也就只是下载了 26 版本的,剩下两个都是在后来的报错中知道需要这个,那么就安装咯。
报错的样子大概如下:
当你下载这些之后,会在 build-tools 目录下保存着。
ok,基本上服务器这边的环境差不多了,就剩 Jenkins 这边的配置咯。
# 4,web 界面配置
# 1,安装一些插件
- 必有:
- build-name-setter #是一个设置构建项目名称的插件。
- Gradle #这个不说了,gradle 所需插件。
- Git Parameter #在选择参数化构建的时候使用。
- Email Extension Plugin #发送邮件使用。
- description setter plugin #等会儿配置构建历史显示二维码的利器。
# 2,配置全局变量
进入到系统管理–》系统设置–》全局属性–》环境变量
添加两个:
::: denger
注意名称不要乱改,因为常规来说都是这么定义的,如果乱改,可能出错。
:::
再添加一下 gradle 的全局变量。
进入到系统管理–》全局工具配置–》添加 gradle
这里的 name 可以随便定义,但是下边的路径不要错了。
ok,现在可以开始正式的项目配置了。
# 5,配置项目
# 1,新建一个项目,名字就是 test-android 好了。
# 2,丢弃旧的构建,没啥说的,不让构建历史太长。
# 3,参数化构建构成
使用选项参数来进行选择,这里配置了两项,一个是定义包的环境,测试预发与线上,另一个就是 Git 的分支版本号。
# 4,源码管理
这没啥说的,配置好地址就行了。
# 5,构建环境
在构建环境这里可以选择一下 set build name,只是为了让构建历史中看起来好看一些。
#${BUILD_NUMBER}-${ENVIRONMENT}-${BRANCHES}
其中的变量也都是根据项目里边配置的变量来定义的。
定义之后显示效果如下:
# 6,构建
使用 gradle 命令进行构建。
首先是构建这里,选择 gradle 的构建,version 是选择刚才配置好的环境变量。
下边 Tasks 写入编译的命令,其实是一整条,只不过这里分行显示了,可以直接合成一行,只不过每行之间都要空格。
注意这里的变量其实是上边选择参数里边定义的名称,不要弄错了。
# 7,execute shell
这里完成了两件事儿,一个是让 apk 在内网环境中可供下载,一个是生成对应的二维码,这个地方需要详细表述一下。
首先,来解答一下开头我说可以不打码放心的放出二维码,是因为这些配置都是在内网当中,外网是无法访问下载的。网上很多教程都是借用一些第三方的平台,诸如蒲公英之类的,但我觉得这种方式太 low,或者说依赖这种第三方很不理想,理想中就是一切靠自己在本地给完成了。偶然的之前在一个地方看到一个大神分享了一个二维码制作的小工具,也正是借助于这个工具,得以让所有的关于二维码的情况得以实现。
- name: QRcode4JAVA
desc: 本地生成二维码图片工具
avatar: https://avatars2.githubusercontent.com/u/416130?s=460&u=8753e86600e300a9811cdc539aa158deec2e2724&v=4 # 可选
link: https://github.com/ariesliu/QRcode4JAVA # 可选
bgColor: "#0074ff" # 可选,默认var(--bodyBg)。颜色值有#号时请添加单引号
textColor: "#fff" # 可选,默认var(--textColor)
2
3
4
5
6
在此感谢作者那种,跟我一样的共享开源的精神。嘿嘿。
一开始我的思路想着直接将地址定位到 Jenkins 的工作空间那里边,然后直接让用户扫描二维码进行下载不就 ok 啦,就是借助于 Jenkins 的功能,让这里的下载变得 easy,然而,现实却是当你这么配置了之后,得出一个二维码,扫了二维码之后发现,需要登录 Jenkins 才能进行下载,,哈哈哈哈,搞到这里,我自己也忍不住呵呵一笑。
那么好吧,给你制作一个单独的可供下载的地址好啦。
直接在本地安装 nginx。配置两个虚拟主机:
一,可供下载的 apk。
[root@xdjenkins vhost]$cat apk.conf
server {
listen 800;
server_name test.apk.com;
charset utf-8;
location / {
root /usr/local/nginx/html/app/;
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
}
}
2
3
4
5
6
7
8
9
10
11
12
二,可供访问到的二维码地址。
[root@xdjenkins vhost]$cat er.conf
server {
listen 801;
server_name test.image.com;
charset utf-8;
location / {
root /usr/local/nginx/html/er;
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
}
}
2
3
4
5
6
7
8
9
10
11
12
提示
注意:两个虚拟主机当中的域名就不要太在意了,随便写的而已,反正都是内网使用,等会儿都是直接用 ip+port 就可以啦!
好啦,现在可以直接利用二维码制作小工具来生成咯。
现在来贴出刚才在 shell 中执行的那两步操作。
cd /usr/local/nginx/html/app/ && rm -rf *
cp $WORKSPACE/app/build/outputs/apk/app/$ENVIRONMENT/*.apk ./
source /etc/profile
A=`cd /usr/local/nginx/html/app/ && ls > /tmp/aa.log && cat /tmp/aa.log`
java -jar /usr/local/nginx/html/tools/qr.jar url=http://192.168.106.101:800/$A image=ishangjie.jpg save=/usr/local/nginx/html/er/
2
3
4
5
6
7
8
9
没啥过多好说的,暂时这个地方也比较 low,因为容易出现 apk 被覆盖的问题,毕竟测试人那么多,第一个发好了,正在下载 app,这个过程中又有另外一个人发布给覆盖了,那么第一个人就又要再重新去发布一次才能下载,虽然这种情况基本上不大多,但是在公司测试人员比较多的情况下也会出现,所以暂时先这样,后期丰富一下功能,实现保留 5 个历史 apk 与对照的二维码。
# 8,构建后的操作
在构建后操作里添加这个,此处就是定义构建历史显示二维码的地方,此处也踩坑不少,由于不是很懂 html,导致改来改去,也没有效果,最后竟然发现不是 html 写的有问题,而是需要修改一些其他地方的配置。
笔记
这个还是在 Jenkins 群里认识的一个兄弟告诉我的,在此表示感谢,有些人有些事就是说不清楚,在你需要的某个时刻,在你苦苦求索无果的某个时刻,他只用那么一句话,就把你给点醒。
这个时候这里不用动,是 Jenkins 当中默认的填入方框里的是文本格式,所以这里的 html 也就失去效果,一直像我这里显示的样子了:
解决办法:
进入系统管理–》全局安全配置–》Markup Formatter
原本默认的是纯文本的,现在更改成 html,然后二维码显示就正常了。
但是,注意,这里会带来一个问题,那就是全局全部都变成 html 的了,之前一些配置可能会受影响。
这里举一个受影响的例子:
所以这里就要做一个取舍了,看你自己想要哪一个,不想要哪一个了。
# 9,配置发送邮件
最后是邮件的配置了,上边第一个箭头是定义的收件人,中间的是格式,下边的是邮件内容。
在下边了:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>${ENV, var="JOB_NAME"}-第${BUILD_NUMBER}次构建日志</title>
</head>
<body
leftmargin="8"
marginwidth="0"
topmargin="8"
marginheight="4"
offset="0"
>
<table
width="95%"
cellpadding="0"
cellspacing="0"
style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sans-serif"
>
<tr>
<td>(本邮件由程序自动发送,请勿回复!)</td>
</tr>
<tr>
<td>
<h2><font color="#0000FF">安卓包下载地址</font></h2>
</td>
</tr>
<tr>
<td nowrap="nowrap" style="border-color: gray;">
<span style="color: #808000;">本次构建的安卓版本号是:</span>
</td>
<td nowrap="nowrap" style="border-color: gray;">
<span style="color: #808000;"
>#${BUILD_NUMBER}-${ENVIRONMENT}-${BRANCHES}</span
>
</td>
</tr>
<tr>
<td>
<ul>
<li>
下载地址:<a href="http://192.168.106.101:800/ishangjie.apk"
>点击即可下载</a
>
</li>
<img src="http://192.168.106.101:801/ishangjie.jpg" />
</ul>
</td>
</tr>
</table>
</body>
</html>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
ok,就此,所有的都配置完毕,基本上可以收工了。
剩下的也就是 Jenkins 的权限配置一下,让测试小伙伴可以自己构建使用,别的,找合适的地方炫耀一波,基本上就够了。
一周下来,用了晚上几个小时就给总结了,是的,没错,先写一遍教程,再整理到博客上来,几个小时就进去了,今天周五,下班的时候七点半了,回到家吃过饭就开始弄博客,到这会儿,哈,一眨眼功夫,竟然快零点了!!!
任何人如果在使用本教程的过程中有疑问,都可以通过主页上的联系方式与我交流。
# 6,补充之一,关于链接的补充
18 年 5 月 14 日补充如下:
上周是周五将下班写的总结,临事匆忙,因此漏掉最后一步,今天特来补充。
最后附上所有曾参考过的文章在此,尽管没有某一篇是给自己指明十分清晰的路,但是没有这些铺垫,自己也不可能走到现在,从开头的抱怨,到中途的熬炼,再到最后的感恩,这就是学习的历程,也是学习的趣味吧。
参考:
https://www.jianshu.com/p/915c1ae69144
https://blog.csdn.net/g19920917/article/details/52071957
https://blog.csdn.net/g19920917/article/details/52071957
https://blog.csdn.net/w_yunlong/article/details/54695535
https://blog.csdn.net/cjm2484836553/article/details/78013272
https://blog.csdn.net/xlyrh/article/details/54667633
https://segmentfault.com/a/1190000008395219
http://www.uml.org.cn/jchgj/201801292.asp
# 7,补充之二关于未竟之事的补充
18 年 5 月 17 日晚 22 点补充
上周定的计划说完成 Jenkins 构建安卓项目的五个历史二维码可供下载的,但是两天过去,也请教过不少周边前端的人,基本上都以失败告终。
经过两天断续试验,到头来惊然发现,邮箱里边不支持 js 的代码,知道真相的我,顿时“泪如雨下”。这种感觉就像你做了所有的万全准备了,最后东风没来,气煞我也。
喏,就是如下所示:
还有:
又能说什么呢。
这里简单说明一下方案与最终的折中办法。
首先怎么在二维码访问站点下保留五个二维码,怎么在 apk 访问站点下保留五个 apk,好像这两个都不是特别难,但是让这两者所保留的五个历史分别进行对应性的可以通过二维码下载到对应的 apk,这个就相当有难度了。
我仔细观察过项目构建之后生成的 apk 名称,也算是有规律,差不多是这样:${ENVIRONMENT}-${BRANCHES}.apk,如果依靠原始的名称来作为可供使用的 apk 下载,如果是只保留一个,显然是可以的,但是如果想要保留五个,那么但从命名这一个方面就是无法定义的,还有就是需要二维码那里的名称与 apk 保持同步以及对应,这事儿或许有多种解决方案,但是就我个人目前所想到的,大概就是这么一种了,很荣幸,就这么一种,被我给想到了。
这种方法就是直接调用系统中的变量${BUILD_NUMBER}作为 apk 的名称,以及二维码的名称,这样,既保证了 apk 与二维码的对应关系,也保证了每次做了新的构建之后三方同步向前更新,,,事实上这个地方的难点也正在于此,因为每次都会进行新的构建,如果不是抓住构建数这个变量,恐怕还真不好控制。
现在保留五个 apk 与五个二维码并且他们是对应关系已经不难,而通过邮件将五个二维码展示出去也实现不了,那就干脆退而求其次,让测试同仁直接通过 Jenkins 的构建历史当中显示的二维码进行下载吧。
最后就是保留五个历史的操作了。参考我的另一篇文章,保留五个文件的办法 (opens new window)。