一个全量的ant脚本例子
<?xml version="1.0" encoding="UTF-8" ?>
<project name="${webapp.name}" default="remote-tomcat-start" basedir=".">
<!-- 引入自定义属性配置文件,remote-tomcat-start定义svn、ftp常用信息-->
<property file="ant.properties" />
<!--lib.dir lib.bat文件放置路径 -->
<property name="lib.dir" value="${basedir}\lib.bat"/>
<!-- webapp.dir 检出后项目目录,${basedir}\${webapp.name},与svn check out目录相同 -->
<property name="webapp.srcDIR" location="${basedir}\${webapp.name}"/>
<!-- delta变量用来存放增量包路径 -->
<property name="delta" value="${basedir}\patch\"/>
<!-- source变量存放最新版本包路径 -->
<property name="source" value="${basedir}\newpackage"/>
<!-- target变量存放旧版本包路径 -->
<property name="target" value="${basedir}\oldpackage"/>
<!-- tomcat.home变量存放服务器上tomcat路径 -->
<property name="tomcat.home" value="${ftp.dir}/tomcat8"/>
<!-- sleep.time休眠时间 -->
<property name="sleep.time" value="4"/>
<!-- ===================================================================================================
CLEAN files BEGIN
=================================================================================================== -->
<!--打印目录参数-->
<echo message="=================>>clean files===>> start" />
<target name="ant.cleanAll">
<echo>[SYSTEM INFO] webapp.name====${webapp.name} || basedir====${basedir}</echo>
<echo>=================>>clean files===>> begin to delete dir==>${basedir}\${webapp.name}</echo>
<!--删除原SVN目录-->
<delete dir="${webapp.srcDIR}" />
<sleep seconds="10"/>
<echo message="=================>>clean files===>> end" />
</target>
<!-- ===================================================================================================
CLEAN files END
=================================================================================================== -->
<!-- ===================================================================================================
SVN Checkout BEGIN
=================================================================================================== -->
<!-- svn 检出项目【注:需要安装svn客户端】-->
<target name="svn.checkout" depends="ant.cleanAll">
<echo message="=================>>创建svn checkout目录===>> start" />
<!--项目检出存放位置-->
<echo>=================>>svn checkout===>> checkout to dir==>${webapp.srcDIR}</echo>
<sleep seconds="3"/>
<mkdir dir="${webapp.srcDIR}"/>
<echo message="=================>>创建svn checkout目录===>> end" />
<echo message="=================>>svn checkout===>> start" />
<echo>=================>>svn checkout===>> begin svn.username=${svn.username} svn.password=${svn.password} svn.url=${svn.url}</echo>
<!--SVN任务,项目SVN地址,SVN 用户名/密码,SVN检出目录-->
<svn username="${svn.username}" password="${svn.password}" javahl="false">
<checkout url="${svn.url}" destPath="${webapp.srcDIR}" />
</svn>
<echo message="=================>>svn checkout===>> end" />
</target>
<!-- SVN任务 -->
<taskdef name="svn" classname="org.tigris.subversion.svnant.SvnTask"/>
<!-- ===================================================================================================
SVN Checkout END
=================================================================================================== -->
<!-- ===================================================================================================
WAR war BEGIN
=================================================================================================== -->
<target name="svn.getWar" depends="svn.checkout">
<exec executable="cmd" failοnerrοr="true">
<arg line="/c ${lib.dir}" />
</exec>
</target>
<!-- ===================================================================================================
WAR war END
=================================================================================================== -->
<!-- ===================================================================================================
clean patch dir start
=================================================================================================== -->
<target name="patch.dir" depends="svn.getWar">
<echo message="=================>>删除已经存在的增量包和source目录中存放的过时版本包===>> end" />
<echo>[SYSTEM INFO] delta====${delta} </echo>
<echo>[SYSTEM INFO] source====${source} </echo>
<echo>=================>>clean files===>> begin to delete dir==>${delta}</echo>
<!--删除已经存在的增量包和source目录中存放的过时版本包"svn.getWar" -->
<delete dir="${delta}" />
<delete dir="${source}" />
<echo message="=================>>clean files===>> end" />
<echo message="=================>>get patch START===>> end" />
<!--新建增量包和source目录-->
<echo message="=================>>新建patch目录存放增量包===>> end" />
<mkdir dir="${delta}"/>
<echo message="=================>>新建newpackage目录存放最新的全量包===>> end" />
<mkdir dir="${source}"/>
<echo message="=================>>将最新的版本包copy到newpackage目录===>> end" />
<move file="${webapp.srcDIR}\target\mer-1.0.0" tofile="${source}\mer"/>
</target>
<!-- ===================================================================================================
clean patch dir end
=================================================================================================== -->
<!-- ===================================================================================================
get patch START
=================================================================================================== -->
<target name="patch.getincreament" depends="patch.dir">
<copy todir="${delta}"
verbose="false"
failοnerrοr="false"
preservelastmodified="false"
includeemptydirs="false">
<fileset dir="${source}">
<!-- 找出 source 和 target 中的不同的文件 -->
<different targetdir="${target}" ignoreFileTimes="true"/>
<!-- 并且文件在 source 和 target 目录下同时存在 -->
<present present="both" targetdir="${target}" />
</fileset>
<fileset dir="${source}">
<!-- 找出 source 和 target 中的不同的文件 -->
<different targetdir="${target}" ignoreFileTimes="true"/>
<!-- 并且只存在 source 端目录下而在 target 中不存在的 -->
<present present="srconly" targetdir="${target}" />
</fileset>
</copy>
</target>
<target name="patch.getzip" depends="patch.getincreament">
<echo>将增量包压缩成zip包</echo>
<zip destfile="${delta}/${webapp.name}.zip">
<zipfileset dir="${delta}/mer/"/>
</zip>
</target>
<!-- ===================================================================================================
get patch END
=================================================================================================== -->
<!-- ===================================================================================================
将增量包发布到服务器上
=================================================================================================== -->
<!-- tomcat路径-->
<target name="ftp.testdir" depends="patch.getzip">
<echo>第一步测试属性配置文件中的字段是否引入成功</echo>
<echo>[SYSTEM INFO]ftp.username====${ftp.username}</echo>
<echo>[SYSTEM INFO]ftp.password====${ftp.password}</echo>
<echo>[SYSTEM INFO] ftp.server====${ftp.server}</echo>
<echo>[SYSTEM INFO]ftp.dir====${ftp.dir}</echo>
<echo message="=================>>echo===>>testdir end" />
</target>
<!--将mer包上传到服务器上-->
<target name="ftp.upload" depends="patch.getzip,mer.backup">
<echo>第四步备份增量包和全量包后上传新的增量包</echo>
<!--将mer包通过ssh/sftp上传到服务器上-->
<echo>上传mer到${ftp.dir}目录</echo>
<scp file="${delta}\${webapp.name}.zip" todir="${ftp.username}:${ftp.password}@${ftp.server}:${ftp.dir}" password="${ftp.password}" trust="true"/>
</target>
<!-- ===================================================================================================
SFTP UPLOAD mer END
=================================================================================================== -->
<!-- ===================================================================================================
DEPLOY mer BEGIN
=================================================================================================== -->
<!--使用ant sshexec命令直接执行linux常用命令-->
<target name="exec.deploy" depends="ftp.upload">
<echo>第五步将mer包部署在服务器tomcat上</echo>
<!--使用ant sshexec命令执行启动tomcat命令-->
<echo>发布mer服务</echo>
<sshexec host="${ftp.server}" username="${ftp.username}" password="${ftp.password}" trust="true"
command="
cd ${ftp.dir};
ls;
unzip -o -d tomcat8/webapps/mer mer.zip;
"
/>
</target>
<target name="remote-tomcat-start" depends="exec.deploy">
<echo>第六步将mer包部署在服务器tomcat上,并启动该tomcat </echo>
<sshexec host="${ftp.server}" username="${ftp.username}" password="${ftp.password}" command="${tomcat.home}/bin/startup.sh" trust="true"/>
</target>
<target name="remote-tomcat-stop" depends="ftp.testdir">
<echo>第二步在做所有的操作之前先停止tomcat</echo>
<sshexec host="${ftp.server}" username="${ftp.username}" password="${ftp.password}" command="${tomcat.home}/bin/shutdown.sh" trust="true"/>
<sleep seconds="${sleep.time}" />
</target>
<target name="mer.backup" depends="remote-tomcat-stop">
<echo>第三步停止tomcat之后备份增量包和全量包到指定的backup目录 </echo>
<!--使用ant sshexec命令执行启动tomcat命令-->
<echo>备份增量包和全量包到指定的目录</echo>
<sshexec host="${ftp.server}" username="${ftp.username}" password="${ftp.password}" trust="true"
command="
cd ${ftp.dir};
mv mer.zip merpatch_`date +%y%m%d%H%M%S`.zip;
cd ${tomcat.home}/webapps;
tar -zcvf mer_`date +%y%m%d%H%M%S`.tar.gz mer;
ls;
mv ${tomcat.home}/webapps/mer*.tar.gz ${ftp.dir};
"
/>
</target>
<!-- ===================================================================================================
DEPLOY mer END
=================================================================================================== -->
</project>
一、Ant脚本功能说明
1、本地功能
1.1、 自动删除上次运行时遗留的源代码文件、旧版本包、旧增量包;
1.2、 自动从svn上下载最新的代码;
1.3、 自动下载编译代码需要的lib包;
1.4、 自动编译代码输出war包和解压war后的文件;
1.5、 自动将最新的版本包移动到指定目录下和基线版本包比较打出最新的增量包
1.6、 自动将增量包上传到服务器上指定的目录下;
2、服务器端功能
2.1、自动shutdown服务;
2.2、自动备份上次上传的增量包以“merpatch_时间戳.zip”格式命名;
2.3、自动备份整个mer服务到指定的目录备份包以“mer_时间戳.tar.gz”格式命名,方便部署失败时回滚代码使用;
2.4、自动将上传的增量包解压到项目中;
2.5、自动startup服务;
3、功能灵活性
3.1、Ant脚本由无数个target组成,可以很方便从脚本中获取想要的部分功能,如比较2个版本包获取最新的增量包、将版本上传到指定的目录、自动部署最新的版本等,所有细小功能都可以独立执行;
3.2、本次脚本是以管理平台为例编写的、所有的参数都是可配置的,如果要将ant脚本运用到wap端来,只需要在ant.properties文件中修改3个参数即可,这样大大扩展了脚本的灵活性;
二、ant脚本内容
首先需要新建ant.properties参数内容:svn.url(svn地址)、svn.username(svn登录帐号)、svn.password(svn登录密码)、ftp.server(ftpIP地址)、ftp.username(ftp登录帐号)、ftp.password(ftp登录密码)、ftp.dir(ftp操作目录)<?xml version="1.0" encoding="UTF-8" ?>
<project name="${webapp.name}" default="remote-tomcat-start" basedir=".">
<!-- 引入自定义属性配置文件,remote-tomcat-start定义svn、ftp常用信息-->
<property file="ant.properties" />
<!--lib.dir lib.bat文件放置路径 -->
<property name="lib.dir" value="${basedir}\lib.bat"/>
<!-- webapp.dir 检出后项目目录,${basedir}\${webapp.name},与svn check out目录相同 -->
<property name="webapp.srcDIR" location="${basedir}\${webapp.name}"/>
<!-- delta变量用来存放增量包路径 -->
<property name="delta" value="${basedir}\patch\"/>
<!-- source变量存放最新版本包路径 -->
<property name="source" value="${basedir}\newpackage"/>
<!-- target变量存放旧版本包路径 -->
<property name="target" value="${basedir}\oldpackage"/>
<!-- tomcat.home变量存放服务器上tomcat路径 -->
<property name="tomcat.home" value="${ftp.dir}/tomcat8"/>
<!-- sleep.time休眠时间 -->
<property name="sleep.time" value="4"/>
<!-- ===================================================================================================
CLEAN files BEGIN
=================================================================================================== -->
<!--打印目录参数-->
<echo message="=================>>clean files===>> start" />
<target name="ant.cleanAll">
<echo>[SYSTEM INFO] webapp.name====${webapp.name} || basedir====${basedir}</echo>
<echo>=================>>clean files===>> begin to delete dir==>${basedir}\${webapp.name}</echo>
<!--删除原SVN目录-->
<delete dir="${webapp.srcDIR}" />
<sleep seconds="10"/>
<echo message="=================>>clean files===>> end" />
</target>
<!-- ===================================================================================================
CLEAN files END
=================================================================================================== -->
<!-- ===================================================================================================
SVN Checkout BEGIN
=================================================================================================== -->
<!-- svn 检出项目【注:需要安装svn客户端】-->
<target name="svn.checkout" depends="ant.cleanAll">
<echo message="=================>>创建svn checkout目录===>> start" />
<!--项目检出存放位置-->
<echo>=================>>svn checkout===>> checkout to dir==>${webapp.srcDIR}</echo>
<sleep seconds="3"/>
<mkdir dir="${webapp.srcDIR}"/>
<echo message="=================>>创建svn checkout目录===>> end" />
<echo message="=================>>svn checkout===>> start" />
<echo>=================>>svn checkout===>> begin svn.username=${svn.username} svn.password=${svn.password} svn.url=${svn.url}</echo>
<!--SVN任务,项目SVN地址,SVN 用户名/密码,SVN检出目录-->
<svn username="${svn.username}" password="${svn.password}" javahl="false">
<checkout url="${svn.url}" destPath="${webapp.srcDIR}" />
</svn>
<echo message="=================>>svn checkout===>> end" />
</target>
<!-- SVN任务 -->
<taskdef name="svn" classname="org.tigris.subversion.svnant.SvnTask"/>
<!-- ===================================================================================================
SVN Checkout END
=================================================================================================== -->
<!-- ===================================================================================================
WAR war BEGIN
=================================================================================================== -->
<target name="svn.getWar" depends="svn.checkout">
<exec executable="cmd" failοnerrοr="true">
<arg line="/c ${lib.dir}" />
</exec>
</target>
<!-- ===================================================================================================
WAR war END
=================================================================================================== -->
<!-- ===================================================================================================
clean patch dir start
=================================================================================================== -->
<target name="patch.dir" depends="svn.getWar">
<echo message="=================>>删除已经存在的增量包和source目录中存放的过时版本包===>> end" />
<echo>[SYSTEM INFO] delta====${delta} </echo>
<echo>[SYSTEM INFO] source====${source} </echo>
<echo>=================>>clean files===>> begin to delete dir==>${delta}</echo>
<!--删除已经存在的增量包和source目录中存放的过时版本包"svn.getWar" -->
<delete dir="${delta}" />
<delete dir="${source}" />
<echo message="=================>>clean files===>> end" />
<echo message="=================>>get patch START===>> end" />
<!--新建增量包和source目录-->
<echo message="=================>>新建patch目录存放增量包===>> end" />
<mkdir dir="${delta}"/>
<echo message="=================>>新建newpackage目录存放最新的全量包===>> end" />
<mkdir dir="${source}"/>
<echo message="=================>>将最新的版本包copy到newpackage目录===>> end" />
<move file="${webapp.srcDIR}\target\mer-1.0.0" tofile="${source}\mer"/>
</target>
<!-- ===================================================================================================
clean patch dir end
=================================================================================================== -->
<!-- ===================================================================================================
get patch START
=================================================================================================== -->
<target name="patch.getincreament" depends="patch.dir">
<copy todir="${delta}"
verbose="false"
failοnerrοr="false"
preservelastmodified="false"
includeemptydirs="false">
<fileset dir="${source}">
<!-- 找出 source 和 target 中的不同的文件 -->
<different targetdir="${target}" ignoreFileTimes="true"/>
<!-- 并且文件在 source 和 target 目录下同时存在 -->
<present present="both" targetdir="${target}" />
</fileset>
<fileset dir="${source}">
<!-- 找出 source 和 target 中的不同的文件 -->
<different targetdir="${target}" ignoreFileTimes="true"/>
<!-- 并且只存在 source 端目录下而在 target 中不存在的 -->
<present present="srconly" targetdir="${target}" />
</fileset>
</copy>
</target>
<target name="patch.getzip" depends="patch.getincreament">
<echo>将增量包压缩成zip包</echo>
<zip destfile="${delta}/${webapp.name}.zip">
<zipfileset dir="${delta}/mer/"/>
</zip>
</target>
<!-- ===================================================================================================
get patch END
=================================================================================================== -->
<!-- ===================================================================================================
将增量包发布到服务器上
=================================================================================================== -->
<!-- tomcat路径-->
<target name="ftp.testdir" depends="patch.getzip">
<echo>第一步测试属性配置文件中的字段是否引入成功</echo>
<echo>[SYSTEM INFO]ftp.username====${ftp.username}</echo>
<echo>[SYSTEM INFO]ftp.password====${ftp.password}</echo>
<echo>[SYSTEM INFO] ftp.server====${ftp.server}</echo>
<echo>[SYSTEM INFO]ftp.dir====${ftp.dir}</echo>
<echo message="=================>>echo===>>testdir end" />
</target>
<!--将mer包上传到服务器上-->
<target name="ftp.upload" depends="patch.getzip,mer.backup">
<echo>第四步备份增量包和全量包后上传新的增量包</echo>
<!--将mer包通过ssh/sftp上传到服务器上-->
<echo>上传mer到${ftp.dir}目录</echo>
<scp file="${delta}\${webapp.name}.zip" todir="${ftp.username}:${ftp.password}@${ftp.server}:${ftp.dir}" password="${ftp.password}" trust="true"/>
</target>
<!-- ===================================================================================================
SFTP UPLOAD mer END
=================================================================================================== -->
<!-- ===================================================================================================
DEPLOY mer BEGIN
=================================================================================================== -->
<!--使用ant sshexec命令直接执行linux常用命令-->
<target name="exec.deploy" depends="ftp.upload">
<echo>第五步将mer包部署在服务器tomcat上</echo>
<!--使用ant sshexec命令执行启动tomcat命令-->
<echo>发布mer服务</echo>
<sshexec host="${ftp.server}" username="${ftp.username}" password="${ftp.password}" trust="true"
command="
cd ${ftp.dir};
ls;
unzip -o -d tomcat8/webapps/mer mer.zip;
"
/>
</target>
<target name="remote-tomcat-start" depends="exec.deploy">
<echo>第六步将mer包部署在服务器tomcat上,并启动该tomcat </echo>
<sshexec host="${ftp.server}" username="${ftp.username}" password="${ftp.password}" command="${tomcat.home}/bin/startup.sh" trust="true"/>
</target>
<target name="remote-tomcat-stop" depends="ftp.testdir">
<echo>第二步在做所有的操作之前先停止tomcat</echo>
<sshexec host="${ftp.server}" username="${ftp.username}" password="${ftp.password}" command="${tomcat.home}/bin/shutdown.sh" trust="true"/>
<sleep seconds="${sleep.time}" />
</target>
<target name="mer.backup" depends="remote-tomcat-stop">
<echo>第三步停止tomcat之后备份增量包和全量包到指定的backup目录 </echo>
<!--使用ant sshexec命令执行启动tomcat命令-->
<echo>备份增量包和全量包到指定的目录</echo>
<sshexec host="${ftp.server}" username="${ftp.username}" password="${ftp.password}" trust="true"
command="
cd ${ftp.dir};
mv mer.zip merpatch_`date +%y%m%d%H%M%S`.zip;
cd ${tomcat.home}/webapps;
tar -zcvf mer_`date +%y%m%d%H%M%S`.tar.gz mer;
ls;
mv ${tomcat.home}/webapps/mer*.tar.gz ${ftp.dir};
"
/>
</target>
<!-- ===================================================================================================
DEPLOY mer END
=================================================================================================== -->
</project>