自定义Gradle Task实现一键批量部署Springboot应用

在未使用Jenkins自动化部署工具之前,我们部署使用gradle构建的单个springboot应用的流程大致如下:

1、在idea使用gradle build命令编译打包jar包;

2、打开jar包存放的windows目录窗口;

3、打开访问服务端机器的SSH工具软件并前进到部署目录;

4、上传第2步jar包到第3步目录

5、停止当前应用进程;

6、备份当前应用jar包;

7、修改将要部署的jar包名称为当前环境指定的文件名;

8、启动应用

上面部署方式对于只有1、2个环境的应用来说还可以接受,不算太麻烦,但是对超过3个以上环境的部署会导致以下问题:

1、步骤繁琐、多环境打包前要临时调整端口、数据库服务器配置,导致部署耗时较多;

2、全部手工操作容易出错。

为解决上面两个问题我研究了gradle的自定义task的相关配置知识,设计了一个一键部署到多个环境的task任务,此task的特点 如下:

1、只需要通过点击一次idea gradle插件自定义的deploy命令即可实现编译、打jar包、批量部署到多个环境

2、部署时会实时显示简单的部署日志,便于监控部署情况;

3、模块化,方便添加新部署环境

3、节约部署时间,一旦配置测试好就可以避免手动操作易出错的问题;

假设我们要部署的应用叫“养护管理”(简称“养管”),它是一个包含spring application启动器的bimgis-mms-app模块+N个业务模块组成的应用,

我们以此为例演示如何一键部署到服务端,养管有dev(开发)、test(测试)两个环境需要部署:

step1 打开idea gradle插件面板

step2 双击下图中的deploy命令(路径:bimgis-mms-app/Tasks/other/deploy)

step3 查看部署日志,确认部署是否成功

上面deploy命令内部运行流程如下:

上图运行流程中涉及的8个步骤,依赖四类配置文件:

(1)build.gradle:存放在本地PC项目目录,负责完成第1、2步骤;

(2)restart.sh:存放在服务主机的部署目录,负责完成第3、4、5、6步骤;

(3)   application.yml:springboot通用配置文件,负责完成第7步,设置加载哪个特定配置文件(profiles.active)、数据库连接池配置、mybatis配置等;

(4)appliction-envName.yml:springboot特定环境配置文件,负责完成第8步,“envName“指环境名称,例如appliction-dev.yml,spring容器会先加载第(3)类文件然后根据其

配置的profiles.active=dev,再加载appliction-dev.yml的配置,所以此文件用来保存不同环境的应用端口号、数据库服务器配置等差异化配置信息。

以养管平台为例,进一步说明配置方法,养管有dev、test两个部署环境,这两个环境应用端口号、数据库配置如下:

一、dev环境

  • 应用端口号:8383
  • 数据库IP/端口号:192.168.201.156:3306
  • 数据名称:bim_mms_0

二、test环境

  • 应用端口号:8282
  • 数据库IP/端口号:192.168.201.155:3306
  • 数据名称:bimgis_mms_lexi

我们将以上具有差异的配置信息分别存放到appliction-dev.yml、appliction-test.yml:

接着在appliction.yml里的profiles.active属性配置默认加载appliction-dev.yml文件配置,即启用应用时会加载dev环境的配置:

然后在build.gradle添加自定义任务deploy脚本:

//##############部署Jar包到服务端脚本 start ###############
//引用与服务端通信插件
buildscript {
 repositories {
 jcenter()
 }
 dependencies {
 classpath ‘org.hidetake:gradle-ssh-plugin:2.9.0‘
 }
}
apply plugin: ‘org.hidetake.ssh‘

//部署环境IP及登录账号
remotes {
 webServerDev {
 host = ‘192.168.201.156‘
 user = ‘accountName‘
 password = ‘password‘
 }

 webServerTest {
 host = ‘192.168.201.155‘
 user = ‘accountName‘
 password = ‘password‘
 }
}

def HOST_LIST = ["dev","test"]//部署环境列表

//部署文件存放位置及部署shell命令
def SSH_RUN (String host) {
 ssh.settings {
 knownHosts = allowAnyHosts
   }

 ssh.run {
 if("dev" == host){
 session(remotes.webServerDev) {
 put from: "F:/IdeaProjects/bim/bimgis-web-application-mms/bimgis-mms-app/build/libs/bimgis-mms-app-1.0.0.jar", into: ‘/home/mmsuser/deploy/backend‘
 execute """
 cd /home/mmsuser/deploy/backend
 sh restart.sh dev;
 """
 }
 }else if("test" == host){
 session(remotes.webServerTest) {
 put from: "F:/IdeaProjects/bim/bimgis-web-application-mms/bimgis-mms-app/build/libs/bimgis-mms-app-1.0.0.jar", into: ‘/home/mmsuser/mms‘
 execute """
 cd /home/mmsuser/mms
 sh restart.sh test;
 """
 }
 }
 }
}

