`
toplchx
  • 浏览: 341559 次
  • 性别: 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}"
	}
}

 

分享到:
评论

相关推荐

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

    标题中的“groovy编写webservice服务端和客户端(含连接数据并输出JSON数据)”表明了本文将探讨如何使用Groovy编程语言来构建Web服务的服务器端和客户端,并且这些服务会涉及与数据库的交互以及JSON数据的处理。...

    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脚本执行工具.zip

    在测试领域,Groovy常用于自动化测试,例如在持续集成(CI)/持续部署(CD)流程中,通过编写Groovy脚本来执行各种测试任务,如单元测试、集成测试和端到端测试。由于Groovy的灵活性,它也常被用于编写复杂的测试...

    Java中使用Groovy的三种方式

    你可以编写Groovy类,然后像使用Java类一样使用它们。Groovy类通常比Java类更简洁,因为它们可以省略一些Java的冗余语法,如分号、括号等。此外,Groovy提供了许多便利特性,如闭包、元编程等,使得编写更复杂逻辑的...

    groovy in action 中文版 2017.11

    脚本编写人员可以使用Groovy来编写自动化任务和系统管理工具,而不需要像在传统的Java程序中那样编写大量的模板代码。同时,Groovy也特别适合敏捷开发人员,因为它支持快速开发和频繁的迭代,使得敏捷开发流程中的...

    groovy-sdk-4.0.3

    总的来说,Groovy SDK 4.0.3是一个完整的开发环境,它为Groovy开发者提供了编写、测试和运行代码所需的所有工具,是学习和使用Groovy语言的重要资源。通过安装和配置这个SDK,你可以开始探索Groovy的动态世界,体验...

    apache-groovy-sdk-3.0.6.zip

    综上所述,Apache Groovy SDK 3.0.6是开发者学习、开发和部署Groovy应用程序的必备工具,包含了从编写到执行Groovy代码所需的一切。通过深入研究这个SDK,开发者可以充分利用Groovy的特性,提高开发效率,编写出更...

    groovy入门经典,groovyeclipse 插件

    它为Eclipse IDE带来了对Groovy语言的全面支持,包括语法高亮、代码提示、自动完成、调试器和构建工具。通过GroovyEclipse,开发者可以在Eclipse环境中舒适地编写、测试和运行Groovy代码,提高开发效率。 入门...

    groovy-2.3.6-installer

    安装Groovy后,开发者可以使用Groovy Shell(groovysh)进行交互式编程,或者编写Groovy脚本执行任务。Groovy的语法简洁明了,支持闭包和动态类型,使得开发效率大大提高。此外,Groovy还可以用于构建脚本、Web开发...

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

    Groovy代码可以被Java编译器理解,并且在运行时,GroovyShell或GroovyClassLoader等工具能够即时编译和执行Groovy脚本,这为动态加载和执行提供了便利。 当我们需要在Java程序中调用Groovy脚本时,可以使用以下步骤...

    通过groovy自定义函数实现提取明细表字段至主表字段.rar

    1. **Groovy脚本编写**:Groovy允许开发者用更接近自然语言的方式来编写代码,减少冗余的语法结构。在自定义函数中,我们可以利用Groovy的面向对象特性,定义类和方法来处理明细表和主表的数据交互。 2. **数据访问...

    groovy-docs-1.8.9.zip

    9. **Spock测试框架**:虽然1.8.9版本可能不包含Spock的最新版本,但这个时期的Groovy已经开始支持Spock,这是一种用Groovy编写的BDD(行为驱动开发)测试框架,提供了简洁的语法。 10. **Grails框架**:虽然Grails...

    SpringBoot-Gradle-Maven-Java-Groovy

    它基于Groovy编写构建脚本,提供了灵活的构建配置和依赖管理。相比Maven,Gradle支持更复杂的项目结构,允许自定义构建逻辑,同时具备更好的性能和扩展性。 3. **Maven**: Maven是另一种流行的Java项目管理和构建...

    groovy

    Groovy是一种基于Java平台的、动态的、强大的编程...无论是编写脚本、开发Web应用还是进行数据处理,Groovy都是值得学习和使用的强大工具。通过深入理解和实践,开发者可以充分利用Groovy提高工作效率,提升项目质量。

    groovy-all-2.4.8.jar

    - **构建工具**:Gradle,一个流行的构建自动化工具,就是用Groovy编写的,允许用户以灵活的方式定义构建逻辑。 - **Web开发**:Grails是一个基于Groovy的全栈框架,用于快速开发企业级Web应用。 - **领域特定...

    Groovy学习资料(包括Groovy in action 的中英文以及API)

    此外,Groovy与Java完全兼容,可以无缝集成到现有的Java项目中,使用Groovy编写的代码可以直接被Java代码调用。 在第二部分,Groovy in Action详细探讨了Groovy的高级特性,如元编程和领域特定语言(DSL)。元编程...

    groovy-api-chm

    "groovy-gapi-1.7.2.chm" 文件则专注于Groovy的额外功能和库,如Groovy的脚本编写环境、Swing构建器、AntBuilder等。Groovy Grape是其中的一个重要部分,它是一个自动依赖管理工具,允许Groovy程序在运行时自动下载...

    Groovy安装以及简单使用

    Groovy也提供了许多内置的工具和库,如Gradle构建工具,它是用Groovy编写的,允许开发者以更简洁的方式编写构建脚本。此外,Spock是一个基于Groovy的单元测试框架,它的语法比JUnit更易读,更强大。 通过学习Groovy...

    eclipse安装groovy插件的步骤

    4. **编写 Groovy 代码**:在新建的 Groovy 类文件中,可以开始编写 Groovy 代码。例如: ```groovy class Greeting { def sayHello() { println "Hello, Groovy!" } } ``` 5. **运行 Groovy 类**:右键点击...

    groovy-all

    如果你的项目中使用了Groovy,这个库将提供一个完整的生态系统,帮助你充分利用Groovy的灵活性和效率。在Java项目中引入这个库,你可以轻松地集成Groovy脚本,提升开发效率,同时得益于其动态特性和强大的库支持。

Global site tag (gtag.js) - Google Analytics