Jenkins实现带数据表更新的自动化部署流程

一、前言

  在《Jenkins+maven+Git实现源码的部署和发布》这一篇文章中,已经介绍了如何基于Jenkins+Maven+Git实现从代码库到项目部署的自动化部署全流程。然而在实际的生产环境中,新功能的上线,往往会带来数据库结构的变化,初始化数据的增加等。而在生产环境一般应用服务器、数据库服务器都是分离的,同时应用服务器在互联网可以访问的环境,而数据库服务器是互联网隔离的环境(一般情况)。这篇文章,主要介绍基于这种网络环境的生成环境,如何实现带数据表更新的自动化部署流程。

二、测试环境
  1. 在云端(华为云 Windows环境)部署了了Jenkins环境。同时在《Jenkins+maven+Git实现源码的部署和发布》中的配置已经完成。然后还安装了Publish over SSH插件,并在Configure System中配置了Publish over SSH。
    在这里插入图片描述
  2. 服务器环境
    除了云端部署Jenkins的服务器外,我还在本地部署了两台虚拟机环境(CentOS7),其中一台部署了JDK、Tomcat等环境,内网地址是:192.168.1.10,该服务器即为Web应用服务器;另外一台为数据库服务器,部署了Mysql环境,内网地址:192.168.1.9。这两个服务器是在一个局域网内,而Web服务器的22端口、8080端口都映射到了互联网上,即可以通过公网地址进行访问该端口,其中22端口是SSH来使用,8080端口是Tomcat来使用。
  3. 测试使用的项目
    项目地址:https://gitee.com/hsh2015/jenkins-test。该项目就是一个最简单的Spring Boot项目,同时,在resources目录下,有需要更新的SQL文件。
三、自动化流程配置
1、 源码管理,即配置Git

在这里插入图片描述

2、Spring Boot项目构建

在这里插入图片描述

3、数据更新配置

  这部分是本篇内容的核心,如何实现在项目部署前,先更新对应的Sql语句呢?这些Sql语句应该如何管理呢?带着这些问题,我们开始这进行下面内容。

  1. 数据更新语句存储
    数据更新语句,这里会存储在resources/sql目录下。每次提交,都要新的SQL文件,后续会根据文件名称进行SQL语句的执行。
  2. SQL执行时机
    SQL文件执行,一般放在系统部署前执行,本示例中放到了spring boot项目构建后,项目部署前。
  3. 需要执行的SQL文件判断
    每次提交新功能的代码,如果有需要更新数据表的,就建立对应的SQL文件。然后进行部署的时候,读取该目录下所有的SQL文件,和当前系统已经执行的SQL文件对比(执行过的SQL文件,会添加到备份目录中),没有执行过SQL文件,然后执行SQL操作即可。
  4. 执行方式
    执行SQL文件,我们首先需要通过“Send files or execute commands over SSH”把对应的SQL文件,远程复制到应用服务器(数据库服务无法互联网连接)上,然后在应用服务器上,通过SSH命令执行SQL文件即可。
#!/bin/sh
for dir in $(find  /usr/soft/sql/sql/*.sql) #循环sql文件所在的目录
do
 if [ ! -f  "/usr/soft/sql/sql/bak/${dir##*/}" ];then#判断备份文件中是否存在,存在说明已经执行过,就不再执行
	 echo $dir;
	 echo ${dir##*/};
         scp -r $dir  [email protected]:/usr/local/soft/sql #复制文件到数据库服务器,指定目录
	 ssh [email protected] "mysql -hlocalhost -uroot -p123456 test --default-character-set=utf8  < /usr/local/soft/sql/${dir##*/};exit;" #通过ssh命令执行数据SQL更新语句,注意:执行命令需要使用双引号
	 mv $dir /usr/soft/sql//sql/bak/${dir##*/};#把执行过的SQL文件,放到本分目录下
 fi
done  

在这里插入图片描述

4、项目发布

在这里插入图片描述

5、测试

  访问系统,出现如下页面,说明项目部署成功了(中文乱码未处理,见谅)。
在这里插入图片描述
  然后查看数据库表,如果数据插入成功,说明SQL也执行成功了。

注: 该项目单纯是为了演示部署和数据更新,所以,这次更新的SQL语句和项目是没有任何关系的,只是为了测试可以在部署前,完成SQL文件的执行而已。

发布了48 篇原创文章 · 获赞 3 · 访问量 3112

猜你喜欢

转载自blog.csdn.net/hou_ge/article/details/103682443