//部署任务执行入口
task deploy {

 doLast {
 println("【############################开始部署############################】")
 int fileCount=0
 HOST_LIST.each {String host->
 fileCount++
         println("第${fileCount}个,hostName:${host}")

 println("部署到服务端")
 //部署到服务端
 SSH_RUN(host)

 println("部署成功!")

 }
 }
}

deploy.dependsOn(build)//编译和打jar包

//##############部署Jar包到服务端脚本 end ###############
 

test环境服务主机执行的restart.sh脚本代码如下:

#! /bin/sh
ORG_FILE=‘mms-app-1.0.0.jar‘ #原始文件
DEPLOY_FILE=‘mms-app-1.0.0-8282.jar‘ #部署文件
DEPLOY_LOG=‘mms-app-1.0.0-8282.log‘ #日志文件

echo ‘deploy task start...‘

#检查待部署的原始文件是否存在
echo ‘check orgFile is exist...‘
if [ ! -f "$ORG_FILE" ];then
echo "$ORG_FILE is not exist! deploy task fail!"
exit 1
fi

#停止旧版本应用
echo ‘shutdown system...‘
PID=`ps x|grep $DEPLOY_FILE|grep -v grep |awk ‘{print $1}‘`

if [ -z "$PID" ]; then
echo "system process is not exist,skip to next step"
else
kill -15 $PID
sleep 5 #暂停5秒等待上一步system的进程退出
fi

#备份旧版本应用
echo ‘backup...‘
rm $DEPLOY_FILE‘.bak‘
rm $DEPLOY_LOG
mv $DEPLOY_FILE $DEPLOY_FILE‘.bak‘

echo ‘copy orgFile to deployFile‘
cp $ORG_FILE $DEPLOY_FILE

#启动新版本应用
echo ‘boot system...‘
if [ $# -lt 1 ];then
echo "no spring active arg,boot on default active profile" #未指定加载哪个appliction-envName.yml
nohup java -jar $DEPLOY_FILE > $DEPLOY_LOG 2>&1 &
else
echo "boot on specified spring active profile: $1"#已指定加载appliction-envName.yml
nohup java -jar $DEPLOY_FILE --spring.profiles.active=$1 > $DEPLOY_LOG 2>&1 &
fi

exit 0

如果你要增加一个新部署环境add,需要做以下工作:

1、增加appliction-add.yml文件;

2、编辑build.gradle,增加如下红色代码:

//部署环境IP及登录账号
remotes {
webServerAdd {
host = ‘192.168.201.154‘
user = ‘userName‘
password = ‘password‘
}
}

def HOST_LIST = ["dev","test","add"]//部署环境列表

ssh.run {
if("add" == host){
session(remotes.webServerAdd) {
put from: "F:/IdeaProjects/bim/bimgis-web-application-mms/bimgis-mms-app/build/libs/bimgis-mms-app-1.0.0.jar", into: ‘/home/mmsuser/deploy/backend‘
execute """
cd /home/mmsuser/deploy/backend
sh restart.sh add;
"""
}
}else if("test" == host){
session(remotes.webServerTest) {
put from: "F:/IdeaProjects/bim/bimgis-web-application-mms/bimgis-mms-app/build/libs/bimgis-mms-app-1.0.0.jar", into: ‘/home/mmsuser/mms‘
execute """
cd /home/mmsuser/mms
sh restart.sh test;
"""
}
}
}
}

3、增加对应的restart.sh文件

 

至此对一键部署应用到多环境的介绍进入尾声,当前这种部署方式适合10人以下的开发团队在未使用部署流线工具之前过渡使用,ssh.run部分执行的shell脚本也可以替换为docker命令

来支持部署到docker容器,此文仅作为优化项目开发流程的抛砖引玉,希望能对大家平时开发有所帮助,欢迎大家留言交流!

原文地址:https://www.cnblogs.com/wind1984/p/12359536.html

时间: 2024-11-13 14:55:59

自定义Gradle Task实现一键批量部署Springboot应用的相关文章

ansible一键批量部署nfs服务

一键安装nfs服务 #install nfs_server - hosts: 172.16.1.31    服务端   tasks:     -name: installnfs-utils rpcbind       yum: name=nfs-utils,rpcbind     -name: copyconffile       copy: src=/etc/ansible/nfs_conf/exports dest=/etc/exports #将nfs配置文件配置好直接发送过去     -n

Windows 10企业批量部署实战之ADK 10安装

