Jenkins自动化构建运行Springboot项目

news2025/1/13 17:29:38

通过在Jenkins中创建流水线任务,编写流水线脚本以实现自动化构建和部署SpringBoot项目

好处

  1. 自动化: 自动化整个部署流程,减少人工干预,降低出错率。

  2. 一致性: 确保每次部署都遵循相同的步骤和配置,提高部署的一致性。

  3. 快速反馈: 快速地将代码更改部署到测试或生产环境,便于及时发现和解决问题。

  4. 持续集成: 与版本控制系统(如Git)集成,实现代码的持续集成,提高开发效率。

  5. 持续部署: 可选地实现持续部署,自动将通过测试的代码部署到生产环境。

  6. 易于回滚: 出现问题时,可以快速回滚到上一个稳定版本。

  7. 环境隔离: 通过Jenkins的agent,可以在不同的环境(如开发、测试、生产)上运行流水线,实现环境隔离。

  8. 扩展性: Jenkins提供了丰富的插件生态,可以根据需要添加新的功能。

  9. 监控与报告: 可以集成监控工具,收集部署过程中的数据,生成报告。

  10. 协作: 促进开发、测试和运维团队之间的协作,提高团队效率。

  11. 灵活性: 可以根据项目需求定制流水线,适应不同的开发和部署模式。

  12. 节省时间: 自动化部署流程可以节省大量手动操作的时间,让开发人员专注于更有价值的任务。

  13. 提高质量: 通过自动化测试和部署,可以更早地发现问题,提高软件质量。

  14. 可追溯性: Jenkins提供了详细的构建历史和日志,便于追踪问题和审计。

  15. 减少人为错误: 自动化减少了人为操作错误的可能性,提高了部署的可靠性。

使用Jenkins流水线可以显著提高软件开发和部署的效率和质量,是现代DevOps实践的重要组成部分。

构建

General

        通用配置:描述这部分一般是填写这个任务的作用以及注意事项的,正常情况下建议不要留空白,根据实际情况来填写。保存后后续可以在任务的主页上面看到对应的内容了。

源码管理

下的Git源码管理功能是由Git插件提供的,选择和添加必要信息

Build Steps

shell命令是在使用Maven构建工具时的命令行参数,用于构建和安装项目

clean install -pl companion-robot-api -am -D dev

解释:

clean :清理项目的工作目录,删除之前构建生成的所有文件

install :用于将构建的包安装到本地仓库中

-pl:用于指定构建特定的子模块或模块列表。如果不指定,则默认构建所有模块

-am : 用于强制构建模块以及其依赖的模块,即使它们是最新的

-D : Maven的-D选项,用于设置系统属性

dev:指定开发环境

综上所述,整个命令的含义是:清理并安装名为companion-robot-api的模块,同时强制构建该模块及其依赖的模块,设置一个名为dev的系统属性,这可能用于配置特定的开发环境设置

cd /root/.jenkins/workspace/dev-zmrobot-companion/companion-robot-api/target/
rm -rf companion-api.tar.gz

解释:

cd:进入到指定目录

rm -rf :删除指定的目录及其内容

综上所述,整个命令的含义是:切换到构建输出目录,并删除一个特定的压缩文件

tar -czvf companion-api.tar.gz *.jar -C classes application-dev.yml

解释:

tar -czvf:用来打包和压缩文件的命令

companion-api.tar.gz :创建的归档文件的名称

*.jar:这是一个通配符,表示当前目录下所有以.jar结尾的文件

-C classes application-dev.yml:改变随后的参数所指向的目录classes ,除了classes目录下的所有.jar文件外,还要包含这个配置文件到压缩包中

综上所述,整个命令的含义是:在当前目录下创建一个名为companion-api.tar.gz的压缩文件,其中包含classes目录下所有的.jar文件以及当前目录下的application-dev.yml配置文件

