最近有个项目,有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}"
}
}
相关推荐
@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 是基于Java的脚本语言。是Java语言扩展,因此可以与Java语言互相...由于Groovy的超级灵活性,你可以使用Groovy快速编写基于领域的小语言,从而将编码量进一步减少,程序更容易维护。越少的代码表明越少的错误。
Java中使用Groovy的三种方式,详细见我的博客。
Groovy 是 JVM 的一个替代语言 — 替代 是指可以用 Groovy 在 Java 平台上进行 Java 编程,使用方式基本与使用 Java 代码的方式相同。在编写新应用程序时,Groovy 代码能够与 Java 代码很好地结合,也能用于扩展现有...
与Java代码比较起来,Groovy语言的另一个主要优势是,Groovy代码编写量相对小些。在一般情况下,Java代码过于复杂,难于理解和维护。这是因为Java需要大量的模板文件或者转换代码,而Groovy却不需要。 本书是...
编写第一个 Groovy 类,然后学习如何使用 JUnit 轻松地进行测试。借助功能完善的 Groovy 开发环境和使用技能,您将轻松完成本教程的学习。最重要的是,您将学会如何在日常 Java 应用程序开发中联合使用 Groovy 和 ...
groovy入门经典,groovyeclipse 插件
赠送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 制作说明 使用Gradle Shell命令行构建 确保已安装Java 11(或更高版本) cd到GroovyFX目录 ... GroovyFX易于包含在Groovy脚本中,这要归功于Groovy的Grab注释,它是Grape系统的一部分。 只需在脚本顶部
Groovy是JVM的一个替代语言(替代是指可以用 Groovy 在Java平台上进行Java 编程),使用方式基本与使用 Java代码的方式相同,该语言特别适合与Spring的动态语言支持一起使用,设计时充分考虑了Java集成,这使 ...
, 与Java代码比较起来,Groovy语言的另一个主要优势是,Groovy代码编写量相对小些。在一般情况下,Java代码过于复杂,难于理解和维护。这是因为Java需要大量的模板文件或者转换代码,而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版本,希望...
执行测试开发过程中的groovy脚本,无须安装,解压即可使用,直接运行bin目录下的groovyConsole.bat即可。
微服务-spring-boot-groovy 使用 Spring Boot 和 Groovy 构建微服务创建这些项目是为了在当地的达拉斯 Groovy Grails 用户组会议上展示微服务架构这些服务使用您需要安装才能开始使用的各种外部服务。 您将需要安装 ...
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驱动的甲板建筑游戏游戏使用简单的常见动作,并对卡进行可选的可脚本编写的增强功能以扩展游戏。 游戏使用两种资源:胜利点和金钱。 金钱可以让您购买更多的卡,胜利点可以...
编写第一个 Groovy 类,然后学习如何使用 JUnit 轻松地进行测试。借助功能完善的 Groovy 开发环境和使用技能,您将轻松完成本教程的学习。最重要的是,您将学会如何在日常 Java 应用程序开发中联合使用 Groovy 和 ...
NULL 博文链接:https://leon1509.iteye.com/blog/1541387
Groovy轻松入门—搭建Groovy开发环境 Groovy轻松入门—搭建Groovy开发环境