二丫讲梵 二丫讲梵
首页
  • 最佳实践
  • 迎刃而解
  • Nginx
  • Php
  • Zabbix
  • AWS
  • Prometheus
  • Grafana
  • CentOS
  • Systemd
  • Docker
  • Rancher
  • Ansible
  • Ldap
  • Gitlab
  • GitHub
  • Etcd
  • Consul
  • RabbitMQ
  • Kafka
  • MySql
  • MongoDB
  • OpenVPN
  • KVM
  • VMware
  • Other
  • ELK
  • K8S
  • LLM
  • Nexus
  • Jenkins
  • 随写编年
  • 家人物语
  • 追忆青春
  • 父亲的朋友圈
  • 电影音乐
  • 效率工具
  • 博客相关
  • Shell
  • 前端实践
  • Vue学习笔记
  • Golang学习笔记
  • Golang编程技巧
  • 学习周刊
  • Obsidian插件周刊
关于
友链
  • 本站索引

    • 分类
    • 标签
    • 归档
  • 本站页面

    • 导航
    • 打赏
  • 我的工具

    • 备忘录清单 (opens new window)
    • json2go (opens new window)
    • gopher (opens new window)
    • 微信MD编辑 (opens new window)
    • 国内镜像 (opens new window)
    • 出口IP查询 (opens new window)
    • 代码高亮工具 (opens new window)
  • 外站页面

    • 开往 (opens new window)
    • ldapdoc (opens new window)
    • HowToStartOpenSource (opens new window)
    • vdoing-template (opens new window)
GitHub (opens new window)

二丫讲梵

行者常至,为者常成
首页
  • 最佳实践
  • 迎刃而解
  • Nginx
  • Php
  • Zabbix
  • AWS
  • Prometheus
  • Grafana
  • CentOS
  • Systemd
  • Docker
  • Rancher
  • Ansible
  • Ldap
  • Gitlab
  • GitHub
  • Etcd
  • Consul
  • RabbitMQ
  • Kafka
  • MySql
  • MongoDB
  • OpenVPN
  • KVM
  • VMware
  • Other
  • ELK
  • K8S
  • LLM
  • Nexus
  • Jenkins
  • 随写编年
  • 家人物语
  • 追忆青春
  • 父亲的朋友圈
  • 电影音乐
  • 效率工具
  • 博客相关
  • Shell
  • 前端实践
  • Vue学习笔记
  • Golang学习笔记
  • Golang编程技巧
  • 学习周刊
  • Obsidian插件周刊
关于
友链
  • 本站索引

    • 分类
    • 标签
    • 归档
  • 本站页面

    • 导航
    • 打赏
  • 我的工具

    • 备忘录清单 (opens new window)
    • json2go (opens new window)
    • gopher (opens new window)
    • 微信MD编辑 (opens new window)
    • 国内镜像 (opens new window)
    • 出口IP查询 (opens new window)
    • 代码高亮工具 (opens new window)
  • 外站页面

    • 开往 (opens new window)
    • ldapdoc (opens new window)
    • HowToStartOpenSource (opens new window)
    • vdoing-template (opens new window)