scp /root/.jenkins/workspace/dev-zmrobot-companion/companion-robot-api/target/companion-api.tar.gz 192.168.0.157:/data/recent/

解释:

scp:执行文件的复制操作

综上所述,整个命令的含义是:将本地路径/root/.jenkins/workspace/dev-zmrobot-companion/companion-robot-api/target/下的companion-api.tar.gz文件复制到IP地址为192.168.0.157的远程机器的/data/recent/目录下

ansible zmrobotdev -m copy -a 'force=yes src=/home/jenkins/script-zmrobot/companion-api.sh dest=/data/script/'

解释:

ansible :用于执行配置管理和自动化任务

zmrobotdev :用于指定要连接的主机或主机组

-m copy:-m后面跟着的是模块的名称。copy模块用于将文件从本地复制到远程主机

-a:用于传递模块参数

'force=yes src=/home/jenkins/script-zmrobot/companion-api.sh dest=/data/script/':这是传递给copy模块的参数字符串,使用单引号括起来以确保参数作为整体传递

解释:

force=yes: 表示如果目标文件已经存在,Ansible将覆盖它

src=/home/jenkins/script-zmrobot/companion-api.sh:指定了要复制的源文件的路径

dest=/data/script/:目标路径

综上所述,整个命令的含义是:使用Ansible的copy模块,强制将本地路径/home/jenkins/script-zmrobot/companion-api.sh的脚本文件复制到指定的远程主机zmrobotdev/data/script/目录下。如果远程目录中已经存在同名文件,它将被覆盖

ansible zmrobotdev -m command -a 'sh /data/script/companion-api.sh'

解释:

ansible :用于执行配置管理和自动化任务

zmrobotdev :用于指定要连接的主机或主机组

-m command :-m后面跟着的是模块的名称。command模块用于在远程主机上执行命令

-a 'sh /data/script/companion-api.sh': 传递给command模块的参数字符串,参数指定了要在远程主机上执行的命令

companion-api.sh

这段脚本是一个自动化部署流程,用于停止服务、备份代码、清理环境、更新代码和启动服务

# 停止服务
ps -ef | grep /data/service/companion-api/ | grep -v grep | awk '{print $2}' | xargs kill -9
# 备份代码
date_str=`date '+%F_%H%M'`
mkdir -p /data/backup/companion-api/"$date_str"
cd /data/service/companion-api/
tar -czvf companion-api.tar.gz application.properties *.jar
mv -f companion-api.tar.gz /data/backup/companion-api/"$date_str"
# 清理环境
rm -rf application-dev.yml *.jar
# 更新代码
tar -xzvf /data/recent/companion-api.tar.gz -C /data/service/companion-api/
# 启动服务
sleep 10
sh /data/service/companion-api/bin/start.sh

停止服务

ps -ef | grep /data/service/companion-api/ | grep -v grep | awk '{print $2}' | xargs kill -9

解释:

ps -ef :列出系统中所有的进程

grep /data/service/companion-api/ :过滤出包含指定路径的进程

grep -v grep :排除包含grep命令本身的行

awk '{print $2}' :使用awk打印出进程ID(通常是第二列)

xargs kill -9 :使用xargs将上一步得到的PID传递给kill命令,强制杀死这些进程

备份代码

date_str=`date '+%F_%H%M'`
mkdir -p /data/backup/companion-api/"$date_str"
cd /data/service/companion-api/
tar -czvf companion-api.tar.gz application.properties *.jar
mv -f companion-api.tar.gz /data/backup/companion-api/"$date_str"

解释:

date_str=`date '+%F_%H%M'` :使用date命令生成一个时间字符串,用于创建备份目录

mkdir -p:创建备份目录

tar -czvf:创建一个包含application.properties和所有.jar文件的压缩包

mv -f :强制移动压缩包到备份目录

清理环境

rm -rf application-dev.yml *.jar

解释:

rm -rf :强制删除指定的文件和目录,这里删除了application-dev.yml配置文件和所有.jar文件。

更新代码

tar -xzvf /data/recent/companion-api.tar.gz -C /data/service/companion-api/

解释:

tar -xzvf :解压指定的压缩包到指定目录

启动服务

sleep 10
sh /data/service/companion-api/bin/start.sh

解释:

sleep 10:等待10秒,确保所有更新操作完成

sh /data/service/companion-api/bin/start.sh:执行启动脚本,启动服务

start.sh

SERVER_BIN_DIR=$(cd "$(dirname "$0")"; pwd)

SERVER_DIR=$(cd "$SERVER_BIN_DIR";cd "..";pwd)

echo 脚本目录:$SERVER_BIN_DIR
echo 项目目录:$SERVER_DIR

#读取配置文件
SERVER_NAME=`sed '/^SERVER_NAME=/!d;s/.*=//' $SERVER_BIN_DIR/deploy.conf`
VM=`sed -n '2p' $SERVER_BIN_DIR/deploy.conf`


#设定系统运行环境变量
LC_ALL="zh_CN.UTF-8"
LANG="zh_CN.UTF-8"
export LC_ALL
export LANG


#设定服务程序路径与名称(注意:此路径是文件路径,包含执行文件名称)
SERVER_PATH="$SERVER_DIR/**.jar"


#查看进程是否存在
RESULT=$(ps -ef | grep ${SERVER_PATH} | grep -v "grep")


#判断RESULT是否不为空,不为空则说明进程已经启动
if [ -n "$RESULT" ]; then
    echo [$SERVER_NAME] 正在运行
else
    #启动服务器
    source /etc/profile
    nohup java -jar $VM $SERVER_PATH >/dev/null 2>&1 &

        echo  [$SERVER_NAME] 启动完成
fi

设置脚本和项目目录变量

SERVER_BIN_DIR=$(cd "$(dirname "$0")"; pwd)
SERVER_DIR=$(cd "$SERVER_BIN_DIR";cd "..";pwd)

解释:

  • dirname "$0"获取脚本文件所在的目录。
  • cd命令结合pwd获取当前目录的完整路径。
  • 第一个命令设置SERVER_BIN_DIR为脚本所在的目录。
  • 第二个命令首先切换到SERVER_BIN_DIR,然后切换到上一级目录,设置SERVER_DIR为项目的根目录。

打印脚本和项目目录

echo 脚本目录:$SERVER_BIN_DIR
echo 项目目录:$SERVER_DIR

读取配置文件

SERVER_NAME=`sed '/^SERVER_NAME=/!d;s/.*=//' $SERVER_BIN_DIR/deploy.conf`
VM=`sed -n '2p' $SERVER_BIN_DIR/deploy.conf`

解释:

使用sed命令从deploy.conf配置文件中提取SERVER_NAME和第二行的内容(VM可能是JVM参数)

设定系统运行环境变量

LC_ALL="zh_CN.UTF-8"
LANG="zh_CN.UTF-8"
export LC_ALL
export LANG

解释:

设置区域设置和语言环境变量,用于支持中文。

设定服务程序路径与名称

SERVER_PATH="$SERVER_DIR/**.jar"

解释:

这里使用glob模式**.jar来匹配项目目录下所有jar文件,但通常服务只有一个jar文件,可能需要调整为具体的服务jar文件名

查看进程是否存

RESULT=$(ps -ef | grep ${SERVER_PATH} | grep -v "grep")

解释:

使用ps查看所有进程,通过grep查找包含SERVER_PATH的进程,排除grep命令本身

判断进程是否启动并相应操作

if [ -n "$RESULT" ]; then
    echo [$SERVER_NAME] 正在运行
else
    #启动服务器
    source /etc/profile
    nohup java -jar $VM $SERVER_PATH >/dev/null 2>&1 &

    echo  [$SERVER_NAME] 启动完成
