通过在Jenkins中创建流水线任务,编写流水线脚本以实现自动化构建和部署SpringBoot项目
好处
-
自动化: 自动化整个部署流程,减少人工干预,降低出错率。
-
一致性: 确保每次部署都遵循相同的步骤和配置,提高部署的一致性。
-
快速反馈: 快速地将代码更改部署到测试或生产环境,便于及时发现和解决问题。
-
持续集成: 与版本控制系统(如Git)集成,实现代码的持续集成,提高开发效率。
-
持续部署: 可选地实现持续部署,自动将通过测试的代码部署到生产环境。
-
易于回滚: 出现问题时,可以快速回滚到上一个稳定版本。
-
环境隔离: 通过Jenkins的agent,可以在不同的环境(如开发、测试、生产)上运行流水线,实现环境隔离。
-
扩展性: Jenkins提供了丰富的插件生态,可以根据需要添加新的功能。
-
监控与报告: 可以集成监控工具,收集部署过程中的数据,生成报告。
-
协作: 促进开发、测试和运维团队之间的协作,提高团队效率。
-
灵活性: 可以根据项目需求定制流水线,适应不同的开发和部署模式。
-
节省时间: 自动化部署流程可以节省大量手动操作的时间,让开发人员专注于更有价值的任务。
-
提高质量: 通过自动化测试和部署,可以更早地发现问题,提高软件质量。
-
可追溯性: Jenkins提供了详细的构建历史和日志,便于追踪问题和审计。
-
减少人为错误: 自动化减少了人为操作错误的可能性,提高了部署的可靠性。
使用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