Docker中布置Jenkins实现Android项目的自动化构建

        因项目需要,要在服务器上使用Jenkins完成Android项目的自动化构建,但服务器上登录的账户没有管理员权限,无法用sudo命令,因此需要把相应环境布置在docker中。

环境搭建

docker容器相关命令

创建容器

docker create -it containerName

containerName自己定义,参数说明:i: 交互式操作 t: 操作终端

运行容器

docker start containerName

进入容器(已有运行的容器的情况下)

docker exec -it containerName sh

查看正在运行的容器

docker ps

docker容器保存为镜像

docker commit -m "My message" my_container my_image:v1.0

启动镜像容器,并给启动的容器命名“mycontainer”

docker run -it --name mycontainer myimage

小技巧:docker命令不会用,可以使用 docker 命令名 --help查看如何写命令,eg:

docker exec --help

安装jenkins及所需环境

下载jenkins,这里下载的是2.455版本

apt install curl
curl -L0 https://mirrors.aliyun.com/jenkins/debian/jenkins_2.455_all.deb --output jenkins_2.455_all.deb

安装jenkins所需依赖,主要是java运行环境

apt install openjdk-17-jre-headless
apt install maven
apt install net-tools

安装并启动jenkins

dpkg -i jenkins_2.455_all.deb

安装Android编译环境

安装gradle:

如果gradle版本在4.4.1以下,直接用apt命令就可以

apt install gradle

如果要求更高的gradle版本,则需要下载-解压-设置环境变量

curl -L https://github.com/gradle/gradle-distributions/releases/download/v8.2.0/gradle-8.2-all.zip --output gradle-8.2-all.zip
mkdir /opt/gradle 
unzip -d /opt/gradle gradle8.7all.zip

这里用的8.2.0,其它版本可以在android官网找下载地址;解压后需要设环境变量,并将gradle路径加到最后面(见添加环境变量):export PATH=$PATH:/opt/gradle/gradle-8.2/bin

安装命令行工具

1)下载命令行工具并解压,下载地址从android官网找

curl -L https://googledownloads.cn/android/repository/commandlinetools-linux-11076708_latest.zip --output commandlinetools-linux.zip
unzip /tmp/commandlinetools-linux-<version>.zip -d /opt/android-sdk

解压完需添加到环境变量:export PATH=/android/cmdline-tools/latest/bin:$PATH

2)用sdkmanager下载需要的工具包

查看可用的工具包列表

sdkmanager --list

部分可用的工具包

下载需要的工具包

sdkmanager "具体文件名,带版本号"

需要下载的工具包包括 build-toolscmdline-toolscmakendk

其它需要安装的

包括git,vim等,直接使用 apt install命令安装即可

添加环境变量

1)打开profile文件

vim /etc/profile

2)按“i”键进入编辑模式,在文件末尾添加 export PATH=xxx:$PATH,按esc,再按:wq 退出并保存文本
3)使更改生效

source /etc/profile (或者 . /etc/profile)

Jenkins配置

jenkins启动与关闭

关闭jenkins

service jenkins stop

重启jenkins

service jenkins restart

初始化

jenkins默认8080端口,在浏览器中输入ip:8080,开始进行jenkins初始化,在页面提示的路径中找到密码填入,完成初始化;创建用户名和密码,用于登录。

插件初始化安装:初始化时建议安装所有推荐的插件,系统管理-插件管理,可以看安装的插件

系统配置

系统管理-系统配置--全局属性,可以设置自定义的环境变量,包括android路径和gradle路径

新建任务

在主页中,点击左边菜单的“新建任务”进入新建任务页面,建议选择流水线。

点击确定进入下一步,进入设置页。

配置流水线脚本并保存,然后点击左侧菜单“立即构建”开始打包。

流水线脚本

最外层是pipeline{},里面填写构建流程,可以参考左侧菜单中的“流水线语法”

例如,在示例步骤选择“git:Git”选项,配置仓库URL、分支名,添加凭据(用户名及密码),点击“生成流水线脚本”按钮,在下方文本框中会生成相应的脚本

也可参考 

史上最全 Jenkins Pipeline流水线详解

pipeline脚本示例

