前言
任何系统都会涉及到部署,在系统测试联调期间,部署的频率也会很高,而如何提高部署效率,这也是做快速开发框架要考虑的。
部署方案
-
方案一(不是很推荐)
- 服务器上旧包备份
- 本地打包
- 将本地包上传到服务器
- 重启服务
实施方式:可以是全手动,也可以借助maven插件,如wagon-ssh等。
-
方案二(本文重点)
- 服务器上旧包备份
- 服务器上拉取最新代码
- 服务器上打包
- 重启服务
实施方式: 一般采用该方式的,都会写有一键发布脚本。
-
方案三(有条件的强烈推荐)
使用jenkins,流水线是真的香。
其实不管使用何种方案,最终实施都会有交叉部分,只是交叉部分是手动、半自动、还是全自动的问题而已。
一键发布脚本设计
环境说明
因为docker涉及内容略多,不是这一篇文章就能写完的,所以为了简单起见,这里就暂时不用docker了。不过后续会出docker的系列文章。
操作系统:
[root@mldong ~]# cat /etc/redhat-release
CentOS Linux release 8.1.1911 (Core)
jdk版本
[root@mldong ~]# java -version
java version "1.8.0_131"
Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)
maven版本
[root@mldong ~]# mvn -v
Apache Maven 3.5.3 (3383c37e1f9e9b3bc3df5050c29c8aff9f295297; 2018-02-25T03:49:05+08:00)
Maven home: /usr/local/maven/apache-maven-3.5.3
Java version: 1.8.0_131, vendor: Oracle Corporation
Java home: /usr/local/java/jdk1.8.0_131/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "4.18.0-147.8.1.el8_1.x86_64", arch: "amd64", family: "unix"
git版本
[root@mldong ~]# git --version
git version 2.18.2
基础环境的安装这里就不多做介绍了,如后续有时间,会考虑弄一个一键安装上述环境的脚本。
常用命令说明
git相关命令
克隆最新代码-用户名+密码方式:
git clone https://username:password@gitee.com/mldong/mldong.git
如果用户名包含username包含@,则使用%40替换,如:
git clone https://524719755%40qq.com:Password@gitee.com/mldong/mldong.git
当然,本项目是开源的,并不需要账号密码
git clone https://gitee.com/mldong/mldong.git
克隆最新代码-公钥部署方式
git clone git@gitee.com:mldong/mldong.git
可以先查公钥是否存在
cat ~/.ssh/id_rsa.pub
如果不存在则需要在服务器上执行如下命令生成公钥:
ssh-keygen -t rsa -C "666@qq.com"
666@qq.com
为个人邮箱
三次回车,查看公钥
cat ~/.ssh/id_rsa.pub
码云上配置公钥,略(管理->部署公钥管理->添加公钥)
拉取最新代码
假设源码目录为:/java_projects/source/mldong
先进入源码目录
cd /java_projects/source/mldong
拉取最新代码
git pull
查看当前版本号
git rev-parse HEAD
maven相关命令
清理and打包
mvn clean package -B
跳过单元测试
mvn clean package -B -DskipTests
指定某个配置文件
mvn clean package -B -s /root/.m2/settings-docker.xml -DskipTests
java相关命令
启动服务
java -jar xxx.jar
启动服务并指定最大堆和最小堆
java -server -Xms512m -Xmx512m xxx.jar
启动服务并指定端口和配置文件
java -server -Xms512m -Xmx512m xxx.jar --server.port=18081 --spring.profiles.active=test
启动服务并在后台运行
nohup java -server -Xms512m -Xmx512m xxx.jar --server.port=18081 --spring.profiles.active=test > nohup.log
如果log已有日志,可以去掉nohup.log
nohup java -server -Xms512m -Xmx512m xxx.jar --server.port=18081 --spring.profiles.active=test > /dev/null 2>log &
linux相关命令
查询某个包含xxx.jar的服务
ps -ef | grep xxx.jar | grep -v grep
样例:
[root@mldong ~]# ps -ef | grep mldong-admin.jar
root 17504 1 0 15:07 ? 00:00:46 java -server -Xms512m -Xmx512m -jar /java_projects/mldong-admin/mldong-admin.jar --server.port=18081 --spring.profiles.active=test
root 19118 14014 0 21:00 pts/0 00:00:00 grep --color=auto mldong-admin.jar
查询某个包含xxx.jar的服务并去掉grep的行
ps -ef | grep xxx.jar | grep -v grep
样例:
[root@mldong ~]# ps -ef | grep mldong-admin.jar
root 17504 1 0 15:07 ? 00:00:46 java -server -Xms512m -Xmx512m -jar /java_projects/mldong-admin/mldong-admin.jar --server.port=18081 --spring.profiles.active=test
查询某个包含xxx.jar的服务并获取其pid
ps -ef | grep xxx.jar | grep -v grep | awk '{print $2}'
样例:
[root@mldong ~]# ps -ef | grep mldong-admin.jar | grep -v grep | awk '{print $2}'
17504
杀死某个服务进程
kill -9 pid
如上面的:
kill -9 17504
开始编码
目录说明
├── /java_projects 管理端接口
├── mldong-admin
├── config
└── application-test.yml
├── logs 日志目录
├── mldong-admin.jar jar包
├── buildAndRestart.sh 重新构建项目并重启服务脚本
├── restart.sh 重启服务脚本
└── nohub.out 当前服务运行日志
└── source
├── mldong 源码根目录
├── mldong-admin
└── pom.xml
├── mldong-common
└── pom.xml
├── mldong-generator
└── pom.xml
├── mldong-mapper
└── pom.xml
核心文件说明
/java_projects/mldong-admin/restart.sh
重启服务脚本
#!/bin/bash
jar_name=mldong-admin.jar
jar_path=/java_projects/mldong-admin
jar_pid=$(ps -ef | grep $jar_path/$jar_name | grep -v grep | awk '{print $2}')
echo "$jar_name PID $jar_pid"
if [ -n "$jar_pid" ]
then
#!kill -9 强制终止
echo "kill -9 强制终止" $jar_pid
kill -9 $jar_pid
fi
nohup java -server -Xms512m -Xmx512m -jar $jar_path/$jar_name --server.port=18081 --spring.profiles.active=test > $jar_path/nohub.out &
echo "**********************$jar_name*************************"
/java_projects/mldong-admin/buildAndRestart.sh
重新构建项目并重启服务脚本
#!/bin/bash
# 源码存放根目录
source_dir=/java_projects/source
# 父工程目录
parent_dir=$source_dir/mldong
# 需要打包的项目名称
project_name=mldong-admin
# 项目部署目录
project_dir=/java_projects/$project_name
# 备份目录
backup_dir=/backup/$project_name
# git仓库地址(使用ssh方式的,需要去配置部署公钥)
git_url=git@gitee.com:mldong/mldong.git
if [ -f "$project_dir/$project_name.jar" ]; then
echo "备份旧包"
mkdir -p $backup_dir
cp $project_dir/$project_name.jar $backup_dir/`date +"%Y%m%d%H%M%S"`.jar
fi
if [ -d "$source_dir" ]; then
echo "源码存放根目录${source_dir}已存在"
else
echo "源码存放根目录不存在,创建${source_dir}"
cp -p $source_dir
fi
if [ -d "$parent_dir" ]; then
echo "源码已存在,git pull"
cd $parent_dir
git pull
else
echo "源码不存在,git clone"
git clone $git_url $parent_dir
fi
git_version=$(git rev-parse HEAD)
echo "当前版本号:${git_version}"
# 进入项目源码目录
cd $parent_dir
# 打包
mvn clean package -B
# 这里需要判断打包是否成功
if [ $? -ne 0 ]; then
echo "打包失败"
else
# 复制新包到部署目录
cp $parent_dir/$project_name/target/$project_name.jar $project_dir/$project_name.jar
# 进入部署项目
cd $project_dir
# 重启服务
bash restart.sh
fi
小结
该脚本只是完成了简单的一键发布功能,对于备份还原、异常处理等并没有妥善处理,不过一般的快速发布场景也基本上满足了。
项目源码地址
- 后端
- 前端
相关文章
打造一款适合自己的快速开发框架-集成swaggerui和knife4j
打造一款适合自己的快速开发框架-通用类封装之统一结果返回、统一异常处理
打造一款适合自己的快速开发框架-mapper逻辑删除及枚举类型规范