GitHub (opens new window)
  • Nexus系列文章

  • Jenkins系列文章

    • Jenkins入门系列笔记汇总整理
    • 前言与介绍
    • Jenkins初始部署与简单配置
    • Jenkins各配置选项介绍
    • Jenkins中一个项目的构建
    • Jenkins配置项目构建的钉钉通知
    • Jenkins忘记管理员密码怎么办
    • Jenkins与gitlab的交互探微
    • Jenkins根目录详解
    • Jenkins插件之显示构建时间
    • Jenkins插件之批量修改配置
    • Jenkins配置简单构建邮件推送
    • Jenkins复杂邮件推送配置详解
    • Jenkins配置复杂构建邮件推送
    • Jenkins构建安卓项目之前的一些唠叨
    • Jenkins构建安卓项目配置
      • 1,简单介绍。
      • 2,效果展示。
      • 3,准备工作。
        • 1,一个可用的 Jenkins 环境
        • 2,配置 gradle。
        • 3,配置 sdk。
      • 4,web 界面配置
        • 1,安装一些插件
        • 2,配置全局变量
      • 5,配置项目
        • 1,新建一个项目,名字就是 test-android 好了。
        • 2,丢弃旧的构建,没啥说的,不让构建历史太长。
        • 3,参数化构建构成
        • 4,源码管理
        • 5,构建环境
        • 6,构建
        • 7,execute shell
        • 8,构建后的操作
        • 9,配置发送邮件
      • 6,补充之一,关于链接的补充
      • 7,补充之二关于未竟之事的补充
    • Jenkins与Gitlab分支的交互
    • Jenkins构建nodejs项目
    • 使用docker部署Jenkins及初始配置
    • 配置gitlab提交代码Jenkins自动构建
    • Jenkins回滚方案探微
    • Jenkins角色控制(小黄锁)探微
    • Jenkins构建的应用配置问题解决探微
    • Jenkins构建中tag的应用
    • Jenkins插件之Ansicolor(神器)
    • 最基础核心的Jenkins功能部署一个java应用
    • Jenkins+sonar构建代码扫描
    • Jenkins+docker+gitlab将应用部署到docker
    • Jenkins参数化构建犀利插件Active-Choices-Plugin
    • 记一次将代码中参数外显到构建历史中的操作
    • Jenkins升级与迁移的经验分享
    • pipeline笔记之从一个简单的项目构建开始
    • Jenkinsfile声明式语法详解
    • 自动构建的原始配置以及pipeline中的用法
    • 多分支构建的实践与思考
    • 使用Jenkinsfile类前端项目的部署与回滚
    • 如何在Jenkinsfile中定义一个全局的时间戳变量
    • Jenkins中自由风格回滚方案的最佳实践
    • Jenkins中pipeline风格回滚方案的最佳实践
    • pipeline结合ansible剧本进行批量的部署与回滚配置
    • 最近配置安卓iOS打包本地化流程中一些值得记录的内容
    • pipeline中如何在environment环节声明一个含有通配符的变量
    • git-Parameter插件在pipeline共享库中的实践详解
    • jenkins作为ci检测代码是否合并的实践
    • 将Jenkins共享库的Jenkinsfile放到ci静态检测的实践
    • Jenkins的pipeline实践之GitSCM参数配置项详解
    • Jenkins中pipeline对接CMDB接口获取主机列表的发布实践
    • Jenkins有任务无法kill提示即将关闭
    • Jenkins基于Share Library共享库的最佳实践探索
    • Jenkins结合MySql Database插件的平台化实践思路
    • Jenkins-Groovy中三元表达式的用法
    • Jenkins-Groovy中Switch的高阶用法
    • Jenkins-pipeline之利用activity choice插件对接查询MySQL数据实现动态参数化的功能
    • CentOS通过yum快速安装Jenkins
    • Jenkins-pipeline语法之错误处理详解(文末有干货)
    • Jenkins常用插件汇总以及简单介绍
    • Jenkins所遇报错汇总及解决
    • Jenkins管理维护运维规范
  • ELK笔记

  • Kubernetes笔记

  • LLM专题

  • 系列专题
  • Jenkins系列文章
二丫讲梵
2018-05-11
目录

Jenkins构建安卓项目配置

文章发布较早,内容可能过时,阅读注意甄别。

# 1,简单介绍。

公司安卓打包都是开发小伙伴每次用自己的 IDE 进行打包,有时候测试需要某个包,还需要找开发去要,两相权衡,都要废掉不少时间。有时候浪费一些时间还好,当你沉浸在自己的思路当中工作时,最烦别人突然打断,这种打断不仅仅是眼前的事情无法继续,更是将充满光芒的思想的慧根给切断了。

为了避免这种情况,我打算利用 Jenkins 来作出打包功能,然后权限开放给测试小伙伴,他们可以自己按需进行打包并下载使用,而不用再依赖于开发人员,简直是测试小伙伴的福音。

# 2,效果展示。

开始正式的配置之前先看一下最终的效果,来刺激一下学习的劲头。

image

利用 Jenkins 的插件直接在项目的构建历史当中显示可以下载的二维码。网上的一般都是打码分享的,我这里放心大胆分享,等会儿再细说可以这么做的原因。

image

而且在邮件通知当中,测试小伙伴也可以直接保存二维码或者点击链接进行下载。

好啦,现在开始吧。

# 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
1
2
3
4
5
6
7
8
9
10
11
12

最后用查看版本号的方式验证安装情况。

image

