利用Jenkins完成Android项目打包

问题和思路

目前存在的问题

打包操作由开发人员完成,这样开发进度容易被打断。

解决问题的思路

将打包操作交测试/产品/开发人员来完成,主要是测试/开发。

按照以上的思路,那么Jenkins+Gradle的解决方案是比较经济的,实现起来难度不大,下面我们详细介绍一下搭建过程。

搭建过程

服务器的准备

  • 普通配置PC一台

  • 安装ubuntu20.04(或者vmware虚拟ubuntu也可以)

  • 可配置上网、关闭防火墙、开启ssh服务

docker安装Jenkins

在ubuntu下安装dokcer。使用下面的命令拉取Jenkins的docker镜像,这里我用的是lts的长期支持版本,你可以到Jenkins官网自由选择其他版本。

sudo docker pull jenkins/jenkins:lts

配置宿主机映射到容器的目录,之后jenkins的一些配置文件都将会存储到该目录下,这个目录可以自己定,但是我建议遵守我这样的规范,便于日后查找和管理。

  1. sudo mkdir /home/jenkins_home # 创建jenkins_home目录

  2. sudo chown zhq:zhq /home/jenkins_home #设置该目录的所有者和所属的组(zhq是常用登录到机器的账号)

ps:zhq是常用登录到机器的账号,这样为了避免一些有关操作权限的问题。

启动Jenkins的docker镜像,并设置相关参数,参数解释:

  • -d 表示以后台模式运行

  • --name 为容器定义一个名字(后面可以代替容器id使用)

  • -p 表示映射容器的端口到宿主机的端口

  • -v 表示映射宿主机的目录到容器的目录

  • -u zhq 使用zhq用户运行,与登录到ubuntu的账号一致,避免后面出现的一些执行权限问题

  • -v /home/jenkins_home:/var/jenkins_home 映射jenkins_home,将数据存储到宿主机,这样配置就不会随容器丢失

  • -v /var/run/docker.sock:/var/run/docker.sock 与 -v /usr/bin/docker:/usr/bin/docker 把宿主机docker 映射到容器内,可以直接在容器内使用宿主机docker

  • -v /usr/lib/x86_64-linux-gnu/libltdl.so.7:/usr/lib/x86_64-linux-gnu/libltdl.so.7 \ 容器内docker运行需要的库文件

  • -v /opt:/opt \ 自主安装的一些运行时软件(如java/maven/git...)

  • -v /etc/timezone:/etc/timezone映射时区文件,保证容器的时区和宿主机相同(官网的Jenkins容器时区不是中国的时区)

最后的jenkins/jenkins:lts是要启动的镜像。

  1. sudo docker run -d --name jenkins -p 8080:8080 -p 50000:50000 -u $(id -u) \

  2. -v /home/jenkins_home:/var/jenkins_home \

  3. -v /var/run/docker.sock:/var/run/docker.sock -v /usr/bin/docker:/usr/bin/docker \

  4. -v /usr/lib/x86_64-linux-gnu/libltdl.so.7:/usr/lib/x86_64-linux-gnu/libltdl.so.7 \

  5. -v /opt:/opt \

  6. -v /etc/timezone:/etc/timezone jenkins/jenkins:lts

ps:可使用以下命令查看container是否运行成功:

  1. $ sudo docker ps

  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

  3. 3c20dfcbb16e jenkins/jenkins:lts "/sbin/tini -- /usr/…" 2 minutes ago Up 2 minutes 0.0.0.0:8080->8080/tcp, 0.0.0.0:50000->50000/tcp jenkins

容器启动后,就可以访问ip:8080看到Jenkins首次运行的首页了,然后通过下面命令查看初始密码,填入之后跳转到安装插件的页面,选择第一个就好,会默认安装一些插件。

sudo cat /home/jenkins_home/secrets/initialAdminPassword

ps: 上面路径与在浏览器中访问Jenkins提示的地址不一样哦,那个是container中的地址,我们要查宿主机中映射的地址,见上面的命令,不要搞错。

插件安装很慢,所以我们要设置的插件的国内镜像url进行提速,具体自行寻找参考文章。

