利用Jenkins完成Android项目打包

news2024/11/25 7:21:07

问题和思路

目前存在的问题

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

解决问题的思路

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

按照以上的思路,那么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.coloradmin.cn/o/1651413.html

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

相关文章

[Kotlin]创建一个私有包并使用

1.创建Kotlin项目 创建项目: 在Android Studio或其他IDE中选择“Create New Project”。选择Kotlin和Gradle作为项目类型和构建系统。指定项目名称和位置,完成设置。 添加依赖: 如果你的库需要额外的依赖,可以在 build.gradle (Module: app…

PostgreSQL自带的命令行工具13- pg_waldump

PostgreSQL自带的命令行工具13- pg_waldump 基础信息 OS版本:Red Hat Enterprise Linux Server release 7.9 (Maipo) DB版本:16.2 pg软件目录:/home/pg16/soft pg数据目录:/home/pg16/data 端口:5777pg_waldump 是 Po…

扩展van Emde Boas树以支持卫星数据:设计与实现

扩展van Emde Boas树以支持卫星数据:设计与实现 1. 引言2. vEB树的基本概念3. 支持卫星数据的vEB树设计3.1 数据结构的扩展3.2 操作的修改3.3 卫星数据的存储和检索 4. 详细设计和实现4.1 定义卫星数据结构体4.2 修改vEB树节点结构4.3 插入操作的伪代码4.4 C语言实现…

STM32学习笔记--疑问篇

STM32学习笔记–疑问篇 GPIO是什么的缩写通用寄存器的缩写和全程 3.、这是什么的缩写 不同输出模式之间的差异 PB是GPIOB的缩写? 怎样知道端口应该设置成输入模式还是设置成输出模式

Mybatis的简介和下载安装

什么是 MyBatis ? MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的…

mysql workbench如何导出insert语句?

进行导出设置 导出的sql文件 CREATE DATABASE IF NOT EXISTS jeesite /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci */ /*!80016 DEFAULT ENCRYPTIONN */; USE jeesite; -- MySQL dump 10.13 Distrib 8.0.28, for Win64 (x86_64) -- -- Host: 127.0…

MCU通过UART/SPI等接口更新flash的方法

MCU可提供一种方便的方式来更新flash内容以进行错误修复bugfix或产品更新update。可以使用以下任何模式更新flash内容: •系统内编程(ISP,In-System Programming):用于使用内部bootloader程序和UART/SPI对片上闪存进行编程program或重新编程reprogram。 •应用程序内编程…

vector介绍与使用【C++】

C vector 前言一、vector的介绍c文档介绍简介 二、vector的定义和使用vector的定义vector代码演示 vector的使用vector iterator 的使用vector 空间增长问题vector 增删查改vector 迭代器失效问题引起底层空间改变eraseg与vs检测比较string迭代器失效 vector 在OJ中的使用只出现…

Cisco NX-OS System Software - ACI 16.0(5h)

Cisco NX-OS System Software - ACI 16.0(5h) 适用于 ACI 模式下的 Cisco Nexus 9000 系列交换机 请访问原文链接:Cisco NX-OS System Software - ACI 16.0(5h),查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org Cis…

AI预警未来:山体滑坡与塌方事故的潜在发现者

在科技日新月异的今天,人工智能(AI)的应用已经渗透到了我们生活的各个领域。而在防灾减灾的领域中,AI技术的引入无疑为我们打开了一扇新的大门。以梅大高速大埔往福建方向K11900m附近发生的路面塌方灾害为例,我们不禁思…

DockerUI安装使用

DockerUI安装使用 主机环境 [roottest01 ~]# uname -a Linux test01 3.10.0-862.el7.x86_64 #1 SMP Fri Apr 20 16:44:24 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux [roottest01 ~]# cat /etc/redhat-release CentOS Linux release 7.5.1804 (Core)安装 [roottest01 ~]# doc…

第12章 软件测试基础(第三部分)测试类型、测试工具

七、测试类型(按工程阶段划分) 单集系确收 (一)单元测试 1、单元测试/模块测试 单元就是软件中最小单位(或模块)。可以是一个函数、一个过程、一个类。主要依据是模块的详细设计文档。价值在于尽早发现…

MacOS快速安装FFmpeg,并使用FFmpeg转换视频

前言:目前正在接入flv视频流,但是没有一个合适的flv视频流地址。网上提供的flv也都不是H264AAC(一种视频和音频编解码器组合),所以想通过fmpeg来将flv文件转换为H264AAC。 一、MacOS环境 博主的MacOS环境(…

如何永久删除服务和相关文件夹

如何永久删除服务和文件夹? How can I remove the service and folder permanently? 以AlibabaProtect服务为例 takeown /f "C:\Program Files (x86)\AlibabaProtect sc delete AlibabaProtect我运行了上述操作,并通过任务管理器杀死了“阿里巴巴…

FFmpeg 音视频处理工具三剑客(ffmpeg、ffprobe、ffplay)

【导读】FFmpeg 是一个完整的跨平台音视频解决方案,它可以用于音频和视频的转码、转封装、转推流、录制、流化处理等应用场景。FFmpeg 在音视频领域享有盛誉,号称音视频界的瑞士军刀。同时,FFmpeg 有三大利器是我们应该清楚的,它们…

市场营销的酒店营销策略研究意义

在市场经济条件下,市场营销策略已成为企业经营管理中最重要的组成部分,其在企业管理中的地位日益显现出来。 然而,由于酒店营销环境的特殊性,酒店营销策略研究一直是咱们从业者研究的热点之一。 对于酒店营销策略的研究&#xf…

云计算技术发展趋势详解

云计算最全详解(图文全面总结) 云计算是技术趋势的未来,掌握它至关重要。从基础到高级,本文深入探讨云计算的方方面面,为您提供全面的理解。 云计算 云计算将计算转移到远程数据中心,让用户灵活、经济地访问资源。就像水电一样&…

【数据结构】闲谈A股实时交易的数据结构-队列

今天有点忙,特意早起,要不先写点什么。看到个股的红红绿绿, 突然兴起,要不写篇文章分析下A股交易的简易版数据结构。 在A股实时股票交易系统中,按照个人理解,大致会用队列来完成整个交易。队列(…

PyQt 入门

Qt hello - 专注于Qt的技术分享平台 Python体系下GUI框架也多了去了,PyQt算是比较受欢迎的一个。如果对Qt框架熟悉,那掌握这套框架是很简单的。 一,安装 1.PyQt5 pip3 install PyQt5 2.Designer UI工具 pip3 install PyQt5-tools 3.UI…

上位机图像处理和嵌入式模块部署(树莓派4b安装dockerros)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 前面我们讨论过树莓派4b安装ros的问题,当时的解决方案就是利用docker来安装ros。我们都知道,每一个ros版本都是和特定的ubu…