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 any
    stages{
        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,参考添加环境变量的操作。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

跨境物流系统选择标准:能充分试用,合作灵活的才是好系统

对国际物流商而言&#xff0c;大家都知道跨境物流系统对业务优化有多重要。但是想选择一套适合自己的跨境物流系统却并不是一件简单的事情。 最主要的原因就是现在市场上的国际物流系统确实太多了。不同的功能设计&#xff0c;定价设计&#xff0c;让物流商非常头疼&#xff0…

基于Lumerical fdtd进行无序光子晶体波导的仿真设计及优化

光子晶体是一类通过不同折射率介质周期性的排列而形成的具有光波长量级的周期性人工微型结构&#xff0c;相比于传统晶体来说&#xff0c;由于介电函数的周期性分布&#xff0c;光子晶体也会产生一些类似于传统晶体的带隙&#xff0c;使光局域在带隙中无法传播。我们在完整的光…

JavaScript解构赋值

一、数组解构 以上要么不好记忆&#xff0c;要么书写麻烦&#xff0c;此时可以使用解构赋值的方法让代码更简洁。 数组解构是将数组的单元值快速批量赋值给一系列变量的简洁语法。 基本语法&#xff1a; 1、赋值运算符左侧的[]用于批量声明变量&#xff0c;右侧数组的单元值将…

轻量级动态可监控线程池 - DynamicTp

一、背景介绍 使用线程池ThreadPoolExecutor的过程中你是否有以下痛点呢&#xff1f; 代码中创建了一个 ThreadPoolExecutor&#xff0c;但是不知道那几个核心参数设置多少比较合适凭经验设置参数值&#xff0c;上线后发现需要调整&#xff0c;改代码重新发布服务&#xff0c…

关于ida如何进行远程linux调试(详解)

首先我们需要安装工具软件VMware虚拟机和finalshell&#xff0c;并在虚拟机中安装centos 7系统&#xff0c;还要将finalshell连接到该系统中&#xff0c;具体操作可以去b站搜黑马Linux学习&#xff0c;学完该课程的p5&#xff0c;p6&#xff0c;p8即可&#xff0c;我接下来讲的…

api网关kong对高频的慢接口进行熔断

一、背景 在生产环境&#xff0c;后端服务的接口响应非常慢&#xff0c;是因为数据库未创建索引导致。 如果QPS低的时候&#xff0c;因为后端服务有6个高配置的节点&#xff0c;虽然接口慢&#xff0c;还未影响到服务的正常运行。 但是&#xff0c;当QPS很高的时候&#xff0c…

顶级手机数据恢复软件 [2024 更新]

什么是最好的手机数据恢复软件&#xff1f;在这篇文章中&#xff0c;您将免费了解 6 款最佳手机数据恢复软件&#xff0c;并了解有关如何恢复数据的完整指南。 什么是最好的手机数据恢复软件&#xff1f; 手机数据恢复软件是从智能手机中检索丢失或删除的文件&#xff0c;消息…

(自适应手机端)响应式服装服饰外贸企业网站模板

(自适应手机端)响应式服装服饰外贸企业网站模板PbootCMS内核开发的网站模板&#xff0c;该模板适用于服装服饰网站、外贸网站等企业&#xff0c;当然其他行业也可以做&#xff0c;只需要把文字图片换成其他行业的即可&#xff1b;自适应手机端&#xff0c;同一个后台&#xff0…

Linux 深入讲解自动化构建工具

各位大佬好 &#xff0c;这里是阿川的博客 &#xff0c; 祝您变得更强 个人主页&#xff1a;在线OJ的阿川 大佬的支持和鼓励&#xff0c;将是我成长路上最大的动力 阿川水平有限&#xff0c;如有错误&#xff0c;欢迎大佬指正 Linux一系列的文章&#xff08;质量分均在93分…

Netty中半包粘包的产生与处理:短连接、固定长度、固定分隔符、预设长度;redis、http协议举例;网络数据的发送和接收过程

目录 粘包、半包 相关概念 网络数据发送和接收过程 Netty半包粘包解决方案 ByteBuf获取和默认大小 短链接 固定长度 固定分隔符 预设长度 常见协议代码举例 redis协议 http协议 参考链接 粘包、半包 相关概念 程序处理过程中我们会通过缓冲区接收数据&#xff0c…

BearPi-HM Nano开发笔记

小熊派 简单介绍 BearPi-HM Nano开发板是一块专门为鸿蒙OS设计的HarmonyOS开发板&#xff0c;板载高度集成的2.4GHz WLAN SoC芯片Hi3861&#xff0c;并板载NFC电路及标准的E53接口可拓展 E53接口 介绍 E53接口标准为“物联网俱乐部”联合国内多家开发板厂家制定的物联网案…

QT天气预报项目(写在简历上)

一、ui设计 实现功能:可以搜索不同的城市进行天气的查询,并且显示未来7天内的天气,并绘制出当天的最高气温和最低气温曲线图。 学到的知识: stylesheet界面美化 Json数据解析 HTTP通信get请求 使用事件过滤器绘制温度曲线 多控件处理(利用数组) 代码整合调试能力 二…

Debian和ubuntu 嵌入式的系统的 区别

随着开源操作系统的日益流行&#xff0c;Debian和Ubuntu这两个基于Linux的发行版本成为了众多开发者和系统管理员的首选。它们各自拥有独特的优势和特点&#xff0c;那么&#xff0c;在选择时&#xff0c;哪一个更适合你呢&#xff1f;接下来&#xff0c;我们将深入探讨两者的关…

软件设计不是CRUD(21):在流式数据处理系统中进行业务抽象落地——需求分析

本文主要介绍如何在数据处理系统中应用业务抽象的设计思想。目前业界流行的数据处理方式是流式处理&#xff0c;主流的流式处理引擎有Apache Spark&#xff0c;Apache Flink等等。本文选择Apache Flink作为实战案例的落地。由于本文主要是讲解设计思想和流式处理引擎相结合的方…

ETLCloud中如何使用Kettle组件

ETLCloud中如何使用Kettle组件在当今数据驱动的时代&#xff0c;数据处理和分析已成为企业决策的关键。为了更高效地处理海量数据&#xff0c;ETL&#xff08;Extract, Transform, Load&#xff09;工具变得至关重要。而在众多ETL工具中&#xff0c;Kettle作为一款开源、灵活且…

深入分析 Android Service (五)

文章目录 深入分析 Android Service (五)1. 深入分析 Service 与 Activity 之间的通信2. Messenger 的内部工作原理2.1 服务端实现2.2 客户端实现 3. AIDL 的内部工作原理3.1 定义 AIDL 接口3.2 服务端实现3.3 客户端实现 4. Service 的优化建议和最佳实践4.1 异步操作4.2 资源…

基于STM32的轻量级Web服务器设计

文章目录 一、前言1.1 开发背景1.2 实现的功能1.3 硬件模块组成1.4 ENC28J60网卡介绍1.5 UIP协议栈【1】目标与特点【2】核心组件【3】应用与优势 1.6 添加UIP协议栈实现创建WEB服务器步骤1.7 ENC28J60添加UIP协议栈实现创建WEB客户端1.8 ENC28J60移植UIP协议并编写服务器测试示…

关于亚马逊、速卖通、虾皮、Lazada等平台自养号测评IP的重要性

在自养号测评中&#xff0c;IP的纯净度是一个至关重要的问题&#xff0c;它直接关系到账号的安全性和稳定性如果使用了被平台识别为异常或存在风险的IP地址&#xff0c;那么账号可能会面临被封禁的风险。这将对账号的正常使用和测评过程中造成严重影响。而使用纯净的IP地址&…

用万界星空科技低代码平台能快速搭建一个云MES系统

一、低代码平台与MES:智能制造的新篇章 随着工业4.0和智能制造的兴起&#xff0c;企业对于生产过程的数字化、智能化需求日益迫切。传统的MES系统实施周期长、成本高&#xff0c;成为许多企业数字化转型的瓶颈。而低代码开发平台的出现为这一问题提供了新的解决思路。 二、万界…

数据库(12)——DQL聚合查询

常见的聚合函数 将一列数据作为一个整体&#xff0c;进行纵向计算。 函数功能count统计数量max最大值min最小值avg平均值sum求和 语法 SELECT 聚合函数 &#xff08;字段列表&#xff09;FROM 表名; 示例 这是我们的原始表&#xff1a; 求人物总数 select count(id) from in…