替换完成后,需要执行以下命令,重启容器:

  1. sudo docker ps # 获取container 的id

  2. sudo docker container restart 获取的container_id

再次访问Jenkins页面可以发现插件安装飞快。

创建一个自由风格的项目:

  • 在项目配置中,添加git地址、分支名称

  • 保存退出,回到项目列表,点击右侧的构建按钮

  • 校验代码是否拉取成功

  1. cd /home/jenkins_home/workspace

  2. ls -l

  3. drwxr-xr-x 12 zhq zhq 18 4月 21 16:28 HelloWorld # 如果展示了项目名称,代表拉取代码成功

  • 暂停当前操作,我们先在本地使用Gradle打包,然后再和Jenkins进行结合

Gradle打本地包

下载解压java SDK、Android SDK和gradle。

  1. ~$ mkdir soft

  2. ~$ cd soft

  3. ~$ wget ftp://biguser:www.jb51.net@big.gxkjbg.com:8021/201704/tools/jdk-linux-x64.tar.gz

  4. ~$ wget http://dl.google.com/android/android-sdk_r24.4.1-linux.tgz

  5. ~$ wget https://services.gradle.org/distributions/gradle-5.4.1-all.zip

  6. ~$ tar -zxvf jdk-linux-x64.tar.gz -C /opt/java/

  7. ~$ tar -zxvf android-sdk_r24.4.1-linux.tgz

  8. ~$ unzip gradle-5.4.1-all.zip

配置Java、Android环境变量。

~$ sudo vim /etc/profile

在文件底部添加以下内容:

  1. export JAVA_HOME=/opt/java/jdk1.8.0_131

  2. export PATH=${JAVA_HOME}/bin:${PATH}

  3. export ANDROID_HOME=/home/zhq/soft/android-sdk-linux

保存退出后,导入新的配置:

~$ source /etc/profile

现在来验证一下。以我们当前项目做例子,可执行下面命令:

~$ ./soft/gradle-5.4.1/bin/gradle --parallel -b /home/jenkins_home/workspace/HelloWorld/build.gradle assemble_test

其中:

  • /home/jenkins_home/workspace/是文中Jenkins用来存放项目代码的目录;

  • /HelloWorld/build.gradle我们项目build.gradle所在目录,如果打包其他项目应做响应替换;

  • assemble_test是项目的buildType,一般都会有assembleDebug和assembleRelease,项目不同可能会有其他类型,比如我们用到的assemble_test。

以上操作,有错误产生,和当前所使用的Android SDK没有升级相关版本有关系,由于下载的Android SDK无法启动Android SDK manger,所以我安装了Android Studio,在启动的时候提示指定SDK路径,启动已经下载了的项目,按照提示更新SDK即可。

Android Studio在ubuntu下安装比较容易,在此不做详细说明了。

把Jenkins和Gradle进行结合

把打包命令写成一个脚本test.sh。

  1. #!/bin/bash +x

  2. . /etc/profile

  3. ~/soft/gradle-5.4.1/bin/gradle --parallel -b /home/jenkins_home/workspace/HelloWorld/build.gradle

保存退出后,增加执行权限:

chmod +x test.sh

在Jenkins项目中添加构建shell,把刚才文件的绝对路径添加进去,下面我们就准确掉坑里了。

执行项目构建发现构建失败,提示test.sh没有找到,这是因为Jenkins执行的时候,是在容器中进行的,我们刚才那个路径在容器中不存在,我们需要把宿主机当作一台远程机器ssh到机器上执行脚本:

  • 给Jenkins安装SSH插件

  • 在系统管理-->系统配置中按照填写宿主机ip/端口/凭证(登录账号密码)如下图:

  • 保存退出,重新构建

至此,这台机器已经可以成功打包了。

扫尾工作

