`
toplchx
  • 浏览: 339049 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

用Groovy的AntBuilder编写wab部署工具

阅读更多

最近有个项目,有5、6个web分别部署在3地的服务器,每次发布都很头疼,已有的部署工具要么功能不灵活,要么太庞大,部署工具的部署本身就很麻烦。所以自己用Groovy的AntBuilder写了一个部署工具。在此记录:

部署工具的功能包括拷贝代码,压缩war包,上传至服务器,停止tomcat,解压缩,启动tomcat。(同步SVN和编译用IDE完成)

1、AntBuilder的copy

new AntBuilder().copy(todir:destdir) {
	fileset(dir:"${srcdir}/WebContent") {
		include(name:"**/*")
		exclude(name:"**/spring/**")
	}
}

 todir:目标目录

 fileset的dir:源目录

 include:包含文件的规则

 exclude:例外文件的规则

 

2、搜索本地maven库,拷贝jar文件。AntBuilder的fileScanner

def ant = new AntBuilder()
ant.fileScanner {
	fileset(dir:'D:/work/env/repos', casesensitive:false) {
		include(name:"**/${dep.artifactId}-${ver}.jar")
	}
}.each { jar ->
	println jar.path
	ant.copy(file:jar.path, tofile:"${destdir}/WEB-INF/lib/${jar.name}")
}
 fileScanner在某个目录中搜索某种规则的文件

 dir:base目录

 include:包含的文件规则

 

3、AntBuilder的war

new AntBuilder().war(destfile:"${dir}editor.war", webxml:"${dir}/WEB-INF/web.xml") {
	fileset(dir:"${dir}")
}

 

4、ssh登陆服务器,执行命令

new AntBuilder().sshexec(host: ${host},
	username: ${ssh_acc},
	password: ${ssh_pwd},
	command: "${tomcat_dir}/bin/shutdown.sh ; rm -f ${tomcat_dir}/${pro}editor.war")

  多命令用分号隔开

 

5、ssh登陆,上传文件

new AntBuilder().scp(file: "${tmpdir}/${pro}editor.war",
	todir: remote_dir,
	password: ssh_pwd,
	trust:"true")  //false:need knownhosts

 file:本地文件

 todir:远程目录。格式是‘登陆账号@服务器ip:保存目录’

 trust:false是需要knownhosts文件的。这个文件时ssh自动生成的。

 

6、AntBuilder的批量按序执行

new AntBuilder().sequential {
    ...
    ...
}

 

 

代码清单:

执行文件

package com.emg.groovy.dmtool

@groovy.util.logging.Log4j2
class dmtool {
	def ant = new AntBuilder()
	
	def copyWeb(srcdir, destdir) {
		ant.sequential {
			echo("begin copy srcdir:${srcdir}; destdir:${destdir}")
			delete(dir:destdir)
			mkdir(dir:destdir)
			//copy Webcontent
			copy(todir:destdir) {
				fileset(dir:"${srcdir}/WebContent") {
					include(name:"**/*")
					exclude(name:"**/spring/**")
				}
			}
			//copy classes
			copy(todir:"${destdir}/WEB-INF") {
				fileset(dir:"${srcdir}/target") {
					include(name:"**/*")
				}
			}
			echo("copy done")
		}
	}
	
	def copyDependencies(srcdir, destdir) {
		def pom = new XmlSlurper().parseText(new File("${srcdir}/pom.xml").text)
		pom.dependencies.dependency.each { dep ->
//			println "${dep.groupId}_${dep.artifactId}_${dep.version}"
			String ver = dep.version
			if (ver.startsWith("\$")) {
				ver = ver[2..-2]
				ver = pom.properties."$ver"
			}
			ant.fileScanner {
				fileset(dir:'D:/work/env/repos', casesensitive:false) {
					include(name:"**/${dep.artifactId}-${ver}.jar")
				}
			}.each { jar ->
				println jar.path
				ant.copy(file:jar.path, tofile:"${destdir}/WEB-INF/lib/${jar.name}")
			}
		}
	}
	
	def buildwar(dir) {
		ant.sequential {
			echo("begin build war dir:${dir}")
			delete(file:"${dir}editor.war")
			war(destfile:"${dir}editor.war", webxml:"${dir}/WEB-INF/web.xml") {
				fileset(dir:"${dir}")
			}
			echo("build war done")
		}
	}
	
	def deploywar(job, pro, tmpdir) {
//		println job
		def host = job.host
		def ssh_acc = job.ssh_acc
		def ssh_pwd = job.ssh_pwd
		def JAVA_HOME = job.JAVA_HOME
		def tomcat_dir = job."${pro}".tomcat_dir
		def remote_dir = job."${pro}".remote_dir
		ant.sequential {
			echo("begin deploy war : ${pro}")
			//delete old war file,shutdown tomcat			
			sshexec(host: host,
				username: ssh_acc,
				password: ssh_pwd,
				command: "${tomcat_dir}/bin/shutdown.sh ; rm -f ${tomcat_dir}/${pro}editor.war")
			
			//upload war file
			scp(file: "${tmpdir}/${pro}editor.war",
				todir: remote_dir,
				password: ssh_pwd,
				trust:"true")  //false:need knownhosts
			
			//upzip war file
			sshexec(host: host,
				username: ssh_acc,
				password: ssh_pwd,
				command: "cd ${tomcat_dir}/${pro}editor ; ${JAVA_HOME}/bin/jar -xf ${tomcat_dir}/${pro}editor.war")
			
			//start tomcat
			sshexec(host: host,
				username: ssh_acc,
				password: ssh_pwd,
				command: "${tomcat_dir}/bin/startup.sh")
			
			echo("deploy war done : ${pro}")
		}
	}
	
	static void main(args) {
		def dmtool = new dmtool()
		//read config file
		def config = new ConfigSlurper().parse(new File('src/myconfig.groovy').toURI().toURL())
		String tmpdir = config.tmpdir
		println tmpdir
		
		config.jobs.each { job ->  //beijing, baoding, aliyun
			job.deploy.each { pro ->
				def src = job."${pro}".src_dir
				dmtool.ant.echo("make ${pro}")
				//copy source
				dmtool.copyWeb(src, "${tmpdir}/${pro}")
				//copy maven dependencies
				dmtool.copyDependencies(src, "${tmpdir}/${pro}")
				//war
				dmtool.buildwar("${tmpdir}/${pro}")
				//deploy
				dmtool.deploywar(job, pro, tmpdir)
			}
		}
	}
}

 

配置文件

通过jobs和每个服务器的deploy设置部署哪个服务器,哪些Web服务

//jobs = [beijing, baoding, aliyun]
jobs = [beijing]
tmpdir = "D:/work/tmpdir"

beijing {
	host = "192.168.XXX.XXX"
	ssh_acc = "user"
	ssh_pwd = "xxxx"
	JAVA_HOME = "/usr/java/jdk1.7.0_21"
	deploy = ['web', 'path', 'area']
	web {
		src_dir = "D:/work/eclipse/workspace-jee-luna/webeditor"
		tomcat_dir = "/xxxx/xxxx/tomcat7"
		remote_dir = "${ssh_acc}@${host}:${tomcat_dir}"
	}
	path {
		src_dir = "D:/work/eclipse/workspace-jee-luna/patheditor"
		tomcat_dir = "/xxxx/xxxx/tomcat_path"
		remote_dir = "${ssh_acc}@${host}:${tomcat_dir}"
	}
	area {
		src_dir = "D:/work/eclipse/workspace-jee-luna/areaeditor"
		tomcat_dir = "/xxxx/xxxx/tomcat_area"
		remote_dir = "${ssh_acc}@${host}:${tomcat_dir}"
	}
}

baoding {
	host = "xx.xx.xxx.xxx"
	ssh_acc = "user"
	ssh_pwd = "xxxxxx"
	JAVA_HOME = "/usr/java/jdk1.7.0_21"
	deploy = ['web']
	web {
		src_dir = "D:/work/eclipse/workspace-jee-luna/bd-webeditor"
		tomcat_dir = "/xxxx/xxxx/tomcat_web_9000"
		remote_dir = "${ssh_acc}@${host}:${tomcat_dir}"
	}
	path {
		src_dir = "D:/work/eclipse/workspace-jee-luna/patheditor"
		tomcat_dir = "/xxxx/xxxx/tomcat_path_9010"
		remote_dir = "${ssh_acc}@${host}:${tomcat_dir}"
	}
}

aliyun {
	host = "xx.xx.xxxx.xxx"
	ssh_acc = "user"
	ssh_pwd = "xxxxx"
	JAVA_HOME = "/usr/java1.7/jdk1.7.0_21"
	deploy = ['path']
	web {
		src_dir = "D:/work/eclipse/workspace-jee-luna/webeditor"
		tomcat_dir = "/xxxx/xxxx/tomcat_web_9000"
		remote_dir = "${ssh_acc}@${host}:${tomcat_dir}"
	}
	path {
		src_dir = "D:/work/eclipse/workspace-jee-luna/patheditor"
		tomcat_dir = "/xxxx/xxxx/tomcat_path_9010"
		remote_dir = "${ssh_acc}@${host}:${tomcat_dir}"
	}
}

 

分享到:
评论

相关推荐

    Android代码-使用 Groovy 语言编写gank.io客户端

    @Deprecated Official Android Support Library 23.2 added support for Vector Drawables and Animated Vector Drawables. Please, use that. This lib is still usable, but it is no longer maintained. ...

    Groovy DSL

    Groovy 是基于Java的脚本语言。是Java语言扩展,因此可以与Java语言互相...由于Groovy的超级灵活性,你可以使用Groovy快速编写基于领域的小语言,从而将编码量进一步减少,程序更容易维护。越少的代码表明越少的错误。

    Java中使用Groovy的三种方式

    Java中使用Groovy的三种方式,详细见我的博客。

    精通 Groovy--下一代开发语言

    Groovy 是 JVM 的一个替代语言 — 替代 是指可以用 Groovy 在 Java 平台上进行 Java 编程,使用方式基本与使用 Java 代码的方式相同。在编写新应用程序时,Groovy 代码能够与 Java 代码很好地结合,也能用于扩展现有...

    Groovy入门经典.pdf

     与Java代码比较起来,Groovy语言的另一个主要优势是,Groovy代码编写量相对小些。在一般情况下,Java代码过于复杂,难于理解和维护。这是因为Java需要大量的模板文件或者转换代码,而Groovy却不需要。  本书是...

    apache-groovy-sdk-2.4.11

    编写第一个 Groovy 类,然后学习如何使用 JUnit 轻松地进行测试。借助功能完善的 Groovy 开发环境和使用技能,您将轻松完成本教程的学习。最重要的是,您将学会如何在日常 Java 应用程序开发中联合使用 Groovy 和 ...

    groovy入门经典,groovyeclipse 插件

    groovy入门经典,groovyeclipse 插件

    groovy-3.0.9-API文档-中文版.zip

    赠送jar包:groovy-3.0.9.jar; 赠送原API文档:groovy-3.0.9-javadoc.jar; 赠送源代码:groovy-3.0.9-sources.jar; 赠送Maven依赖信息文件:groovy-3.0.9.pom; 包含翻译后的API文档:groovy-3.0.9-javadoc-API...

    groovyfx:一个用Groovy语言编写JavaFX 8应用程序的库

    GroovyFx 制作说明 使用Gradle Shell命令行构建 确保已安装Java 11(或更高版本) cd到GroovyFX目录 ... GroovyFX易于包含在Groovy脚本中,这要归功于Groovy的Grab注释,它是Grape系统的一部分。 只需在脚本顶部

    Groovy v2.4.13官方版

     Groovy是JVM的一个替代语言(替代是指可以用 Groovy 在Java平台上进行Java 编程),使用方式基本与使用 Java代码的方式相同,该语言特别适合与Spring的动态语言支持一起使用,设计时充分考虑了Java集成,这使 ...

    Groovy入门经典

    , 与Java代码比较起来,Groovy语言的另一个主要优势是,Groovy代码编写量相对小些。在一般情况下,Java代码过于复杂,难于理解和维护。这是因为Java需要大量的模板文件或者转换代码,而Groovy却不需要。, 本书是有关...

    Java调用Groovy,实时动态加载数据库groovy脚本

    Java调用Groovy,实时动态加载数据库groovy脚本,java读取mongoDB的groovy脚本,加载实时运行,热部署

    apache-groovy-3.0.8.zip apache官网的groovy3.0.8版本

    apache-groovy-3.0.8.zip apache官网的groovy3.0.8版本,希望大家多多下载,apache-groovy-3.0.8.zip apache官网的groovy3.0.8版本,希望大家多多下载,apache-groovy-3.0.8.zip apache官网的groovy3.0.8版本,希望...

    groovy脚本执行工具.zip

    执行测试开发过程中的groovy脚本,无须安装,解压即可使用,直接运行bin目录下的groovyConsole.bat即可。

    microservices-spring-boot-groovy:使用 Spring Boot 和 Groovy 构建微服务

    微服务-spring-boot-groovy 使用 Spring Boot 和 Groovy 构建微服务创建这些项目是为了在当地的达拉斯 Groovy Grails 用户组会议上展示微服务架构这些服务使用您需要安装才能开始使用的各种外部服务。 您将需要安装 ...

    [Groovy] Making Java Groovy 英文版

    Making Java Groovy is a practical handbook for developers who want to blend Groovy into their day to day work with Java It starts by introducing the key differences between Java and Groovy and how you...

    deckBuildingGame:用groovy编写的REST驱动的甲板建筑游戏

    deckBuildingGame 用groovy编写的REST驱动的甲板建筑游戏游戏使用简单的常见动作,并对卡进行可选的可脚本编写的增强功能以​​扩展游戏。 游戏使用两种资源:胜利点和金钱。 金钱可以让您购买更多的卡,胜利点可以...

    apache-groovy-sdk-3.0.9.zip

    编写第一个 Groovy 类,然后学习如何使用 JUnit 轻松地进行测试。借助功能完善的 Groovy 开发环境和使用技能,您将轻松完成本教程的学习。最重要的是,您将学会如何在日常 Java 应用程序开发中联合使用 Groovy 和 ...

    groovy编写webservice服务端和客户端(含连接数据并输出JSON数据)

    NULL 博文链接:https://leon1509.iteye.com/blog/1541387

    Groovy轻松入门—搭建Groovy开发环境

    Groovy轻松入门—搭建Groovy开发环境 Groovy轻松入门—搭建Groovy开发环境

Global site tag (gtag.js) - Google Analytics