当前位置: 首页 > news >正文

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

相关文章:

  • Django 创建项目及应用
  • elementui中的表单,根据条件判断切换是否必填
  • [Windows] 植物大战僵尸杂交版
  • 【NOI】C++程序结构入门之循环结构二-for循环
  • 非计算机行业的人,如何使用大模型进行自媒体创作
  • 【MySQL】库和表的操作
  • 【C++奇技淫巧】CRTP(奇特重现模板模式)
  • 为了搞清楚 DNS,我花了 1.99 买了一个域名
  • Esxi_FAQ_2024.6.3
  • 实用篇| huggingface网络不通
  • 【Node】node的Console模块使用。
  • 【面试题-012】什么是Spring 它有哪些优势
  • 回溯算法题模板与实战详解
  • 通用代码生成器应用场景六,为完善的应用系统收集需求
  • python替换“${}“占位符为变量,实现读取配置文件
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • JavaScript标准库系列——Math对象和Date对象(二)
  • leetcode386. Lexicographical Numbers
  • MySQL数据库运维之数据恢复
  • PAT A1050
  • React中的“虫洞”——Context
  • Webpack 4 学习01(基础配置)
  • weex踩坑之旅第一弹 ~ 搭建具有入口文件的weex脚手架
  • 测试开发系类之接口自动化测试
  • 第2章 网络文档
  • 高性能JavaScript阅读简记(三)
  • 技术胖1-4季视频复习— (看视频笔记)
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 前嗅ForeSpider教程:创建模板
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 异常机制详解
  • 译有关态射的一切
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • ​虚拟化系列介绍(十)
  • # wps必须要登录激活才能使用吗?
  • #单片机(TB6600驱动42步进电机)
  • (02)Unity使用在线AI大模型(调用Python)
  • (1综述)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
  • (6)STL算法之转换
  • (Git) gitignore基础使用
  • (八十八)VFL语言初步 - 实现布局
  • (动手学习深度学习)第13章 计算机视觉---微调
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (附源码)springboot社区居家养老互助服务管理平台 毕业设计 062027
  • (附源码)ssm码农论坛 毕业设计 231126
  • (四)c52学习之旅-流水LED灯
  • (算法)求1到1亿间的质数或素数
  • (五)c52学习之旅-静态数码管
  • (杂交版)植物大战僵尸
  • (转)创业的注意事项
  • (转)为C# Windows服务添加安装程序