本章为大家带来Windows 10企业批量部署实战之ADK 10安装,本章浅谈ADK 10的作用.新功能及安装操作. 适用于 Windows 10 的 Windows 评估和部署工具包 (ADK),以获取用于自动进行 Windows 10 大规模部署的全新和改进的部署工具.Windows ADK 包括: 用于自定义 Windows 10 映像的 Windows 映像和配置设计器 (Windows ICD) 用于评估系统或组件的质量和性能的 Windows 评估工具包和 Windows Perfo

如何批量部署Office 2013 (二)——OCT设置

OCT是Office自定义工具的简介,通过OCT我们可以在安装过程中做一些自定义的配置,比如配置安装密钥,选择安装组件等,听起来和MDT的一部分功能有些类似,但是使用方法上不尽相同,下边我们就一起来看一下吧. 首先我们讨论的是Office的批量部署,批量部署一般只存在于企业环境中,而企业环境中一般我们用的都是VL版的Office,相对应的,OCT这个功能也仅仅存在于VL版Office中. 使用OCT的方法很简单 1.将Office2013光盘加载到虚拟光驱中 2.双击虚拟光驱进入根目录 3.点击

如何批量部署Office 2013 (一)——简介

Office软件相信所有人应该都会安装,挂载镜像然后一直点下一步就可以了,但是谈到如何批量部署Office,如何来实现?另外在企业环境中Office软件还会存在激活的问题,如果是KMS那么可以直接通过搭建KMS服务器的方式来实现Office以及Windows的激活,如果是MAK我们还需要将密钥输入到每一台计算机当中,我们都知道批量部署Windows时可以通过MDT提前将密钥输入进去,那么Office如何来操作呢? Office的部署方式和Windows不大相同,但是其实也可以同样通过MDT来实现

一键自动化部署(定制rpm包,yum仓库)

部署--前篇 上午将MySQL多实例部署完成,由于有公司特定一些需求,需要源码安装,现在需要批量部署,如果一台台部署,就太过麻烦,而且浪费时间,这个时候自动化部署 就体现出价值了 我们将MySQL制作定制化rpm包,然后放到我们的yum仓库中,在将yum所有客户端,都指向yum源,之后就是喝喝茶,看看片,轻松批量部署了,废话不多说,开干. 如果MySQL多实例还没配置的,或不了解软件的安装方式 的 请参考:http://qiuyt.blog.51cto.com/1229789/1920686 一

腾讯云批量部署服务器环境的方法

批量部署需要用到腾讯云自带的自定义镜像功能,大致方法:先将部署好环境的云服务器制作自定义镜像,再通过自定义镜像购买新的云服务器,以达到批量部署的目的.重装系统时,也可以选择使用自定义镜像来重装. 一.在qcloud控制台,云服务器管理页面中,勾选服务器,点击更多操作,将服务器关机后选择制作镜像,将已经部署好环境的其中一台服务器制作镜像. 输入镜像名称,以及描述信息,点击确定按钮,服务器就会关机制作镜像了. 已经制作好的镜像如下: 二.镜像制作好之后,其他的多台服务器在重装系统或者新购多台服务器时

如何批量部署Office 2013 (五)——使用MDT部署Office

除了使用上述的方法,也就是组策略可以实现批量部署Office之外,我们还可以通过MDT在部署操作系统的过程中将Office软件一同部署下去 两种方法具体用哪种还需要根据具体环境考量 下面来开始介绍使用MDT部署Office的方法 1.首先执行手册中第一个步骤,自定义Office配置文件创建一个无人值守的Office配置文件 2.将Office安装文件拷贝到MDT服务器中,并将制作好的配置文件拷贝到Update 3.打开MDT控制台,右键点击新建应用程序 4.点击"Next" 5.输入对

CentOS 6.3下CHEF批量部署APACHE

之前的博文我介绍了如何搭建CHEF环境以及创建编写cookbook,resipes用来批量将cookbook下发到客户端执行相应的部署操作. NOW,本篇文档我们会详细介绍如何利用CHEF独有的框架语言来批量部署安装APACHE,并加载其HTTPS模块等功能. 相信如果你看了本篇文档,利用CHEF实现一个批量自动化部署将不是什么难事. CHEF环境部署详见: http://showerlee.blog.51cto.com/2047005/1408467 操作系统:CentOS-6.3-x86-6

十六、MDT 2013 Update 1批量部署-应用程序导入及自动安装(含OFFICE 2007安装)

MDT 2013 Update 1批量部署与WDS部署服务相比就是多了应用程序的安装,可以在操作系统部署时可以有选择的安装或指定安装某个特定的应用程序,便于最终用户开机即用.下面是MDT 2013 UPDATE 1导入应用程序,其中包括OFFICE 2007整合SP3方法以及OFFICE 2007定制安装. 一. MDT 2013 UPDATE 1导入应用程序 MDT 2013 UPDATE 1控制台已经导入了6个应用程序,从名字可以看出具体应用软件的作用 硬件检测软件AIDA64,由于这个是绿