阅读 338

打造一款适合自己的快速开发框架-持续部署之一键发布脚本设计与实现

前言

任何系统都会涉及到部署,在系统测试联调期间,部署的频率也会很高,而如何提高部署效率,这也是做快速开发框架要考虑的。

部署方案

  • 方案一(不是很推荐)

  1. 服务器上旧包备份
  2. 本地打包
  3. 将本地包上传到服务器
  4. 重启服务

实施方式:可以是全手动,也可以借助maven插件,如wagon-ssh等。

  • 方案二(本文重点)

  1. 服务器上旧包备份
  2. 服务器上拉取最新代码
  3. 服务器上打包
  4. 重启服务

实施方式: 一般采用该方式的,都会写有一键发布脚本。

  • 方案三(有条件的强烈推荐)

使用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
复制代码

小结

该脚本只是完成了简单的一键发布功能,对于备份还原、异常处理等并没有妥善处理,不过一般的快速发布场景也基本上满足了。

项目源码地址

  • 后端

gitee.com/mldong/mldo…

  • 前端

gitee.com/mldong/mldo…

相关文章

打造一款适合自己的快速开发框架-先导篇

打造一款适合自己的快速开发框架-后端脚手架搭建

打造一款适合自己的快速开发框架-集成mapper

打造一款适合自己的快速开发框架-集成swaggerui和knife4j

打造一款适合自己的快速开发框架-通用类封装之统一结果返回、统一异常处理

打造一款适合自己的快速开发框架-业务错误码规范及实践

打造一款适合自己的快速开发框架-框架分层及CURD样例

打造一款适合自己的快速开发框架-mapper逻辑删除及枚举类型规范

打造一款适合自己的快速开发框架-数据校验之Hibernate Validator

打造一款适合自己的快速开发框架-代码生成器原理及实现

打造一款适合自己的快速开发框架-通用查询设计与实现

打造一款适合自己的快速开发框架-基于rbac的权限管理

打造一款适合自己的快速开发框架-登录与权限拦截

打造一款适合自己的快速开发框架-http请求日志全局处理

打造一款适合自己的敏捷开发框架-上传模块设计与实现