写教程的时候已经忘掉自己配置 gradle 的时候遇到的一个问题,那就是系统的 glibc 版本过低的问题,这个真的是让人非常难受,前两天在自己服务器配置 mindoc 的时候也是碰到这个问题,意思就是 CentOS 6 版本上用的 glibc 版本只到 2.12,然而很多依赖需要 2.14 的,好了,升级去吧,有够受的,即便是看上去升级可以了,但是又会搞乱系统的编码,现在想起来,当时我在 6 上碰到这个问题了,直接跳过,去到 CentOS 7 上部署了。

有时候,不要死磕,也是一种好的精神。

# 3,配置 sdk。

一个比较不错的下载地址:tools.android-studio.org/index.php/sdk

image

再来一波操作

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
1
2
3
4
5
6
7
8
9

然后通过下边的命令来验证安装的情况

cd android-sdk-linux/tools

./android list sdk --all	#通过这个命令列出所有的sdk版本。
1
2
3

image

./android update sdk -u --all --filter 1,2,3
#再通过这个命令安装需要的sdk版本。其中1,2是对应版本的标签。
1
2

公司这边需要的是 24.0.0 26.0.0 27.0.3 这三个,那么对应的安装就可以了,命令如下:

./android update sdk -u --all --filter 4,11,19
1

其实一开始并不知道该安装的是哪些,只听公司开发说代码里写了一个需要 26 的,一开始也就只是下载了 26 版本的,剩下两个都是在后来的报错中知道需要这个,那么就安装咯。

报错的样子大概如下:

image

当你下载这些之后,会在 build-tools 目录下保存着。

image

ok,基本上服务器这边的环境差不多了,就剩 Jenkins 这边的配置咯。

# 4,web 界面配置

# 1,安装一些插件

  • 必有:
    • build-name-setter #是一个设置构建项目名称的插件。
    • Gradle #这个不说了,gradle 所需插件。
    • Git Parameter #在选择参数化构建的时候使用。
    • Email Extension Plugin #发送邮件使用。
    • description setter plugin #等会儿配置构建历史显示二维码的利器。

# 2,配置全局变量

进入到系统管理–》系统设置–》全局属性–》环境变量

添加两个:

image

::: denger

注意名称不要乱改,因为常规来说都是这么定义的,如果乱改,可能出错。

:::

再添加一下 gradle 的全局变量。

进入到系统管理–》全局工具配置–》添加 gradle

image

这里的 name 可以随便定义,但是下边的路径不要错了。

ok,现在可以开始正式的项目配置了。

# 5,配置项目

# 1,新建一个项目,名字就是 test-android 好了。

# 2,丢弃旧的构建,没啥说的,不让构建历史太长。

image

# 3,参数化构建构成

使用选项参数来进行选择,这里配置了两项,一个是定义包的环境,测试预发与线上,另一个就是 Git 的分支版本号。

image

# 4,源码管理

这没啥说的,配置好地址就行了。

image

# 5,构建环境

image

在构建环境这里可以选择一下 set build name,只是为了让构建历史中看起来好看一些。

#${BUILD_NUMBER}-${ENVIRONMENT}-${BRANCHES}
1

其中的变量也都是根据项目里边配置的变量来定义的。

定义之后显示效果如下:

image

# 6,构建

使用 gradle 命令进行构建。

image

首先是构建这里,选择 gradle 的构建,version 是选择刚才配置好的环境变量。

下边 Tasks 写入编译的命令,其实是一整条,只不过这里分行显示了,可以直接合成一行,只不过每行之间都要空格。

注意这里的变量其实是上边选择参数里边定义的名称,不要弄错了。

# 7,execute shell

image

这里完成了两件事儿,一个是让 apk 在内网环境中可供下载,一个是生成对应的二维码,这个地方需要详细表述一下。

首先,来解答一下开头我说可以不打码放心的放出二维码,是因为这些配置都是在内网当中,外网是无法访问下载的。网上很多教程都是借用一些第三方的平台,诸如蒲公英之类的,但我觉得这种方式太 low,或者说依赖这种第三方很不理想,理想中就是一切靠自己在本地给完成了。偶然的之前在一个地方看到一个大神分享了一个二维码制作的小工具,也正是借助于这个工具,得以让所有的关于二维码的情况得以实现。

QRcode4JAVA

本地生成二维码图片工具