安装存放到指定位置。对于上面提到的test.sh可以进行修改,把apk放到指定位置,代码修改如下:

  1. #!/bin/sh +x

  2. . /etc/profile

  3. ~/soft/gradle-5.4.1/bin/gradle --parallel -b /home/jenkins_home/workspace/Hellworld/build.gradle assemble_test

  4. app_path='/home/jenkins_home/workspace/{项目apk存放的位置,根据项目不同进行修改替换}'

  5. target_path='/home/zhq/webroot/apks/' # 此处是自定义存放位置

  6. if [ "`ls -A ${app_path}`" = "" ];

  7. then

  8. echo "${app_path} is empty"

  9. else

  10. mv $app_path/*.apk $target_path

  11. rm -rf $app_path/*

  12. fi

把列表发布到网络,可以通过浏览器访问:

  • 使用docker安装lnmp服务器

  • 映射apk存放目录到nignx服务器

以上内容不是很难,略掉了哈。

行动吧,在路上总比一直观望的要好,未来的你肯定会感 谢现在拼搏的自己!如果想学习提升找不到资料,没人答疑解惑时,请及时加入扣群: 320231853,里面有各种软件测试+开发资料和技术可以一起交流学习哦。

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/7676.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙内核源码分析(互斥锁篇) | 互斥锁比自旋锁丰满多了

内核中哪些地方会用到互斥锁?看图: 图中是内核有关模块对互斥锁初始化,有文件,有内存,用消息队列等等,使用面非常的广.其实在给内核源码加注的过程中,会看到大量的自旋锁和互斥锁,它们的存在有序的保证了内核和应用程序的正常运行.是非常基础和重要的功能. 概述 自旋锁 和…

5.7 线程

进程:解耦稳定,内容之间是不相关的,通信不便利,理论上进程的软硬件的切换时间以及创建开销非常大。--------》资源共享线程实现 线程的问题:本质就是不解耦,一个出问题别的就很有可能出问题,同…

Scanner中next()、nextInt()、nextLine()、hasNext()、hasNextInt()的使用方法及注意事项

目录 1、next()、nextInt()、nextLine()的使用方法及区分 2、循环时如何使用hasNext方法 3、用hasNextInt()作为判断下一个输入是否为数字需要配合next()方法使用 1、next()、nextInt()、nextLine()的使用方法及区分 三者简单定义 next():此方法遇见第一个有效字符…

使用AIGC生成软件类图表

文章目录 如何使用 AI 生成软件类图表什么是 MermaidMermaid 的图片如何保存?mermaid.liveDraw.io Mermaid可以画什么图?流程图时序图 / 序列图类图状态图甘特图实体关系图 / ER图 如何使用 AI 生成软件类图表 ChatGPT 大语言模型不能直接生成各类图表。…

linux系统下产生Segmentation fault 与 Segmentation fault (core dumped)!!!

最近在学习的过程中,遇到了Segment fault(段错误)的问题,经过一番查找资料,学到了一些相关知识,这里做一个梳理,以防以后在遇到类似的问题,并且希望能够帮助到大家一丝丝&#xff01…

python中numpy库使用

array数组 生成array数组 将list转化为array数组 import numpy as np np.array([1,2],typenp.int32)其中dtype定义的是元素类型,np.int32指32位的整形 如果直接定义dtypeint 默认的是32位整形。 zeors和ones方法 zeros()方法,该方法和ones()类似&a…

有什么方便实用的成人口语外教软件?6个软件教你快速进行口语练习

有什么方便实用的成人口语外教软件?6个软件教你快速进行口语练习 口语能力在语言学习中占据着重要的位置,因为它直接关系到我们与他人进行交流和沟通的效果。为了提高口语能力,很多成人选择通过外教软件进行口语练习,这些软件提供…

GNU Radio FFT模块结合stream to vector应用及Rotator频偏模块使用

文章目录 前言一、FFT 模块应用1、stream to vector 介绍2、创建 grc 图测试3、运行结果 二、频偏模块1、Rotator 简介2、创建 grc 图测试3、运行结果 前言 写个博客记录一下自己的蠢劲儿,之前我想用 FFT 模块做一些信号分析的东西,官方的 FFT 模块必须…

营销5.0时代,企业的痛如何解?

进入营销5.0阶段之后,许多企业都需解决连接客户效能低下的问题。针对这个问题,产品经理、软件开发公司包括个人开发者,要怎么找到有效的“解药”? 营销不仅每年都在变化,甚至每天都在变化。 ——现代营销学之父&…

【再探】设计模式—适配器、装饰及外观模式

结构型设计模式是用于设计对象和类之间关系的一组设计模式。一共有7种:适配器模式、装饰器模式、外观模式、桥接模式、组合模式、享元模式及代理模式。 1 适配器模式 需求:在软件维护阶段,已存在的方法与目标接口不匹配,需要个中…

论文阅读:RHO-1:Not All Tokens Are What You Need 选择你需要的 Tokens 参与训练

论文链接:https://arxiv.org/abs/2404.07965 以往的语言模型预训练方法对所有训练 token 统一采用 next-token 预测损失。作者认为“并非语料库中的所有 token 对语言模型训练都同样重要”,这是对这一规范的挑战。作者的初步分析深入研究了语言模型的 t…

记录一个练手的js逆向password

很明显 请求加密了password 全局搜索 有个加密函数(搜不到的可以搜临近的其他的关键字 或者url参数) 搜索的时候一定要仔细分析 我就没有仔细分析 我搞了好久 又是xhr又是hook的(还没hook到) 我当时也是疏忽了 我寻思这个也不是js文件 直到后来 我怎么也找不到 我就猜想 不…

代码随想录算法训练营DAY44|C++动态规划Part6|完全背包理论基础、518.零钱兑换II、377. 组合总和 Ⅳ

文章目录 完全背包理论基础完全背包问题的定义与01背包的核心区别为什么完全背包的循环顺序可以互换?CPP代码 ⭐️518.零钱兑换II思路CPP代码 ⭐️377. 组合总和 Ⅳ思路CPP代码 扩展题 完全背包理论基础 卡码网第52题 文章链接:完全背包理论基础 视频链接…

【数据结构与算法】力扣 102. 二叉树的层序遍历

题目描述 给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。 示例 1: 输入: root [3,9,20,null,null,15,7] 输出: [[3],[9,20],[15,7]]示例 2&#x…

上证50etf期权到底该怎么玩?

今天期权懂带你了解上证50etf期权到底该怎么玩?ETF期权是一种股票市场上的金融衍生品,它是在交易所上市交易的期权合约,其标的资产是某个特定的交易所交易基金(ETF),如上证50指数ETF或沪深300指数ETF等。 上…

Git命令Gitee注册idea操作git超详细

文章目录 概述相关概念下载和安装常见命令远程仓库介绍与码云注册创建介绍码云注册远程仓库操作关联拉取推送克隆 在idea中使用git集成add和commit差异化比较&查看提交记录版本回退及撤销与远程仓库关联 push从远程仓库上拉取,克隆项目到本地创建分支切换分支将…

(✌)粤嵌—2024/5/7—除自身以外数组的乘积

代码实现&#xff1a; /*** Note: The returned array must be malloced, assume caller calls free().*/ int* productExceptSelf(int *nums, int numsSize, int *returnSize) {// 左乘积int l[numsSize];l[0] 1;for (int i 1; i < numsSize; i) {l[i] l[i - 1] * nums[…

Cesium学习——渲染、加载GeoJSON、调整位置

渲染概述 作者&#xff1a;当时明月在曾照彩云归 出处&#xff1a;https://www.cnblogs.com/jiujiubashiyi/p/17124717.html 1. 引言 Cesium是一款三维地球和地图可视化开源JavaScript库&#xff0c;使用WebGL来进行硬件加速图形&#xff0c;使用时不需要任何插件支持&#xf…

以中国为目标的DinodasRAT Linux后门攻击场景复现

概述 在上一篇《以中国为目标的DinodasRAT Linux后门剖析及通信解密尝试》文章中&#xff0c;笔者对DinodasRAT Linux后门的功能及通信数据包进行了简单剖析&#xff0c;实现了对DinodasRAT Linux后门心跳数据包的解密尝试。 虽然目前可对DinodasRAT Linux后门的通信数据包进…

SecretFlow学习指南(3)框架拆解和使用

“隐语”架构设计全貌 1.隐语框架设计思想 隐私计算是一个新兴的跨学科领域&#xff0c;涉及密码学、机器学习、数据库、硬件等多个领域。根据过去几年的实践经验&#xff0c;我们发现 ●隐私计算技术方向多样&#xff0c;不同场景下有其各自更为合适的技术解决方案 ●隐私计算…