当前位置: 首页 > news >正文

Jenkins+ant+mysql 自动化构建脚本文件输出日志

        相信大多数金融行业的都有遇到过,想通过最简洁的方式去执行响应的脚本文件,比如测试人员、运维人员可以通过Jenkins进行构建SQL执行器,就能将SQL文件进行执行,并且输出相应的日志。

        通过这种方式,开发人员只需将SQL文件,放在指定的目录,测试人员只需要在Jenkins中进行构建执行就行。

        这套方案我在网上找了很多文章,都没有给出完整的Demo,都是一些代码块。我相信有些同学是不动ant,并且不懂build.xml的相关节点,那么今天我把我的搭建经验记录下来,并且与大家分享,不喜勿喷。

        涉及的相关JAR包如下:

                ant-contrib-1.0b3.jar

                mysql-connector-java-8.0.15.jar

                apache-ant-1.9.16-bin.zip

                下载地址:阿里云盘分享

                Ant下载地址:Apache Ant - Binary Distributions

 

1)编写build.xml

        新建一个build.xml

<?xml version="1.0"?>
	<project xmlns='antlib:org.apache.tools.ant'>
		<taskdef resource="net/sf/antcontrib/antlib.xml" classpath="ant-contrib-1.0b3.jar"/>
		 <path id="project.class.path">
			<fileset dir="/dclife/mobile_team_sql/map/ant-script/lib" includes="*.jar" />
		</path>
		<property name="encoding" value="UTF-8" /><!--UTF-8-->
		<property file="build.properties" /><!--引入文件-->
    <target name="runSqlInFolder">
        <echo>Run the SQL at Folder: ${sqlfolder}</echo>
        <echo>DB URL: ${db.url}</echo>
        <echo>DB User: ${db.user}</echo>   
		<trycatch property="errMsg">
            <try>            		
                <for param="folder">
                    <path>
                        <sort xmlns:rcmp="antlib:org.apache.tools.ant.types.resources.comparators">
                            <dirset dir="${sqlfolder}" includes="*" />                        
                        </sort>
                    </path>
                    <sequential>
                    <echo>SQL Folder: @{folder}</echo>    
                    <for param="file">
                        <path>
                            <sort xmlns:rcmp="antlib:org.apache.tools.ant.types.resources.comparators">
                                <fileset dir="@{folder}" includes="*.sql" casesensitive="false"/>                                            
                            </sort>	
                        </path>
                        <sequential>
                        <echo>SQL: @{file}</echo>                             
                        <execsql
                            dbUrl="${db.url}" 
                            dbuser="${db.user}" 
                            dbpwd="${db.pwd}"
                            sqlfile="@{file}"
                            logfile="${sqllogdir}/${sqllogfile}_info.log"/>
                        </sequential>
                    </for>
                    <move file="@{folder}" todir="${sqlbakdir}"/> 
                    </sequential>    
                </for>
                <echo>Finished running all SQL</echo>
                <echo>File moved to backup folder:</echo>
                <echo>${sqlbakdir}</echo>
			    </try>
				<catch>
					<echo>Error found when running SQL</echo>
					<echo>Log file can be found in:</echo>
					<echo>${sqllogdir}</echo>
					<move file="${sqllogfile}_info.log" todir="${sqllogdir}"/>
					<fail>Error Occur</fail>
				</catch>
				<finally>
				</finally>
			</trycatch>
    </target>
	<macrodef name="execsql" description="Run single SQL file.">
        <attribute name="dbUrl" description="Host Name/ IP of the DB"/>
        <attribute name="dbuser" description="DB User name"/>
        <attribute name="dbpwd" description="DB Password"/>
        <attribute name="sqlfile" description="SQL file to be run"/>
        <attribute name="logfile" default="sql.log" description="Log file"/>
        <sequential>
            <echo>Log file @{logfile}</echo>    
            <record name="@{logfile}" action="start"/>    
				<sql driver="${driver}"
					url="@{dbUrl}"
					userid="@{dbuser}"
					password="@{dbpwd}"
					encoding="${encoding}"
					src="@{sqlfile}"
					classpathref="project.class.path"
					>
				</sql>
            <record name="@{logfile}" action="stop"/> 
        </sequential>
    </macrodef>
</project>

2)创建build.properties

db.url=jdbc:mysql://IP地址:3306/库名?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useSSL=false
db.user=数据库用户
db.pwd=数据库密码
driver=com.mysql.cj.jdbc.Driver
Sqllogfile=logs/info.log

3)Linux安装Ant

        将下载好的apache-ant-1.9.16-bin.zip的压缩包,上传至linux服务器,并且解压该文件夹

        unzip   apache-ant-1.9.16-bin.zip

 4)jenkins创建项目

        

5)添加Invoke Ant

         6)执行结果

相关文章:

  • Unity 渲染YUV数据 ---- 以Unity渲染Android Camera数据为例子
  • 高德骨子里还是个「理工男」
  • Vue指令学习 | 零基础入门
  • promise执行顺序面试题令我头秃,你能作对几道
  • 基于springboot的图书管理系统设计与实现
  • const char *p,char const *p和char *const p区别
  • disruptor (史上最全之1):伪共享原理性能对比实战
  • 网络安全防御体系建设-防守实例
  • 基于Java+SpringBoot+Thymeleaf+Mysql在线外卖点餐系统设计与实现
  • 手把手带你免费申请《软件著作权》 超详细计算机软件著作权申请教程 文末送模板
  • Mysql中级篇
  • 小学生python游戏编程2----飞机大战1
  • 用python实现自动回复QQ消息——不到60行
  • 第十三届蓝桥杯C++B组国赛E题——出差 (AC)
  • 【大数据ETL工具,Kettle的学习和使用】
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • 【面试系列】之二:关于js原型
  • angular学习第一篇-----环境搭建
  • C学习-枚举(九)
  • Java反射-动态类加载和重新加载
  • Node.js 新计划:使用 V8 snapshot 将启动速度提升 8 倍
  • October CMS - 快速入门 9 Images And Galleries
  • php的插入排序,通过双层for循环
  • React中的“虫洞”——Context
  • Service Worker
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 经典排序算法及其 Java 实现
  • 区块链共识机制优缺点对比都是什么
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • 详解NodeJs流之一
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • 阿里云ACE认证学习知识点梳理
  • ​虚拟化系列介绍(十)
  • (4) PIVOT 和 UPIVOT 的使用
  • (html5)在移动端input输入搜索项后 输入法下面为什么不想百度那样出现前往? 而我的出现的是换行...
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • .class文件转换.java_从一个class文件深入理解Java字节码结构
  • .net Signalr 使用笔记
  • .net wcf memory gates checking failed
  • .NET 除了用 Task 之外,如何自己写一个可以 await 的对象?
  • .Net 转战 Android 4.4 日常笔记(4)--按钮事件和国际化
  • .net6+aspose.words导出word并转pdf
  • .NET框架类在ASP.NET中的使用(2) ——QA
  • ??在JSP中,java和JavaScript如何交互?
  • @autowired注解作用_Spring Boot进阶教程——注解大全(建议收藏!)
  • [04]Web前端进阶—JS伪数组
  • [100天算法】-目标和(day 79)
  • [2016.7 test.5] T1
  • [BZOJ1053][HAOI2007]反素数ant
  • [C#]winform部署yolov9的onnx模型
  • [Excel VBA]单元格区域引用方式的小结