利用shell脚本自动更新部署SpringBoot项目
文章目录
- 背景
- 脚本源码
- 脚本说明
- 脚本使用
背景
因为项目中有多个模块,每个模块需要打包成一个jar运行。每次更新到服务器比较麻烦,所以就想到利用脚本一键实现代码的更新、编译打包、备份、和启动工作。项目中模块除了一个是用gradle编译,其他都是采用maven管理依赖。
脚本源码
deploy.sh
#!/bin/bash
#//微服务启动管理脚本//#模块列表,因为maven和gradle构建的差异,为了避免脚本出现过多if else判断,所以两部分分开。#///Maven部分/
JarNames=(
discover-1.0-SNAPSHOT.jar
consumer-1.0-SNAPSHOT.jar
)
#--------------------------更新代码----------------------------------
echo -e "\e[1;32m 开始更新代码 \e[0m"
cd /home/boc/
git pull
echo -e "\e[1;32m 代码更新完成 \e[0m"
#-------------------------循环对所有模块进行编译打包和启动--------------
for JarName in ${JarNames[@]}
do#查看进程IDPID=$(ps aux | grep ${JarName} | grep -v 'grep' | awk '{print $2}')#要将模块名称分割开,获取到模块名称,同时也是目录名称。先存储旧的分隔符OLD_IFS="$IFS"#设置分隔符IFS="-"#如下会自动分隔 arr=(${JarName})# 将IFS恢复成原来的IFS="$OLD_IFS"#------------1.关闭已有进程----------------if [[ ! -z ${PID} ]];thenecho -e "\e[1;32m ${arr[0]} 的进程ID是:$PID \e[0m"echo -e "\e[1;32m 即将关闭${arr[0]} \e[0m"kill -9 ${PID}elseecho -e "\e[1;33m ${arr[0]} 没有启动 \e[0m"fi#------------2.编译代码--------------------echo -e "\e[1;32m 开始编译代码 \e[0m"cd /home/boc/${arr[0]}/mvn clean package -Dmaven.test.skip=trueecho -e "\e[1;32m 编译完成 \e[0m"#------------3.移动备份jar包----------------echo -e "\e[1;32m 开始备份旧jar包,备份位置在:/home/script/serverJAR/bak \e[0m"cd /home/script/serverJARif [[ -e ${JarName} ]];thenmv ${JarName} /home/script/serverJAR/bak/ -frm -rf ${JarName}echo -e "\e[1;32m JAR包备份完成 \e[0m"elseecho -e "\e[1;37m JAR包不存在,直接下一步 \e[0m"fi#------------4.移动新jar包到执行目录----------------cd /home/boc/${arr[0]}/targetif [[ -e ${JarName} ]];thenmv ${JarName} /home/script/serverJAR -fecho -e "\e[1;32m 新JAR准备好 \e[0m"elseecho -e "\e[1;31m JAR包不存在,直接下一步 \e[0m"fi#------------5.开始启动jar包----------------cd /home/script/serverJARecho -e "\e[1;32m 开始启动${arr[0]} \e[0m"nohup java -jar ${JarName} >${arr[0]}_log 2>&1 &echo -e "\e[1;32m 项目启动完成 \e[0m"#tail -f nohup.out
done#///Gradle构建的项目,该类型目前只有一个项目,所以不用循环///
weId="weid-1.0-SNAPSHOT.jar"
#查看进程ID
PID_WeId=$(ps aux | grep ${weId} | grep -v 'grep' | awk '{print $2}')
#------------1.关闭已有进程----------------
if [[ ! -z ${PID_WeId} ]];thenecho -e "\e[1;32m weId 的进程ID是:${PID_WeId} \e[0m"echo -e "\e[1;32m 即将关闭weId \e[0m"kill -9 ${PID_WeId}
elseecho -e "\e[1;33m weId 没有启动 \e[0m"
fi
#------------2.编译代码--------------------
echo -e "\e[1;32m 开始编译gradle项目 \e[0m"
cd /home/boc/weid
chmod +x ./gradlew && ./gradlew build -x test
echo -e "\e[1;32m 编译完成 \e[0m"
#------------3.移动备份jar包----------------
echo -e "\e[1;32m 开始备份旧jar包,备份位置在:/home/script/serverJAR/bak \e[0m"
cd /home/script/serverJAR
if [[ -e ${weId} ]];thenmv ${weId} /home/script/serverJAR/bak/ -frm -rf ${weId}echo -e "\e[1;32m JAR包备份完成 \e[0m"
elseecho -e "\e[1;37m JAR包不存在,直接下一步 \e[0m"
fi
#------------4.移动新jar包到执行目录----------------
cd /home/boc/weid/build/libs
if [[ -e ${weId} ]];thenmv ${weId} /home/script/serverJAR -fecho -e "\e[1;32m 新JAR准备好 \e[0m"
elseecho -e "\e[1;31m JAR包不存在,直接下一步 \e[0m"
fi
#------------5.开始启动jar包----------------
cd /home/script/serverJAR
echo -e "\e[1;32m 开始启动weid \e[0m"
nohup java -jar ${weId} >weid_log 2>&1 &
echo -e "\e[1;32m 项目启动完成 \e[0m"
脚本说明
脚本总体分为maven部分和gradle项目部分,因为maven项目较多,所以采用一个数组定义,并在循环中处理。gradle部分主要不同时编译命令不同,其他相似。为了清晰,把两部分分开写。
总体思路就是:
- 先判断服务进程运行情况,如果运行,则关闭进程
- 然后进行代码更新和编译
- 备份旧jar包,这一步很必要,如果启动出现问题,可以方便回滚到之前的服务
- 拷贝新jar包后启动服务
shell脚本部分语法说明:
字符串分隔数组
OLD_IFS="$IFS"#设置分隔符IFS="-"#如下会自动分隔 arr=(${JarName})# 将IFS恢复成原来的IFS="$OLD_IFS"
IFS是系统默认的分隔符,这里是固定语法,用自己需要的分隔符分隔数组后,恢复系统默认即可。
打印字符颜色
\e[1;37m xxx \e[0m
不同的颜色有不同的序号表示,根据需要查阅即可。
编译jar包命令
maven项目打包并跳过测试代码:
mvn clean package -Dmaven.test.skip=true
gradle项目打包并跳过测试:
chmod +x ./gradlew && ./gradlew build -x test
说明:如果服务器没有装gradle,则用gradlew命令。使用前需要先授权。如果服务器装有gradle。也可以采用下面的命令:
gradle build -x test
脚本使用
执行脚本时,可以进入到脚本所在目录执行下面命令:
sh deploy.sh
为了在不同目录执行,可以将脚本所在目录配置到环境变量,这样就可以在任意目录执行
vim /etc/profile
增加PATH路径
source /etc/profile
执行效果:
利用shell脚本自动更新部署SpringBoot项目相关推荐
- 使用shell脚本自动更新动态域名
背景 开发服务器放在公司内网,但需要从外网可以随意访问.而公司是通过拨号,因此IP不能固定. 传统的做法是:在路由器上将DDNS帐号密码填上去,然后就可以不管了.但这需要DDNS服务提供商,一般大型靠 ...
- jenkins整合gitee自动部署SpringBoot项目
文章目录 前提条件 一.服务器安装jenkins 方法一:简单快捷 第一步:将jenkens.war导入到系统 第二步:放在tomcat的webapp下面 第三步:访问http://ip:8080/j ...
- cs项目服务器更新,Visual Studio下运行PowerShell脚本自动更新项目里AssemblyInfo.cs文件的版本(自增小版本号)并发布到Nuget服务器上...
Visual Studio下运行PowerShell脚本自动更新项目里AssemblyInfo.cs文件的版本(自增小版本号)并发布到Nuget服务器上 附脚本[ update.ps1文件内容]: $ ...
- Jenkins下载安装、部署SpringBoot项目
目录 1. Jenkins是什么 2.安装Jenkins 3.Jenkins初始化 4.简单测试Jenkins 5.Jenkins部署SpringBoot项目 5.1 Jenkins的配置 5.2 J ...
- Jenkins结合Gitee(码云)自动化部署Springboot项目(比较详细)
Jenkins结合码云自动化部署Springboot项目 一.准备工作(有的话,可以忽略) 1. 安装wget 2. 安装jdk 3. 安装maven 4. 安装git 二.开始部署 (jenkins ...
- 从零学习Jenkins部署SpringBoot项目
前言 之前项目中虽然使用过 Jenkins,但是都只是使用,没有自己搭建过,完整部署一个项目.既然工作中没有独立部署过,那么就只能自己动手实操一番,技多不压身嘛. 一开始是在本机上下载安装 Jenki ...
- Docker 部署SpringBoot项目不香吗?
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:流星007 链接:toutiao.com/i68433912 ...
- docker镜像原理基础与dockerfile部署springboot项目
一.docker镜像原理 1.操作系统组成部分 进程调度子系统 进程通信子系统 内存管理子系统 设备管理子系统 文件管理子系统 网络通信子系统 作业控制子系统 Linux文件系统由bootfs和roo ...
- 通过Maven插件wagon-maven-plugin实现快速部署SpringBoot项目至服务器
通过Maven插件wagon-maven-plugin实现快速部署SpringBoot项目至服务器 一.wagon-maven-plugin概述 二.代码实例 2.1 配置 Linux 服务器用户名和 ...
最新文章
- 100年前的北京Vlog火了!大神利用AI修复古董纪录片,还原1920年的京城生活
- 2021-02-28 Matlab绘制短时傅里叶变换的频谱图和时间-频率-幅值三维图
- 如何在python中构造想要的时间戳参数
- 2021 年百度之星·程序设计大赛 - 初赛二 1001 签到(找规律,快速幂)
- react前端显示图片_在react里怎么引用图片
- Python实现cmd命令连续执行
- lableimg闪退_CV学习笔记(二十五):数据集标注与制作
- python 音速_中国大学MOOC的APP(慕课)2021用Python玩转数据章节答案
- 【AI视野·今日CV 计算机视觉论文速览 第238期】Fri, 1 Oct 2021
- 强化学习《基于价值 - MC方法和TD方法》
- Bootstrap导航条所支持的组件
- Linux Page Cache机制
- dw网页设计作品_UI设计需要学习哪些软件 如何成为高薪UI设计师
- [BZOJ 3622]已经没有什么好害怕的了(Dp+容斥原理)
- 微信java版s40_塞班微信S40版下载 v1.0 Beta-symbian微信S40版-pc6下载站
- Oracle快速入门(1)——ORACLE数据库简介
- 华旭 身份证读卡器测试软件_华旭身份证读卡器阅读软件8.0版本 支持免驱
- Chap.16 总结《CL: An Introduction》 (Vyvyan Evans)
- 公众号网课搜题系统-掘光者题库
- 基于FFmpeg+rtsp读取摄像头实时图像
热门文章
- gmapping原理和代码流程
- Java实现:两个mp3文件合成一个mp3文件
- HDFHDF-EOS格式说明
- 下一代防火墙及常用命令
- 2022年最新 Android面试核心知识点总结【涵盖当下最新最全面知识点】
- 用 JavaScript 实现三次贝塞尔动画库 - 前端组件化
- 微服务调用数据出现415错误 Content type ‘application/xml;charset=UTF-8‘ not supported
- python之画个小猪佩奇
- 企业微信 通讯录展示组件 canvas 支持方案 importKey‘ of undefined
- 每日一课 | Python数据可视化—多样化的图像