Jenkins 中自动化部署 Spring Boot 项目

ops/2025/1/7 19:02:51/

请添加图片描述

👨🏻‍💻 热爱摄影的程序员
👨🏻‍🎨 喜欢编码的设计师
🧕🏻 擅长设计的剪辑师
🧑🏻‍🏫 一位高冷无情的全栈工程师
欢迎分享 / 收藏 / 赞 / 在看!

准备工作

本文将介绍如何使用 Jenkins 从仓库中拉取项目,经过打包、构建镜像、运行容器等步骤,最终将 Spring Boot 项目部署到服务器上供用户访问。并且当项目有更新时,自动触发 Jenkins 任务,实现自动化部署。
在开始之前,需要先创建一个 Spring Boot 项目,提供一些测试的接口。在确保项目正常运行的情况下,将项目推送到 Git 远程仓库。

Spring Boot 项目文件目录结构:

在这里插入图片描述

Dockerfile 文件内容:

FROM bellsoft/liberica-openjdk-debian:17.0.11-cdsLABEL maintainer="hayden"RUN mkdir -p /demo/server/logs \/demo/server/tempWORKDIR /demo/serverENV SERVER_PORT=8080 LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS="-Xms512m -Xmx512m"EXPOSE ${SERVER_PORT}ADD ./target/demo.jar ./app.jarENTRYPOINT java -Djava.security.egd=file:/dev/./urandom -Dserver.port=${SERVER_PORT} \-XX:+HeapDumpOnOutOfMemoryError -XX:+UseZGC ${JAVA_OPTS} \-jar app.jar

启动 Jenkins

使用 docker-compose 构建 Jenkins 容器。

文件树结构:

.
├── docker-compose.yml
└── jenkins├── jenkins_config└── jenkins_home

docker-compose.yml 文件内容:

version : '3.0.01'
services:jenkins:container_name: jenkinsimage: jenkins/jenkins:lts-jdk17restart: unless-stoppedports:- "10000:8080"volumes:# 数据卷挂载路径设置,将本机目录映射到容器目录 (下面映射可在容器中执行宿主机docker命令)- "/usr/bin/docker:/usr/bin/docker"- "/var/run/docker.sock:/var/run/docker.sock"- "/usr/lib64/libltdl.so.7:/usr/lib/x86_64-linux-gnu/libltdl.so.7"#      - "/usr/local/bin/docker-compose:/usr/local/bin/docker-compose"  # 无效- "./jenkins/jenkins_home:/var/jenkins_home"# ThinBackup插件备份jenkins配置存储目录- "./jenkins/jenkins_config:/var/jenkins_config"# 解决jenkins安装插件报错: An error occurred during installation: No such plugin: cloudbees-folder# 下载地址  http://ftp.icm.edu.pl/packages/jenkins/plugins/cloudbees-folder/#      - "./jenkins/jenkins_home/war/META-INF/detached-plugins/cloudbees-folder.hpi:/var/jenkins_home/war/META-INF/detached-plugins/cloudbees-folder.hpi"environment:TZ: Asia/ShanghaiLANG: en_US.UTF-8JAVA_OPTS: -Xmx512M -Xms512M -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:MaxNewSize=128m -Djava.util.logging.config.file=/var/jenkins_home/log.properties -Duser.timezone=Asia/Shanghaiuser: root # 使用root权限运行容器(docker中通过`-u root`命令)

启动 Jenkins 容器:

docker-compose up -d jenkins

开放 10000 端口,允许外部访问:

firewall-cmd --zone=public --add-port=10000/tcp --permanent
firewall-cmd --reload

配置 Jenkins

在浏览器中输入 http://[ip]:10000 访问 Jenkins。经过一系列设置,完成 Jenkins 的初始化。

在系统管理->全局工具配置中配置 JDK,以 JDK 17 为例:

安装 URL:https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.tar.gz

在这里插入图片描述

在系统管理->全局工具配置中配置 Maven,以 Maven 3.9 为例:

在这里插入图片描述

下载完 Maven 后还需要修改镜像地址,避免出现下载速度过慢的问题:

# 进入 Maven 配置文件目录
cd jenkins/jenkins_home/tools/hudson.tasks.Maven_MavenInstallation/
# 编辑配置文件
vim maven-3.9.9/conf/settings.xml# 替换原镜像地址
<mirror><id>alimaven</id><name>aliyun maven</name><url>https://maven.aliyun.com/nexus/content/groups/public/</url><mirrorOf>central</mirrorOf>
</mirror>

::: tip 注意
使用 Jenkins 的安装方式中,会将软件安装到对应目录的下一层目录,例如 JDK 安装到 jenkins/jenkins_home/tools/hudson.model.JDK/jdk-17/jdk-17.0.12,导致出现找不到 JDK 的问题。

解决方法:来到对应的目录中,将 JDK 的目录移动到上一层目录即可。

