背景:
本文维护的网站是使用weblogic部署的文件夹工程(非war包,jar包部署),上线后的升级版本管理工作。每次升级,只提交修改的类,页面。
整个工作大体如下:SVN维护一个与生成环境同步的主干分支,业务人员提数一个需求,开发人员确认后,版本管理员从主干新建一个分支;
开发人员完成开发,自测后,版本管理员合并分支修改到主干;
然后,打升级版本,如果升级文件多的话,跳出修改文件是个麻烦的过程,尤其是类,即使使用很多技巧,还是觉得不够方便。
正文:
1)获得修改文件的方法
方法一:手动挑,这个。。。。。
方法二:使用小乌龟,这种方法网上一搜,到处都是;
方法三:使用ant获取,这是本文重点。这里先介绍一下思想:首先,svn客户端命令“log --xml -v -r ”获取版本修改记录的xml文档,然后使用propertyregex命令解析出修改文件列表并转成svn上的地址,最后下载文件。
<path id="project.classpath">
<pathelement location="lib/svnjavahl.jar" />
<pathelement location="lib/svnant.jar" />
<pathelement location="lib/svnClientAdapter.jar" />
</path>
<!-- load the svn task -->
<taskdef resource="svntask.properties" classpathref="project.classpath" />
<taskdef resource="net/sf/antcontrib/antlib.xml">
<classpath>
<pathelement location="lib\ant-contrib-1.0b3.jar" />
</classpath>
</taskdef>
<!-- path to your webroot -->
<property name="temp.dir" value="tmp" />
<!--svn版本号--》
<property name="startingRevision" value="2187" />
<property name="endingRevision" value="2187" />
<!-- url to svn repository -->
<property name="svn.repoURL" value="svn工程路径" />
<property name="svn.base" value="/code/se_manage/trunk/se_manage/" />
<property name="svn.username" value="chengfulai" />
<property name="svn.password" value="chengfulai" />
<!-- export Exports given revision from the given repository URL to temp.dir -->
<target name="exportCode"
description="Exports given revision from the given repository URL to temp.dir">
<delete dir="${temp.dir}" />
<echo>
**************************************
</echo>
<mkdir dir="${temp.dir}" />
<!-- creates log in an xml file for revision x to xx -->
<exec executable="svn" outputproperty="svnlog.out" output="${temp.dir}\log.xml">
<arg
line="log --xml -v -r ${startingRevision}:${endingRevision} ${svn.repoURL}" />
</exec>
<xmlproperty file="${temp.dir}\log.xml"
collapseattributes="true" />
<propertyregex property="directory.path" input="${log.logentry.paths.path}"
regexp="${svn.base}" casesensitive="false" replace="/" />
<echo>${directory.path}</echo>
<for list="${directory.path}" param="val3">
<sequential>
<mkdir dir="${temp.dir}/@{val3}" />
<delete dir="${temp.dir}/@{val3}" />
</sequential>
</for>
<for list="${directory.path}" param="val2">
<sequential>
<available file="" filepath="${temp.dir}@{val2}" type="dir"
property="your.file.path.here.present" />
<if>
<equals arg1="${your.file.path.here.present}" arg2="true" />
<else>
<!--<get src="${svn.repoURL}@{val2}" dest="${temp.dir}@{val2}" username="${svn.username}"
password="${svn.password}" ignoreerrors="true"/> -->
<!--<get src="${svn.repoURL}@{val2}" dest="${temp.dir}@{val2}"
verbose="true" ignoreerrors="true" />-->
<svn username="chengfulai" password="chengfulai" javahl="false" failοnerrοr="false" svnkit="true">
<export srcUrl="${svn.repoURL}@{val2}" revision="HEAD" destPath="${temp.dir}@{val2}" />
</svn>
</else>
</if>
<var name="your.file.path.here.present" unset="true" />
</sequential>
</for>
</target>
2)获得升级版本
拿到修改文件后,如果包含.java文件需要编译一下,这是第二个重点。思想:首先对整个工程编译,然后打成一个jar包放到lib里去,追后对步骤1中的文件夹编译,就可以拿到升级文件啦。这个就不写了,无非是javac,jar等简单命令。
3)备份待升级文件
升级文件难免出错,对需要升级的文件做下备份是必不可少的。思路:首先,使用dos命令获取带升级文件夹的文件列表,同时增加头尾,变成一个xml文件,这样的话,就可以再使用步骤1中的方法三,从ftp上下载文件。不足之处:该方法只能拿到修改的文件,因此,出错回滚时不能删除本次升级新增的文件。del D:\test\filelist.txt;
bat命令,生成修改文件列表
del D:\test\filelistXML.xml;
dir C:\Users\chengfulai-ghq\Desktop\se_manage\updateFile\se_manage /s /b >D:\test\filelist.txt
@echo off&SetLocal EnableDelayedExpansion
echo ^<?xml version="1.0" encoding="UTF-8"?^> ^<log^>>> D:\test\filelistXML.xml
for /f "delims=" %%i in (D:\test\filelist.txt) do (if not defined %%i set %%i=A & echo %%i>>tmp.tmp)
for /f %%i in ('type tmp.tmp') do (
Set a=%%i
Set b=!a:\=/!
echo ^<path^>!b!^</path^>>>D:\test\filelistXML.xml)
del tmp.tmp
echo ^</log^>>> D:\test\filelistXML.xml
根据上边的列表下载,获得备份
<!-- path to your webroot -->
<!--整个备份用文件夹地址-->
<property name="folder.repoURL" location="C:/Users/chengfulai-ghq/Desktop/bak-sm-test/" />
<!--辅助文件地址,最好不要放在c盘-->
<property name="XML.repoURL" location="D:\test\filelistXML.xml" />
<!--文件部署地址,用户名,口令-->
<property name="ftp.repoURL" value="用户名:密码@ip地址:weblogic上的发布链接" />
<!--备份文件地址-->
<property name="local.repoURL" location="bak\" />
<property name="temp.bak" value="bak" />
<path id="project.classpath">
<pathelement location="lib/svnjavahl.jar" />
<pathelement location="lib/svnant.jar" />
<pathelement location="lib/svnClientAdapter.jar" />
</path>
<!-- load the svn task -->
<taskdef resource="svntask.properties" classpathref="project.classpath" />
<taskdef resource="net/sf/antcontrib/antlib.xml">
<classpath>
<pathelement location="lib\ant-contrib-1.0b3.jar" />
</classpath>
</taskdef>
<target name="XML">
<exec executable="getXML.bat" failοnerrοr="false">
</exec>
</target>
<!-- load the svn task -->
<taskdef resource="svntask.properties" classpathref="project.classpath" />
<taskdef resource="net/sf/antcontrib/antlib.xml">
<classpath>
<pathelement location="lib\ant-contrib-1.0b3.jar" />
</classpath>
</taskdef>
<target name="bak" depends="XML">
<delete dir="${temp.bak}" />
<mkdir dir="${temp.bak}" />
<!--readTheXMl-->
<xmlproperty file="${XML.repoURL}" collapseattributes="true" />
<echo>1111111111111111111111111-readTheXML--111111111111111111111111111</echo>
<!--getTheFilePath-->
<!--修改regexp成:整个备份用文件夹地址-->
<propertyregex property="directory.path" input="${log.path}" regexp="C:/Users/chengfulai-ghq/Desktop/se_manage/updateFile/" casesensitive="false" replace="/" />
<echo>22222222222222222222222222-getTheFilePath--22222222222222222222222222</echo>
<!--makeTheFolder-->
<for list="${directory.path}" param="val3">
<sequential>
<mkdir dir="${temp.bak}/@{val3}" />
<delete dir="${temp.bak}/@{val3}" />
</sequential>
</for>
<echo>33333333333333333333333-makeTheFolder--33333333333333333333333</echo>
<for list="${directory.path}" param="val2">
<sequential>
<available file="" filepath="${temp.bak}@{val2}" type="dir" property="your.file.path.here.present" />
<if>
<equals arg1="${your.file.path.here.present}" arg2="true" />
<else>
<scp file="${ftp.repoURL}@{val2}" todir="${local.repoURL}/@{val2}" trust="true" failοnerrοr="false"/>
</else>
</if>
<var name="your.file.path.here.present" unset="true" />
</sequential>
</for>
</target>