pipeline{agent anystages{stage("check-branch"){//从git下拉代码steps{git branch: 'develop', credentialsId: '8abcd0123-ffff-fffd-9fff-ffffffffffee', url: 'http://gitlab.xxx.com/TestProject'}}stage("build"){steps{// 使用 sh 步骤在 shell 中执行 Gradle 命令sh 'chmod +x ./gradlew'sh './gradlew assembleRelease'sh "sudo nsenter -m -u -i -n -p -t 1 sh -c 'docker cp dde250865b41:/var/lib/jenkins/workspace/TestProject/app/build/outputs/apk/release/app-release.apk /home/aaa/share/xxx/test.apk'"}}}
}

分为三个步骤:下拉代码、编译、复制编译好的文件到指定路径

遇到的问题及解决方案

1)无权限执行gradlew命令

解决方案:在执行前添加执行权限

sh 'chmod +x ./gradlew'

2)在docker容器中将生成的apk复制出来

参考Docker容器内执行宿主机指令。在docker容器中无法直接执行“docker cp”命令,需要使用nsenter命令执行宿主机命令:

2.1)启动镜像容器时加参数 --pid=host --privileged=true

docker run -itd --pid=host --privileged=true -p 8088:8080 android-compiler:v1.0

“-p 8088:8080”将容器中的8080端口映射到宿主机的8088端口

2.2)调用宿主机命令

sh "sudo nsenter -m -u -i -n -p -t 1 sh -c 'docker cp dde250865b41:/var/lib/jenkins/workspace/TestProject/app/build/outputs/apk/release/app-release.apk /home/aaa/share/xxx/test.apk'"

2.3)无权限复制问题:

实测发现在pipeline脚本中执行无权限,需要在前面加上sudo;docker容器中默认是没有“sudo”的,需要先安装,然后配置sudo无需密码:visudo(编辑sudoers文件),在文件中添加 jenkins ALL=(ALL) NOPASSWD:ALL,参考添加环境变量的操作。

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

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

相关文章

【Python】解决Python报错:AttributeError: ‘function‘ object has no attribute ‘xxx‘

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

未来已来, AI将作为超级工具?

人工智能时代已来 1.AI将作为超级工具&#xff1a;AI是推动全产业数字化转型的高效工具&#xff0c;机遇比互联网时代大10倍&#xff0c;但只有1/3的机会留给初创企业。 2.硅谷AI市场分类中&#xff0c;特别看好开源平台&#xff0c;其将为初创企业和大企业提供更多选择。 3.…

C# 字节数组(byte[])拼接的性能对比测试

将C#中的三种字节数组拼接方式的性能做了一个对比测试&#xff0c;DEMO程序代码如下&#xff1a; using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks;namespace Byte数组拼接测…

使用 DuckDuckGo API 实现多种搜索功能

在日常生活中&#xff0c;我经常使用搜索引擎来查找信息&#xff0c;如谷歌和百度。然而&#xff0c;当我想通过 API 来实现这一功能时&#xff0c;会发现这些搜索引擎并没有提供足够的免费 API 服务。如果有这样的免费 API, 就能定时获取“关注实体”的相关内容&#xff0c;并…

Gbase 国产数据库

参考&#xff1a;参考&#xff1a; 5分钟学会Linux环境GBase 8t安装和部署 - 光洋山 - twt企业IT交流平台 (talkwithtrend.com)https://www.talkwithtrend.com/Article/197237 视频 GBase 8s快速入门-功能简介与演示-大数据教程-腾讯课堂 (qq.com)https://ke.qq.com/course/…

ADB日常使用命令

【ADB全称 Android Debug Bridge】 是Android SDK中的一个命令行工具adb命令可以直接操作管理Android模拟器或真实的Android设备&#xff08;手机&#xff09; 建立PC和模拟器连接 # 建立连接 adb connect 127.0.1: 模拟器端口号〈逍遥模拟器21503〉 # 验证是否连接成功 adb d…

整数乘除法练习题

#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<time.h> #include<Windows.h>void show1(); .//开始界面 int getchoice(); //选择界面 int dowork(int n); //随机做乘除法 int num(); //用户确定做题的数量 v…

OrangePi AIpro 变身 Android 打包机

主板基本信息介绍 OrangePi AIpro&#xff0c;是香橙派联合华为精心打造&#xff0c;建设人工智能新生态而设计的一款开发板&#xff0c;这次为大家分享下我上手的这款 OrangePi AIpro 8GB&#xff08;算力达8TOPS&#xff09; 的一些小小的经验。 基本参数如下&#xff1a; …

首创十八道工艺,口味王引领槟榔产业高质量发展

说到槟榔&#xff0c;相信大伙都不会陌生&#xff0c;槟榔的历史可以追溯到汉代&#xff0c;不少文献有过记载&#xff0c;如汉代的沈约著的《咏竹槟榔盘》中提到“荐羞虽百品&#xff0c;所贵浮天实”&#xff1b;唐朝“诗仙”李白更是写道“何时黄金盘&#xff0c;一斛荐槟榔…