fi

解释:

如果RESULT变量不为空,说明服务正在运行

如果服务没有运行,使用nohup启动Java服务,并将输出重定向到/dev/null,使进程在后台运行

source /etc/profile用于加载系统环境变量配置

deploy.conf

-Xms1024M -Xmx1024M -XX:+HeapDumpOnOutOfMemoryError

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

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

相关文章

临沂厚朴里升腾的文旅“烟火气”为城市“夜”经济贡献新活力

“一街兴一城、一街促百业”的案例不胜枚举,一如北京王府井大街古今交融的馥郁人文、上海南京路万国风貌的时尚繁华、成都春熙路美食飘香的热辣滚烫…无不成为其所在城市的一张靓丽名片,吸引着大量的当地居民和外来游客,为城市的经济发展和人…

Matlab|考虑大规模电动汽车接入电网的双层优化调度策略

目录 1 主要内容 2 部分代码 3 程序结果 4 下载链接 1 主要内容 该程序复现文章《A bi-layer optimization based temporal and spatial scheduling for large-scale electric vehicles》,中文文献可对照《考虑大规模电动汽车接入电网的双层优化调度策略》&…

【C++】学习笔记——智能指针

文章目录 二十一、智能指针1. 内存泄漏2. 智能指针的使用及原理RAII智能指针的原理auto_ptrunique_ptrshared_ptrshared_ptr的循环引用weak_ptr删除器 未完待续 二十一、智能指针 1. 内存泄漏 在上一章的异常中,我们了解到如果出现了异常,会中断执行流…

4.5、作业管理

几乎不太会考 作业的状态 作业:系统为完成一个用户的计算任务(或一次事务处理)所做的工作总和。例如,对用户编写的源程序,需要经过编译、连接、装入以及执行等步骤得到结果,这其中的每一个步骤称为作业步…

【附安装包】CentOS7(Linux)详细安装教程(手把手图文详解版)

目前流行的虚拟机软件有VMware、Virtual Box和Virtual PC等等,其中最常用的就是VMware。 而centos是Linux使用最广泛的版本之一。 教程开始教程有许多不完备之处,大佬请忽略。。。 1.安装VMware 首先需要准备VMware的安装包以及Ubuntu的ISO镜像&#…

Shell编程——基础语法(2)和 Shell流程控制

文章目录 基础语法(2)echo命令read命令printf命令test命令 Shell流程控制if-else语句for 循环while 语句until 循环case ... esac跳出循环 基础语法(2) echo命令 Shell 的 echo 指令与 PHP 的 echo 指令类似,都是用于…

文档管理系统哪个好?优质8款系统深度比较

本文将分享8款文档管理系统:PingCode、Worktile、金山文档、腾讯文档、飞书文档、石墨文档、Confluence、Google Drive。 在寻找合适的文档管理系统时,你是否感到困惑和不安?市场上众多选项让人难以抉择,尤其是当你希望找到既能提…

springCloud组件专题(五) --- seata

一.Seata介绍 1. seata是什么 是一款开源的分布式事务解决方案,供了 AT、TCC、SAGA 和 XA 事务模式。 2.分布式事务中的概念 2.1. 二阶段提交 二阶段提交的含义就是将事务的提交分成两个步骤,分别为: 准备阶段:事务协调者询问所…

Django分页组件封装

目录 1. 前言 2. 代码 3. 使用 3.1 view.py 3.2 list.html 1. 前言 在日常开发中,我们也许会遇到一页内容太多不够展示的问题,过于冗余。 此时,我们就需要进行分页,分页的方式有两种:1. ajax异步分页 2. 普通选…

记一些零碎的只是点和一些安全工具的使用(这里建议将漏洞原理搞清楚,然后可以尝试手动和使用工具)

