利用Jenkins完成Android项目打包

ops/2024/9/23 9:37:19/

问题和思路

目前存在的问题

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

解决问题的思路

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

按照以上的思路,那么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.ppmy.cn/ops/39378.html

相关文章

【八】centos7.6安装chrome和chromedriver并启动selenium

学习来源: 安装chrome和chrome driver -----https://blog.csdn.net/zdlcome/article/details/133813441 安装Python11 -----https://blog.csdn.net/weixin_43741408/article/details/130251102 chromedriver下载地址 -----https://googlechromelabs.github.io/chrom…

随身wifi网速测评!讯唐随身wifi和格行随身wifi哪个网速快?随身wifi哪个品牌最好用?

最近收到很多网友私信,希望推荐一款好用性价比高的随身wifi。通过各平台排行榜选出了公认口碑最好的格行随身wifi;又挑选了网友们经常问的的讯唐随身wifi;两个一起来实测一下,哪款更好用! 【品牌评测】 格行随身wifi&…

Activity7框架使用学习记录

用于记录在项目中使用工作流框架 PROC_DEF_ID: 流程定义的id bpmn文件中对流程图定义的id TASK_DEF_KEY:任务定义的id bpmn文件中对每个任务定义的id PROC_INST_ID:流程实例id 启动一个流程时对流程定义的id PROC_DEF_ID(流程定义的ID):在…

关于使用git拉取gitlab仓库的步骤(解决公钥问题和pytho版本和repo版本不对应的问题)

先获取权限,提交ssh-key 虚拟机连接 GitLab并提交代码_gitlab提交mr-CSDN博客 配置完成上诉步骤之后,执行下列指令进行拉去仓库的内容 sudo apt install repo export PATHpwd/.repo/repo:$PATH python3 "实际路径"/repo init -u ssh://gitxx…

专题六_模拟(3)

目录 1419. 数青蛙 解析 题解 1419. 数青蛙 1419. 数青蛙 - 力扣&#xff08;LeetCode&#xff09; 解析 题解 class Solution { public:int minNumberOfFrogs(string croakOfFrogs) {// 44.专题六_模拟_数青蛙_Cstring t "croak";int n t.size();vector<in…

微信小程序跳转微信管理平台配置的客服及意见页面

<button open-type"contact" bindcontact"handleContact" session-from"sessionFrom">帮助与客服</button> 不需要路径 在当前小程序中会自动进入 open-type"contact" 其他参数不用修改 只修改这个参数对应表单组件 /…

【SpringBoot篇】基于Redis分布式锁的 误删问题 和 原子性问题

文章目录 &#x1f354;Redis的分布式锁&#x1f6f8;误删问题&#x1f388;解决方法&#x1f50e;代码实现 &#x1f6f8;原子性问题&#x1f339;Lua脚本 ⭐利用Java代码调用Lua脚本改造分布式锁&#x1f50e;代码实现 &#x1f354;Redis的分布式锁 Redis的分布式锁是通过利…

Language2Pose: Natural Language Grounded Pose Forecasting # 论文阅读

URL https://arxiv.org/pdf/1907.01108 TD;DR 19 年 7 月 cmu 的文章&#xff0c;提出一种基于 natural language 生成 3D 动作序列的方法。通过一个简单的 CNN 模型应该就可以实现 Model & Method 首先定义一下任务&#xff1a; 输入&#xff1a;用户的自然语言&…