分享 ASP.NET Core Web Api 中间件获取 Request Body 两个方法

不废话&#xff0c;直接上正文。_ 方法一 思路&#xff1a;利用 BodyReader 直接读取 HttpContext 的 Request Body&#xff0c;再反序列化 var reqStream context.Request.BodyReader.AsStream(); var jsonObj JsonSerializer.Deserialize<CheckAndParsingMiddlewareM…

buuctf的RSA(五)

[RoarCTF2019]RSA 一看到题目&#xff0c;我就有些蒙了&#xff0c;A是代表了什么&#xff0c; 先来分解n 接下来可以暴力破解e了&#xff0c;因为e没有给出来&#xff0c;应该不会太大&#xff0c;猜测是四位数字 import gmpy2 import libnum from Crypto.Util.number import…

网卡配置基础知识

1、网络设置方式 首先科普下Virtual Box虚拟机的几种主流的网络设置方式&#xff0c;官方文档&#xff1a; 2解释 Host-only&#xff1a;仅主机模式 虚拟机和宿主机、虚拟机之间能互通&#xff0c;但是不能访问外网&#xff0c;虚拟机和宿主机同网段的其他主机不能互通这种…

数据结构---栈队列

栈和队列是我们数据结构中经常使用的数据结构&#xff0c;所以现在来了解一下栈和队列。 栈 特点&#xff1a; 栈是一种特殊的线性表&#xff0c;其中进行数据插入和弹出的部分叫做栈顶&#xff0c;另一端叫做栈底。 只允许数据从栈顶压入&#xff0c;从栈顶弹出即先进后出的…

最佳实践:REST API 的 HTTP 请求参数

HTTP 请求中的请求参数解释 当客户端发起 HTTP 请求 时&#xff0c;它们可以在 URL 末尾添加请求参数&#xff08;也叫查询参数或 URL 参数&#xff09;来传递数据。这些参数以键值对的形式出现在 URL 中&#xff0c;方便浏览和操作。 请求参数示例 以下是一些带有请求参数的…

JS-Lodash工具库

文档&#xff1a;Lodash Documentation orderBy函数&#xff1a;根据条件进行排序 注&#xff1a;第一个是要排序的数组&#xff0c;第二个是根据什么字段进行排序&#xff0c;第三个是排序的方式&#xff08;desc倒序&#xff09; 安装方式&#xff1a;Lodash npm i lodash…

小型企业网络组网与配置仿真实验

实验要求如下: 我这里以学号46为例 一、IP 地址规划表 &#xff08;一&#xff09;主类网络 &#xff08;二&#xff09;子网划分 需要自己计算有效ip范围 在C类主网络192.168.46.0/24中&#xff0c;我们需要先了解这个网络的子网掩码为255.255.255.0&#xff0c;其二进制…

『ZJUBCA MeetUP』 5月25日线下活动——Aptos 链的动态与应用

2024 求是创新 ZJUBCA Sponsored by the ALCOVE Community TIME&#xff1a;2024/05/25 ADD&#xff1a;浙江大学紫金港校区 --- Alcove 是 Aptos 公链与 Alibaba Cloud 共同打造的亚洲首个 Move 开发者社区&#xff0c;致力于支持开发者使用 Move 语言构建下一代 Web3 应用&am…

TPM之VMK密封

本篇文章主要介绍基于TPM的Bitlocker全盘加密时&#xff0c;VMK密钥的密封&#xff08;Seal&#xff09;流程&#xff0c;至于TPM、Bitlocker、密钥保护器、VMK密钥等这些东西是什么&#xff0c;这里不做解释&#xff0c;需要自己脑补一下&#xff08;╮(╯▽╰)╭&#xff09;…

2024年大屏幕互动源码+动态背景图和配乐素材+搭建教程

2024年大屏幕互动源码动态背景图和配乐素材搭建教程 php宝塔搭建部署活动现场大屏幕互动系统php源码 运行环境&#xff1a;PHPMYSQL 下载源码地址&#xff1a;极速云

数据库设计:实体关系图

一个良好的设计对于数据库系统至关重要&#xff0c;它可以减少数据冗余&#xff0c;确保数据的一致性和完整性&#xff0c;同时使得数据库易于维护和扩展。 实体关系图&#xff08;Entity-Relationship Diagram、ERD&#xff09;是一种用于数据库设计的结构图&#xff0c;它描…