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

news2024/11/15 2:07:05

        因项目需要,要在服务器上使用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,参考添加环境变量的操作。

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

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

相关文章

Android Handler机制使用及全面解析

前言 我是真的不想写这篇总结&#xff0c;说实话&#xff0c;关于Handler&#xff0c;全面且优秀的文章多的很。 但是这东西吧&#xff0c;还是想以自己的方式再去细看一下它的原理&#xff0c;实现源码&#xff0c;它的各种机制&#xff0c;在App中使用到的地方。 这样或许…

【深度揭秘GPT-4o】:全面解析新一代AI技术的突破与优势

目录 ​编辑 1.版本对比&#xff1a;从GPT-3到GPT-4&#xff0c;再到GPT-4o的飞跃 1.1 模型规模的扩展 1.2 训练数据的更新 1.3 算法优化与效率提升 1.4 案例分析 2.技术能力&#xff1a;GPT-4o的核心优势 2.1 卓越的自然语言理解 2.1.1 上下文理解能力 2.1.2 语义分…

地质灾害位移应急监测站

地质灾害位移应急监测站是一种专门用于地质灾害预警和应急响应的设施&#xff0c;它能够实时监测和分析山体、建筑物、管道等的位移变化情况。以下是关于地质灾害位移应急监测站的详细介绍&#xff1a; 主要组成部分 传感器&#xff1a;安装于需要监测的位置&#xff0c;用于…

chap4 simple neural network

全连接神经网络 问题描述 利用numpy和pytorch搭建全连接神经网络。使用numpy实现此练习需要自己手动求导&#xff0c;而pytorch具有自动求导机制。 我们首先先手动算一下反向传播的过程&#xff0c;使用的模型和初始化权重、偏差和训练用的输入和输出值如下&#xff1a; 我…

鹤城杯 2021 流量分析

看分组也知道考http流量 是布尔盲注 过滤器筛选http流量 将流量包过滤分离 http tshark -r timu.pcapng -Y "http" -T json > 1.json这个时候取 http.request.uri 进一步分离 http.request.uri字段是我们需要的数据 tshark -r timu.pcapng -Y "http&quo…

MFC 模态对话框的实现原理

参考自MFC 模态对话框的实现原理 - 西昆仑 - OSCHINA - 中文开源技术交流社区 1. 模态对话框 在涉及 GUI 程序开发的过程中&#xff0c;常常有模态对话框以及非模态对话框的概念 模态对话框&#xff1a;在模态对话框活动期间&#xff0c;父窗口是无法进行消息响应&#xff0…

The book

Deep Learning for Coders with Fastai and PyTorch: AI Applications Without a PhD is the book that forms the basis for this course. We recommend reading the book as you complete the course. There’s a few ways to read the book – you can buy it as a paper bo…

到无穷大和更远,用分形更好

文章目录 一、说明二、分形到底是什么&#xff1f;三、更多更深刻的四、引进无穷小会产生什么样的怪事&#xff1f;五、希尔伯特曲线六、还有什么有趣的要补充的吗&#xff1f; 一、说明 ​​​​​​​数学领域有太多有趣的领域&#xff0c;领域我特别感兴趣。这是一个奇妙的…

【PostgreSQL17新特性之-冗余IS [NOT] NULL限定符的处理优化】

在执行一个带有IS NOT NULL或者NOT NULL的SQL的时候&#xff0c;通常会对表的每一行&#xff0c;都会进行检查以确保列为空/不为空&#xff0c;这是符合常理的。 但是如果本身这个列上有非空&#xff08;NOT NULL&#xff09;约束&#xff0c;再次检查就会浪费资源。甚至有时候…

经验分享:如何搭建一个有效的知识库管理系统

打开知乎&#xff0c;发现很多朋友在问如何搭建一个有效的知识库管理系统&#xff0c;所以今天LookLook同学就来跟大家分享一下我是怎么搭建一个既实用又高效的知识库管理系统的。 一、明确需求&#xff0c;定位清晰 首先&#xff0c;你得想清楚你要搭建的知识库管理系统是用来…

时钟、复位与上电初始化

目录 1. 时钟2. 复位2.1. 异步复位 同步释放2.2. Xilinx FPGA复位设计基于PLL锁定&#xff08;locked&#xff09;复位设计 3. 上电初始化 1. 时钟 2. 复位 FPGA中复位设计总结 深入理解复位—同步复位&#xff0c;异步复位&#xff0c;异步复位同步释放(含多时钟域&#xff0…

element table表格行列合并span-method,根据数据动态行列合并

表格行列合并需要用到 table的方法 span-method 根据数据来进行动态的行列合并&#xff0c;实例如下&#xff1a; <el-table:data"tableData":span-method"objectSpanMethod" style"width: 100%"><el-table-columnprop"key"l…

【python】OpenCV—Color Detection

学习来自 如何使用 OpenCV Python 检测颜色 import cv2 import numpy as npdef red_hsv(img, saveFalse):lower_hsv1 np.array([0, 175, 20])higher_hsv1 np.array([10, 255, 255])lower_hsv2 np.array([170, 175, 20])higer_hsv2 np.array([10, 255, 255])mask1 cv2.inR…

基于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协议并编写服务器测试示…

[代码复现]Self-Attentive Sequential Recommendation(ing)

参考代码&#xff1a;SASRec.pytorch 可参考资料&#xff1a;SASRec代码解析 前言&#xff1a;文中有疑问的地方用?表示了。可以通过ctrlF搜索’?。 环境 conda create -n SASRec python3.9 pip install torch torchvision因为我是mac运行的&#xff0c;所以device是mps 下面…

npm install pubsub-js报错的解决汇总

我在练习谷粒商城P83时&#xff0c;选择分类时触发向后端请求选择分类catId绑定的品牌数据&#xff0c;发现前端控制台报错&#xff1a; "PubSub is not definded",找不到pubsub。 因为缺少pubsub包&#xff0c;所以开始安装此包。 于是在网上一顿搜索猛如虎&…

C# :IQueryable IEnumerable

1. IEnumerable namespace System.Collections: public interface IEnumerable {public IEnumerator GetEnumerator (); }public interface IEnumerator {pubilc object Current { get; }public bool MoveNext ();public void Reset (); }IEnumerable 只有一个方法 GetEnumera…

django使用fetch上传文件

在上一篇文章中&#xff0c;我包装了fetch方法&#xff0c;使其携带cookie。但是之前fetch传递的是json数据&#xff0c;现在有了一个上传文件的需求&#xff0c;因此需要进行修改&#xff1a; const sendRequest (url, method, data) > {const csrftoken Cookies.get(cs…

C++ | Leetcode C++题解之第119题杨辉三角II

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<int> getRow(int rowIndex) {vector<int> row(rowIndex 1);row[0] 1;for (int i 1; i < rowIndex; i) {row[i] 1LL * row[i - 1] * (rowIndex - i 1) / i;}return row;} };

HTML动态响应2-Servlet+Ajax实现HTTP前后台交互方式

作者:私语茶馆 前言 其他涉及到的参考章节: HTML动态响应1—Ajax动态处理服务端响应-CSDN博客 Web应用JSON解析—FastJson1.2.83/Tomcat/IDEA解析案例-CSDN博客 HTML拆分与共享方式——多HTML组合技术-CSDN博客 1.场景: WEb项目经常需要前后端交互数据,并动态修改HTML页…