目录 信息收集 扫描端口 工具 nmap TxPortMap tideFinger fscan 漏洞扫描 目录扫描 利群使用 不同系统、不同框架的漏洞 OA weblogic Struts2 thinkphp漏洞 shiro 蚁剑使用 更高级的连接工具 免杀类型 主机端的免杀 流量层的免杀 安全设备 主机端安全设备…

Docker容器数据库启动,如何用别名JAR jdbc:postgresql://别名:5432/postgres

如果想了解为啥这样做得同学,请去看这个文章 Docker容器网络(七)_host.docker.internal-CSDN博客 因为docker0网络,需要用别名的话,还得在host文件加 dockerIp(172.0.0.2) 别名 怎么查, docker network …

每日一题 ~ LCR 015. 找到字符串中所有字母异位词

. - 力扣(LeetCode) 题目解析 题目要求找出字符串中所有的字母异位词。所谓字母异位词指的是两个字符串中字符出现的次数相同,但顺序可以不同的情况。 思路分析 固定窗口:使用滑动窗口技巧,窗口大小固定为待匹配字…

Latex基本数学公式

LaTeX数学公式入门 LaTeX作为一种广泛使用的排版系统,尤其在学术界和科技领域,以其强大的排版能力和灵活性著称。而它的公式编辑能力更是让人叹为观止,经常与Markdown结合使用,以简化文档编写和公式展示的过程。 LaTeX 公式 L…

数字的位操作——326、504、263、190、191、476、461、477、693

326. 3 的幂(简单) 给定一个整数,写一个函数来判断它是否是 3 的幂次方。如果是,返回 true ;否则,返回 false 。 整数 n 是 3 的幂次方需满足:存在整数 x 使得 n 3x 示例 1: 输入&a…

本地部署持续集成工具Jenkins并配置公网地址实现远程自动化构建

文章目录 前言1. 安装Jenkins2. 局域网访问Jenkins3. 安装 cpolar内网穿透软件4. 配置Jenkins公网访问地址5. 公网远程访问Jenkins6. 固定公网地址 前言 本文主要介绍如何在Linux CentOS 7中安装Jenkins并结合cpolar内网穿透工具实现远程访问管理本地部署的Jenkins服务. Jenk…

DDR等长,到底长度差多少叫等长?

DDR4看这一篇就够了 - 知乎 (zhihu.com) 【全网首发】DDR4 PCB设计规范&设计要点PCB资源PCB联盟网 - Powered by Discuz! (pcbbar.com) 终于看到较为权威的DDR4等长要求了: !!!! 依据这个要求,H616项目的等长线不合格:

JazzEE(2)

JazzEE(2) 8、异常引入try-catchcatch中如何处理异常try-catch-finally多重catch异常的分类throw和throws区别小案例 重载和重写的异常处理自定义异常 9、常用类包装类引入Integer String类String字符串内存 StringBuilder类可变和不可变常见方法StringB…

SpringBoot整合Juint,ssm框架

目录 SpringBoot整合Juint 1.导入相关的依赖 2.创建测试类,使用注解SpringBootTest SpringBoot整合ssm框架 1.使用脚手架创建Spring项目 2.修改pom.xml 我先修改了SpringBoot的版本,修改为2.3.10.RELEASE,因为SpringBoot版本太高会出现…

数据集——鸢尾花介绍和使用

文章目录 一、鸢尾花数据集内容二、使用中常转换DataFrame 一、鸢尾花数据集内容 from sklearn import svm, datasets # 鸢尾花数据 iris datasets.load_iris() print(iris.data) X iris.data[:, :2] # 为便于绘图仅选择2个特征 y iris.target它包含了150个样本&#xff0c…

3.8.语义分割

语义分割 ​ 语义分割将图片中的每个像素分类到对应的类别(有监督学习) 1.图像分割和实例分割 图像分割将图像划分为若干组成区域,这类问题的方法通常利用图像中像素之间的相关性。它在训练时不需要有关图像像素的标签信息,在预测时也无法保证分割出的区…