使用ANT脚本批量执行SQL,并且结合Jenkins自动化构建

背景:由于项目构建会涉及一些SQL脚本,每次需要run一堆的SQL来升级环境。所以想用一些脚本来自动完成这项工作。

思路:首先把所有需要跑的SQL放在一个文件夹内,按照跑的顺序编码排列好;再通过ANT脚本来读取这个文件夹下面的所有SQL,然后通过ANT连接数据库,按顺序逐个执行SQL;每个SQL执行完会输出一个log文件,记录执行状况;如果有一个SQL文件执行错误就会输出错误的log并停止执行下一步,(因为本人的SQL是有关联的,一旦前面有一个出错,后面也都会有点问题,所以需要停下来。如果你不想停止,那就捕获异常,继续执行下面的操作。)。当ANT执行出错以后,Jenkins的任务也会停止变红,并且发送消息到Email。

--------------------------------------------------------------------------------------

环境:

 

  • Linux环境
  • 安装ANT工具。
  • 下载mysql连接jar包。

编写ANT脚本:(由于是私有项目,只能共享部分实现思路code)

1. 首先,定义antlib task,后面会用到antlib内置的资源比较器。


2. 定义DB连接的一些信息(定义property),此处也可以使用外部的properties文件来导入。

3. 定义一个target:runSqlInFolder

使用try catch包裹SQL执行标签。(我这里用的是mysql,所以用的是sql标签,如果使用oracle可以使用sqlplus)

下面的是为了让Jenkins感受到ANT执行出错了,然后Jenkins就会自动停止任务。

是自己定义的标签。


    
        
        Finished running all SQL
        File moved to backup folder:
        ${sqlbakdir}
    
    
        Error found when running SQL
        Log file can be found in:
        ${sqlbakdir}/err
        
        Error Occur
    
    
    

4. 定义execdirsql标签:

使用antlib comparator对SQL文件进行排序。

然后传入DB连接参数,执行SQL。


    
    
    
        
            
                
            
        
        
            
            SQL: ${sqlFileName}
            
        
    

5. 定义execsql标签:

通过sql标签执行sql文件,通过record标签记录这段执行的日志并且输出。

这里要注意的时候如果执行procedure就需要设置delimiter,我这里是通过我SQL文件的命名来区分的是不同SQL还是procedure。


    
    
    
    
    
    
    
    
    
        
            
                
            
                
                     
                
            
            
                
                     
                
            
            
        
    

到这里ANT脚本的编写也就完成了。

Jenkins的配置:

这里有2种方法来执行ANT脚本。

1. 通过Jenkins ANT插件来执行。

2. 通过Shell脚本直接执行ANT脚本。

测试时我一开始使用的第一种方法,但是使用record标签,Jenkins ANT插件执行的时候不会自动创建文件,就算预定义一个文件,也不写入。(不是Linux权限问题,很奇怪,由于时间问题没有去研究解决,因为有别的方法带替了)。

所以这里我使用的时候是第2个方法,也就是直接使用shell直接执行ANT脚本。

ant runSqlInFolder

结果:

执行失败示例:

使用ANT脚本批量执行SQL,并且结合Jenkins自动化构建_第1张图片

执行成功示例:

使用ANT脚本批量执行SQL,并且结合Jenkins自动化构建_第2张图片

--------------------------------------------------------------------------------------

如果有对上面实现有问题的或者有更好的思路的,欢迎评论交流。

转载请注明出处。

 

 

 

你可能感兴趣的:(脚本)