cd jenkins/jenkins_home/tools/hudson.model.JDK/jdk-17
mv jdk-17.0.12/* .
rm -rf jdk-17.0.12

:::

创建及配置任务

在 Jenkins 主页点击新建任务,选择构建一个 maven 项目,点击确定:

在这里插入图片描述

源码管理

在源码管理中选择 Git,填写仓库地址、凭证、分支等信息:

在这里插入图片描述

构建触发器

在构建触发器中选择 Generic Webhook Trigger,填写 Token,点击应用:

在这里插入图片描述

在这里插入图片描述

这时来到 Git 远程仓库的 Webhook 配置页面,填写 Jenkins URL 和 Token,点击添加:

URL 格式:http://[ip]:10000/generic-webhook-trigger/invoke?token=Token

在这里插入图片描述

在这里插入图片描述

构建

由于 pom.xml 在项目根目录下,所以这边默认使用 pom.xml 进行构建:

在这里插入图片描述

构建后操作

勾选 Run only if build succeeds,填写 Shell 脚本:

# 删除旧容器
docker rm -f my-spring-boot
# 删除旧镜像
docker rmi -f my-spring-boot:latest
# 构建新镜像
docker build -t my-spring-boot .
# 运行容器
docker run --name my-spring-boot -p 8080:8080 -d my-spring-boot:latest

在这里插入图片描述

点击保存,任务配置完成。

构建任务

在 Jenkins 主页点击任务名称,点击立即构建,可以看到正在构建的历史过程。点击构建历史中的任务,可以查看详细的构建日志:

在这里插入图片描述

多尝试几次,确保构建成功。

测试

在浏览器中输入指定 URL,可以看到项目已经部署成功。并且当 Git 仓库中的项目有更新时,Jenkins 会自动触发任务,实现自动化部署:

在这里插入图片描述


http://www.ppmy.cn/ops/147428.html

相关文章

大数据新视界 -- Hive 临时表与视图的应用场景(下)(30 / 30)

💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的博客,正是这样一个温暖美好的所在。在这里,你们不仅能够收获既富有趣味又极为实…

javascript变量

变量 命名规范 以 字母、数字、下划线、美元符号 $ 组成、不能以 数字开头、且不能使用 js 中的关键字。 命名规范推荐采用小驼峰 命名法 。类名 采用 大驼峰命名。 var 声明变量的特点 在 script 上下文中定义的是 全局变量&#xff0c;全局变量会自动称为 window的属性。 在…

集合(List、Set、Map)ArrayList、LinkedList、Vector、HashSet、LinkedHashSet、HashMap

集合&#xff1a; 集合是动态保存多个任意对象&#xff0c;使用增加、删除元素时比较方便&#xff08;自动扩缩容&#xff0c;不需要自己编写逻辑&#xff09;&#xff1b; 集合有单列集合Collection和双列集合Map&#xff1a; 其中Collection有两个子接口&#xff1a;Set、L…

爱诗科技PixVerseV3.5发布:短时极速生成,动漫效果超预期

简介 PixVerse V3.5 是由爱诗科技推出的一款AI视频生成工具的最新版本&#xff0c;它在视频创作效率与质量方面实现了显著提升。这款软件不仅缩短了视频生成的时间&#xff0c;还增强了视频内容的表现力和专业度。以下是关于 PixVerse V3.5 的详细介绍&#xff1a; 视频生成速…

工厂模式与抽象工厂模式在Unity中的实际应用案例

一、实验目的 实践工厂模式和抽象工厂模式的实际应用。 创建一个小型的游戏场景&#xff0c;通过应用这些设计模式提升游戏的趣味性和可扩展性。 掌握在复杂场景中管理和使用不同类型的对象。 比较在实际游戏开发中不同设计模式的实际效果和应用场景。 学习如何进行简单的性…

低代码开发:开启企业数智化转型“快捷键”

一、低代码开发浪潮来袭&#xff0c;企业转型正当时 在当今数字化飞速发展的时代&#xff0c;低代码开发已如汹涌浪潮&#xff0c;席卷全球。从国际市场来看&#xff0c;诸多企业巨头纷纷布局低代码领域&#xff0c;像微软的 PowerApps、OutSystems 等平台&#xff0c;凭借强大…

【408 计算机网络】第二章 物理层 学习笔记

物理层 2.1 通信基础的基本概念 信源、信宿、信道、信号码元、速率、波特带宽 2.1.1 信源、信宿、信道、信号 一条物理线路通常包含两条信道&#xff0c;即 发送信道、接收信道。 数据&#xff1a;信息的实体 信源&#xff1a;信号的来源&#xff08;数据发送方&#xff09;…

Next.js 多语言 (1) | 中间件(Middleware)的设置与应用

当我们开发一个支持多语言的 Next.js 网站时&#xff0c;常常需要解决以下问题&#xff1a; 用户首次访问时&#xff0c;应该显示哪个语言版本&#xff1f; &#x1f914; 比如&#xff0c;用户访问 / 时&#xff0c;是展示 /en 还是 /de&#xff1f; SEO 是否能够抓取所有语言…