CI/CD—Jenkins实现自动构建Docker镜像运行Java程序

实现原理

1、Java代码中创建一个dockerfile文件 --> 2、代码上传至GitLab --> 3、Jenkins同步GitLab的代码进行构建生成jar --> 4、Jenkins将jar包和dockerfile文件传到测试服务器上 --> 5、在测试服务器上执行dockerfile构建jar镜像 --> 6、镜像构建完运行容器

一、环境准备

1、在测试服务器上安装docker

参考之前的文章:

k8s集群部署_calico.v3.25.1.tar-CSDN博客 中的 ”二、安装docker“ 步骤

2、环境验证

 docker -v

 

二、编写dockerfile文件并提交代码

1、IDEA上创建一个docker目录,目录下编写dockerfile

1.1、创建dockerfile文件
dockerfile文件内容:
#penjdk:17 作为基础镜像
FROM openjdk:17# 设置工作目录
WORKDIR /root# 将当前目录下的所有文件复制到容器的 /app 目录下
COPY ./javafile/*.jar /root/HelloWorld.jar# 暴露端口(假设你的 Java 应用监听 8080 端口)
EXPOSE 8989# 定义容器启动时执行的命令
ENTRYPOINT ["java", "-jar", "/root/HelloWorld.jar"]

1.2、修改代码

2、提交并合并代码

3、查看编译之后的dockerfile的位置

4、在构建步骤中配置复制dockerfile到远程主机并运行的步骤

4.1、传输多个文件的解决方法

要实现多个目录下的文件传输再添加一个Transfer Set

4.2、配置jar和dockerfile的传输路径 
4.3、配置docker镜像建命令如果进行多次发布的在构建前要删除掉之前运行的容器和镜像
#删除掉之前运行的容器
docker rm -f $(docker ps |grep helloworld|awk '{print $1}')#删除掉之前的镜像以免对系统资源造成浪费
docker rmi -f helloworld#构建新的java镜像
docker build -t helloworld .#运行容器
docker run -d --name helloworld -p 8989:8989 helloworld

5、构建报错排查思路

5.1、构建出现报错排查思路
解决思路:先模拟Jenkins自动部署的步骤在测试机器上手动运行,如果运行没有问题,再排查是否是其他问题引起的。
排查步骤一:查看测试机器上排查jar和dockfile文件是否已经传输成功
文件已经成功上传到测试服务器对应目录下
排查步骤二:执行dockerfile构建命令
发现test用户没有docker命令的执行权限
解决方法:
chmod 666 /var/run/docker.sock
5.2、再次构建
5.3、结果为:Finished: UNSTABLE情况分析
“Finished: UNSTABLE” 常见于持续集成 / 持续部署(CI/CD)工具的构建或任务执行结果反馈中,如 Jenkins、GitLab CI/CD 等。它表示任务已完成,但处于 “不稳定” 状态,这意味着构建过程虽然结束,但存在一些不符合预期的情况,不过尚未达到构建失败的严重程度。具体的含义和排查方向因工具和使用场景而异:
  • 在 Jenkins 中
    • 测试用例部分失败:构建过程包含测试环节时,如果部分测试用例失败,而构建本身仍能成功完成,任务状态就会是 “UNSTABLE”。例如,一个 Java 项目构建,在单元测试中,10 个测试用例有 8 个通过,2 个失败,就会出现这种状态。你需要查看 Jenkins 构建记录中的测试报告,找到具体失败的测试用例,检查相关代码逻辑。
    • 代码质量问题:使用代码质量检查工具(如 Checkstyle、PMD 等)时,若代码存在一些不符合规范的问题,构建也可能标记为 “UNSTABLE”。比如代码中存在未使用的变量、过长的方法等。可以查看代码质量检查报告,按照规范修改代码。
    • 构建过程有警告:构建过程中,构建脚本(如 Maven、Gradle 脚本)执行时出现警告信息,可能导致状态不稳定。例如,Maven 依赖下载时出现警告,提示某些依赖版本可能存在兼容性问题。此时,要检查构建脚本的输出日志,处理警告信息,比如更新依赖版本。
  • 在 GitLab CI/CD 中
    • 部分作业失败:如果一个 CI/CD 流水线包含多个作业(jobs),部分作业成功完成,部分作业失败,整个流水线状态可能是 “UNSTABLE”。比如一个流水线包含代码编译、测试、部署三个作业,编译和测试成功,但部署作业因权限问题失败。需要查看每个作业的详细日志,定位失败作业的问题,解决部署权限等问题。
    • 环境变量或配置问题:配置文件中的某些设置可能导致构建或部署过程不稳定。例如,在部署作业中,环境变量配置错误,使得应用部分功能无法正常初始化。要仔细检查环境变量和配置文件,确保其正确性。

三、对自动构建结果进行测试

1、在测试机器上检测运行的结果是否正常

步骤一:检测目标文件是否成功上传到测试机器上
步骤二:查看镜像是否构建成功
步骤三:查看容器是否运行成功
步骤四:查看8989端口是都已经开启
步骤五:访问前端测试
浏览器上访问url连接: http://192.168.72.132:8989/hello

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

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

相关文章

docker 搭建alpine下nginx1.26/mysql8.0/php7.4环境

docker 搭建alpine下nginx1.26/mysql8.0/php7.4环境 docker-compose.yml services:mysql-8.0:container_name: mysql-8.0image: mysql:8.0restart: always#ports:#- "3306:3306"volumes:- ./etc/mysql/conf.d/mysql.cnf:/etc/mysql/conf.d/mysql.cnf:ro- ./var/log…

队列的简单例题

题目如下 模拟队列 首先你要明白队列的话 只有队尾才能进行新增,也就是入队 只有队首才能出队,也就是删除 队首队尾指针一开始默认都是0 相当于队列中一开始是有一个元素的就是 0的位置 队首指针head0 队尾指针tail0 1.入队也就是队尾要先赋值&#xf…

vue3+elementuiplus的table表格动态高度

table表格流体高度 1、前提 了解自定义指令、hooks 2、核心思路 通过自定义指令(new ResizeObserver)监听表格变化,然后通过hooks去更新表格高度。 3、核心代码 src/directives/resize.ts // import { debounce } from /utils;import { t…

Apache POI详解

目录 前言 Apache POI是一个强大的Java库,广泛用于处理Microsoft Office文档,包括Word、Excel和PowerPoint等。本文将详细介绍如何使用Apache POI库操作Word模板(包括替换占位符、操作表格)、将Word文档转换为PDF,以及…

AutoGen多角色、多用户、多智能体对话系统

2023-03-11-AutoGen 使用【autoGenchainlitdeepSeek】实现【多角色、多用户、多智能体对话系统】 1-核心思路 01)技术要点:autoGenchainlitdeepSeek02)什么是autoGen->autogen是微软旗下的多智能体的框架03)什么是chainlit-&g…

问deepseek: OpenFOAM并行分区后,是如何实现ldumatrix矩阵向量乘法计算逻辑的?

在OpenFOAM中,lduMatrix 是用于存储稀疏矩阵的类,支持并行计算。并行分区后,lduMatrix 的矩阵向量乘法通过以下步骤实现: 1. 矩阵分区 分区:将矩阵和向量分配到多个处理器上,每个处理器负责一部分。接口&…

数据类设计_图片类设计之4_规则类图形混合算法(前端架构)

前言 学的东西多了,要想办法用出来.C和C是偏向底层的语言,直接与数据打交道.尝试做一些和数据方面相关的内容 引入 接续上一篇,讨论图片类型设计出来后在场景中如何表达,以及图片的混合算法.前面的内容属于铺垫和基础,这篇内容和实际联系起来了. 背景图和前景图 这里笔者想先…

【openwebui 搭建本地知识库(RAG搭建本地知识库)】

安装准备 openwebui 这个本地安装之前写过使用python安装。也可以直接用docker 命令 docker run --rm -d \-p 3080:8080 \-p 3081:8081 \-e WEBUI_AUTHtrue \-e DEFAULT_LOCALEcn \-e GLOBAL_LOG_LEVEL"INFO" \-e AIOHTTP_CLIENT_TIMEOUT100 \--privilegedtrue \-…

Nginx的流式响应配置详解

现在大模型场景繁多,项目中涉及nginx转发大模型的流式数据时,需配置nginx的转发策略: location /streaming {proxy_pass http://backend_server;proxy_cache off; # 关闭缓存proxy_buffering off; # 关闭代理缓冲chunked_transfer_encoding …

git使用命令总结

文章目录 Git 复制创建提交步骤Git 全局设置:创建 git 仓库:已有仓库? 遇到问题解决办法:问题一先git pull一下,具体流程为以下几步: 详细步骤 Git 复制 git clone -b RobotModelSetting/develop https://gitlab.123/PROJECT/123.git创建提…

flutter 图片资源路径管理

1. 创建统一资源管理类 创建一个单独的 Dart 文件(比如 manager.dart),将所有图片路径集中管理。这样在引用图片时,不需要每次都手动输入完整路径,只需通过常量引用即可。 //manager.dartclass Manager { static co…

Android Retrofit 框架配置与构建模块深入源码分析(六)

一、引言 Retrofit 是一个在 Android 和 Java 开发中广泛使用的类型安全的 HTTP 客户端。它通过简洁的 API 设计,使得网络请求的处理变得高效且易于管理。配置与构建模块作为 Retrofit 的基础部分,承担着初始化和定制 Retrofit 实例的重要任务。开发者可…

80.Dictionary 字典 C#例子

使用 C# 中的 Dictionary 数据结构 在 C# 中&#xff0c;Dictionary<TKey, TValue> 是一个非常强大的数据结构&#xff0c;用于存储键值对。它提供了高效的查找、插入和删除操作&#xff0c;适用于需要快速访问数据的场景。本文将通过一个简单的示例&#xff0c;介绍如何…

tomcat负载均衡配置

这里拿Nginx和之前做的Tomcat 多实例来实现tomcat负载均衡 1.准备多实例与nginx tomcat单机多实例部署-CSDN博客 2.配置nginx做负载均衡 upstream tomcat{ server 192.168.60.11:8081; server 192.168.60.11:8082; server 192.168.60.11:8083; } ser…

C语言中scanf(“%c“,s)会出现的问题

scanf("%c%c", &word[0], &word[1]);的行为与输入缓冲区的内容密切相关。你提到输入ab后&#xff0c;word[0]是\n&#xff0c;这通常是因为输入缓冲区中残留了换行符&#xff08;\n&#xff09;。 一、原因分析 换行符残留 若在输入ab之前有其他输入操作&a…

SealOS部署k8s集群(单节点)

一、 先决条件 每个集群节点应该有不同的主机名。需要在 K8s 集群的第一个 master 节点上运行 sealos run 命令。建议使用干净的操作系统来创建集群。不要自己装 Docker&#xff01;支持大多数 Linux发行版&#xff0c;但内核版本建议5以上。例如&#xff1a;Ubuntu、CentOS、…

Linux 服务器安全配置:密码复杂度与登录超时设置

Linux服务器安全配置指南:密码复杂度与登录超时设置 一、密码复杂度设置 通过PAM模块pam_cracklib.so实现密码强度策略,配置文件: system-auth该文件主要用于定义系统范围内的认证策略,涵盖了用户登录、su 命令切换用户、sudo 权限提升等多种认证场景。当用户尝试进行系…

AI Agent开发框架分析:前端视角

1. Mastra (https://mastra.ai/docs) 优点&#xff1a; 提供直观的界面构建器&#xff0c;适合无代码/低代码开发支持JavaScript/TypeScript&#xff0c;可直接集成到前端项目可视化工作流设计&#xff0c;降低入门门槛内置多种UI组件&#xff0c;加速前端开发 缺点&#xf…

linux上使用unsloth微调大模型的环境踩坑之路-4070ti、4090

我们实验室有2套环境 一套&#xff1a;4070ti。安装了cuda12.4 一套&#xff1a;3张4090.安装了cuda12.4 现在开始给第一套装能运行unsloth能运行的环境 第一步&#xff1a;开始创建虚拟环境 conda create -n test_env python3.11 第二步&#xff1a;进入虚拟环境 conda activa…

网络安全演练有哪些形式

OPENVAS使用 1、确定指定IP是否能ping通 2、创建扫描目标 3、创建扫描任务&#xff08;scan management →newtask&#xff09; 4、开始任务start 5、查看扫描细节 6、查看扫描结果&#xff0c;包含漏洞详细信息&#xff0c;亦可到处PDF文件 7、导出扫描结果报告 8、为…