- 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)
1
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;
        }
}
1
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;
        }
}
1
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/
1
2
3
4
5
6
7
8
9

没啥过多好说的,暂时这个地方也比较 low,因为容易出现 apk 被覆盖的问题,毕竟测试人那么多,第一个发好了,正在下载 app,这个过程中又有另外一个人发布给覆盖了,那么第一个人就又要再重新去发布一次才能下载,虽然这种情况基本上不大多,但是在公司测试人员比较多的情况下也会出现,所以暂时先这样,后期丰富一下功能,实现保留 5 个历史 apk 与对照的二维码。

# 8,构建后的操作

image

在构建后操作里添加这个,此处就是定义构建历史显示二维码的地方,此处也踩坑不少,由于不是很懂 html,导致改来改去,也没有效果,最后竟然发现不是 html 写的有问题,而是需要修改一些其他地方的配置。

笔记

这个还是在 Jenkins 群里认识的一个兄弟告诉我的,在此表示感谢,有些人有些事就是说不清楚,在你需要的某个时刻,在你苦苦求索无果的某个时刻,他只用那么一句话,就把你给点醒。

这个时候这里不用动,是 Jenkins 当中默认的填入方框里的是文本格式,所以这里的 html 也就失去效果,一直像我这里显示的样子了:

image

解决办法:

进入系统管理–》全局安全配置–》Markup Formatter

image

原本默认的是纯文本的,现在更改成 html,然后二维码显示就正常了。

但是,注意,这里会带来一个问题,那就是全局全部都变成 html 的了,之前一些配置可能会受影响。

这里举一个受影响的例子:

image

所以这里就要做一个取舍了,看你自己想要哪一个,不想要哪一个了。

# 9,配置发送邮件

image

最后是邮件的配置了,上边第一个箭头是定义的收件人,中间的是格式,下边的是邮件内容。

在下边了:

<!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>
1
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 的代码,知道真相的我,顿时“泪如雨下”。这种感觉就像你做了所有的万全准备了,最后东风没来,气煞我也。

喏,就是如下所示:

image

还有:

image

又能说什么呢。

这里简单说明一下方案与最终的折中办法。

首先怎么在二维码访问站点下保留五个二维码,怎么在 apk 访问站点下保留五个 apk,好像这两个都不是特别难,但是让这两者所保留的五个历史分别进行对应性的可以通过二维码下载到对应的 apk,这个就相当有难度了。

我仔细观察过项目构建之后生成的 apk 名称,也算是有规律,差不多是这样:${ENVIRONMENT}-${BRANCHES}.apk,如果依靠原始的名称来作为可供使用的 apk 下载,如果是只保留一个,显然是可以的,但是如果想要保留五个,那么但从命名这一个方面就是无法定义的,还有就是需要二维码那里的名称与 apk 保持同步以及对应,这事儿或许有多种解决方案,但是就我个人目前所想到的,大概就是这么一种了,很荣幸,就这么一种,被我给想到了。

这种方法就是直接调用系统中的变量${BUILD_NUMBER}作为 apk 的名称,以及二维码的名称,这样,既保证了 apk 与二维码的对应关系,也保证了每次做了新的构建之后三方同步向前更新,,,事实上这个地方的难点也正在于此,因为每次都会进行新的构建,如果不是抓住构建数这个变量,恐怕还真不好控制。

现在保留五个 apk 与五个二维码并且他们是对应关系已经不难,而通过邮件将五个二维码展示出去也实现不了,那就干脆退而求其次,让测试同仁直接通过 Jenkins 的构建历史当中显示的二维码进行下载吧。

最后就是保留五个历史的操作了。参考我的另一篇文章,保留五个文件的办法 (opens new window)。

微信 支付宝
#jenkins#Android
上次更新: 2024/07/04, 22:40:37
Jenkins构建安卓项目之前的一些唠叨
Jenkins与Gitlab分支的交互

← Jenkins构建安卓项目之前的一些唠叨 Jenkins与Gitlab分支的交互→

最近更新
01
睡着的人不关灯
06-12
02
学习周刊-总第215期-2025年第24周
06-12
03
学习周刊-总第214期-2025年第23周
06-05
更多文章>
Theme by Vdoing | Copyright © 2017-2025 | 点击查看十年之约 | 浙ICP备18057030号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式