文章目录

  • 背景
  • 脚本源码
  • 脚本说明
  • 脚本使用

背景

因为项目中有多个模块,每个模块需要打包成一个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项目相关推荐

  1. 使用shell脚本自动更新动态域名

    背景 开发服务器放在公司内网,但需要从外网可以随意访问.而公司是通过拨号,因此IP不能固定. 传统的做法是:在路由器上将DDNS帐号密码填上去,然后就可以不管了.但这需要DDNS服务提供商,一般大型靠 ...

  2. jenkins整合gitee自动部署SpringBoot项目

    文章目录 前提条件 一.服务器安装jenkins 方法一:简单快捷 第一步:将jenkens.war导入到系统 第二步:放在tomcat的webapp下面 第三步:访问http://ip:8080/j ...

  3. cs项目服务器更新,Visual Studio下运行PowerShell脚本自动更新项目里AssemblyInfo.cs文件的版本(自增小版本号)并发布到Nuget服务器上...

    Visual Studio下运行PowerShell脚本自动更新项目里AssemblyInfo.cs文件的版本(自增小版本号)并发布到Nuget服务器上 附脚本[ update.ps1文件内容]: $ ...

  4. Jenkins下载安装、部署SpringBoot项目

    目录 1. Jenkins是什么 2.安装Jenkins 3.Jenkins初始化 4.简单测试Jenkins 5.Jenkins部署SpringBoot项目 5.1 Jenkins的配置 5.2 J ...

  5. Jenkins结合Gitee(码云)自动化部署Springboot项目(比较详细)

    Jenkins结合码云自动化部署Springboot项目 一.准备工作(有的话,可以忽略) 1. 安装wget 2. 安装jdk 3. 安装maven 4. 安装git 二.开始部署 (jenkins ...

  6. 从零学习Jenkins部署SpringBoot项目

    前言 之前项目中虽然使用过 Jenkins,但是都只是使用,没有自己搭建过,完整部署一个项目.既然工作中没有独立部署过,那么就只能自己动手实操一番,技多不压身嘛. 一开始是在本机上下载安装 Jenki ...

  7. Docker 部署SpringBoot项目不香吗?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:流星007 链接:toutiao.com/i68433912 ...

  8. docker镜像原理基础与dockerfile部署springboot项目

    一.docker镜像原理 1.操作系统组成部分 进程调度子系统 进程通信子系统 内存管理子系统 设备管理子系统 文件管理子系统 网络通信子系统 作业控制子系统 Linux文件系统由bootfs和roo ...

  9. 通过Maven插件wagon-maven-plugin实现快速部署SpringBoot项目至服务器

    通过Maven插件wagon-maven-plugin实现快速部署SpringBoot项目至服务器 一.wagon-maven-plugin概述 二.代码实例 2.1 配置 Linux 服务器用户名和 ...

最新文章

  1. 100年前的北京Vlog火了!大神利用AI修复古董纪录片,还原1920年的京城生活
  2. 2021-02-28 Matlab绘制短时傅里叶变换的频谱图和时间-频率-幅值三维图
  3. 如何在python中构造想要的时间戳参数
  4. 2021 年百度之星·程序设计大赛 - 初赛二 1001 签到(找规律,快速幂)
  5. react前端显示图片_在react里怎么引用图片
  6. Python实现cmd命令连续执行
  7. lableimg闪退_CV学习笔记(二十五):数据集标注与制作
  8. python 音速_中国大学MOOC的APP(慕课)2021用Python玩转数据章节答案
  9. 【AI视野·今日CV 计算机视觉论文速览 第238期】Fri, 1 Oct 2021
  10. 强化学习《基于价值 - MC方法和TD方法》
  11. Bootstrap导航条所支持的组件
  12. Linux Page Cache机制
  13. dw网页设计作品_UI设计需要学习哪些软件 如何成为高薪UI设计师
  14. [BZOJ 3622]已经没有什么好害怕的了(Dp+容斥原理)
  15. 微信java版s40_塞班微信S40版下载 v1.0 Beta-symbian微信S40版-pc6下载站
  16. Oracle快速入门(1)——ORACLE数据库简介
  17. 华旭 身份证读卡器测试软件_华旭身份证读卡器阅读软件8.0版本 支持免驱
  18. Chap.16 总结《CL: An Introduction》 (Vyvyan Evans)
  19. 公众号网课搜题系统-掘光者题库
  20. 基于FFmpeg+rtsp读取摄像头实时图像

热门文章

  1. gmapping原理和代码流程
  2. Java实现:两个mp3文件合成一个mp3文件
  3. HDFHDF-EOS格式说明
  4. 下一代防火墙及常用命令
  5. 2022年最新 Android面试核心知识点总结【涵盖当下最新最全面知识点】
  6. 用 JavaScript 实现三次贝塞尔动画库 - 前端组件化
  7. 微服务调用数据出现415错误 Content type ‘application/xml;charset=UTF-8‘ not supported
  8. python之画个小猪佩奇
  9. 企业微信 通讯录展示组件 canvas 支持方案 importKey‘ of undefined
  10. 每日一课 | Python数据可视化—多样化的图像