ant+svn检出并部署项目

项目分server端和protal端,这个demo只写了打包server端的。

这份build.xml有个bug就是在这段

<antcall target="changeConfigBefore" />

因为我直接在svn检出的项目上更改配置文件并导出jar。导致下一次运行ant命令时执行到svnUpdate会提示项目有冲突需要解决。

解决方法:可以把server项目拷出来然后在副本项目上操作打包,还有个更方便的方法是更改svnUpdate的target

<target name="svnUpdate" depends="svnCheckout">
        <java classname="org.tmatesoft.svn.cli.SVN" dir="${prj.checkout.path}" fork="true">
            <arg value="co"/><!-- update改成co  覆盖更新 -->
            <arg value="--username"/>
            <arg value="${prj.svn.username}"/>
            <arg value="--password"/>
            <arg value="${prj.svn.password}"/>
            <arg value="${prj.checkout.path}/${prj.svn.name}"/>
            <classpath refid="antlib" />
        </java>
    </target>

正文
不需要安装ant环境,ant项目结构如下
这里写图片描述

config.properties配置

#部署项目(逗号分隔)
projects=bhjf,mfjk

#源码检出目录
svncode.path=svncode

#源码编译目录
compile.path=build

#war包保存目录
war.path=war

#war检出
war.upload.path=upload

#日志目录
log.path=log

build.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<!--使用ant+svnkit一键部署-->
<project name="deployment" default="deployment" basedir=".">
    <!-- 获取部署的项目 -->
    <property file="${basedir}/config/config.properties" />
    <!-- 日志 -->
    <record name="${basedir}/${log.path}/log.log" loglevel="error" append="no" action="start"/>
    <!-- server端lib路径 -->
    <path id="server.classpath">
        <fileset dir="${basedir}/${svncode.path}/${src.prj.name}/${src.prj.server}/WebContent/WEB-INF/lib">
            <include name="**/*.jar"/>
        </fileset>
    </path>

    <!-- ant库 -->
    <path id="antlib">
        <fileset dir="${basedir}/antlib">
            <include name="**/*.jar"/>
        </fileset>
    </path>

    <taskdef resource="net/sf/antcontrib/antlib.xml" classpathref="antlib" />

    <!-- 部署 -->
    <target name="deployment">
        <input message="选择要部署的项目" addproperty="project" validargs="${projects}" defaultvalue="bhjf" />
        <property file="${basedir}/config/project/${project}.properties" />

        <antcall target="getSvnProjects" />

        <if>
            <equals arg1="${is_upload}" arg2="1" />
            <then>
                <antcall target="getDestCode"/>
            </then>
            <else/>
        </if>

        <if>
            <equals arg1="${project}" arg2="bhjf"/>
            <then>
                <antcall target="changeConfigBefore" />
            </then>
            <else/>
        </if>

        <antcall target="compile" />
        <antcall target="changeConfigAfter" >
            <param name="src.server" value="${basedir}/${compile.path}/${src.prj.name}/${src.prj.server}" />
        </antcall>
        <antcall target="package" />

        <if>
            <equals arg1="${is_upload}" arg2="1"/>
            <then>
                <antcall target="upload"/>
                <antcall target="restart"/>
            </then>
            <else/>
        </if>
    </target>

    <!-- 获取所有项目 -->
    <target name="getSvnProjects">
        <antcall target="checkOut">
            <param name="tmp.prj.name" value="${src.prj.server}"/>
        </antcall>
    </target>

    <!-- 公共检出方法 -->
    <target name="checkOut">
        <antcall target="svnUpdate">
            <param name="prj.svn.name" value="${tmp.prj.name}"/>
            <param name="prj.checkout.path" value="${basedir}/${svncode.path}/${src.prj.name}"/>
            <param name="prj.svn.username" value="${svn.src.username}" />
            <param name="prj.svn.password" value="${svn.src.password}" />
            <param name="prj.svn.repository" value="${svn.src.repository}/${tmp.prj.name}" />
        </antcall>
    </target>

    <!-- 项目更新 -->
    <target name="svnUpdate" depends="svnCheckout">
        <java classname="org.tmatesoft.svn.cli.SVN" dir="${prj.checkout.path}" fork="true">
            <arg value="update"/>
            <arg value="--username"/>
            <arg value="${prj.svn.username}"/>
            <arg value="--password"/>
            <arg value="${prj.svn.password}"/>
            <arg value="${prj.checkout.path}/${prj.svn.name}"/>
            <classpath refid="antlib" />
        </java>
    </target>

    <!-- 项目检出 -->
    <target name="svnCheckout" unless="isProjectExist" depends="checkProjectExist">
        <mkdir dir="${prj.checkout.path}"/>
        <java classname="org.tmatesoft.svn.cli.SVN" dir="${prj.checkout.path}" fork="true">
            <arg value="checkout"/>
            <arg value="--username"/>
            <arg value="${prj.svn.username}"/>
            <arg value="--password"/>
            <arg value="${prj.svn.password}"/>
            <arg value="${prj.svn.repository}"/>
            <classpath refid="antlib" />
        </java>
    </target>

    <!-- 项目是否已检出 -->
    <target name="checkProjectExist">
        <condition property="isProjectExist">
            <and>
                <available file="${prj.checkout.path}/${prj.svn.name}" />
            </and>
        </condition>
    </target>

    <!-- 获取svn war文件 -->
    <target name="getDestCode">
        <antcall target="svnUpdate">
            <param name="prj.svn.name" value="${dest.prj.name}" />
            <param name="prj.checkout.path" value="${basedir}/${war.upload.path}/${src.prj.name}" />
            <param name="prj.svn.username" value="${svn.dest.username}" />
            <param name="prj.svn.password" value="${svn.dest.password}" />
            <param name="prj.svn.repository" value="${svn.dest.repository}/${dest.prj.name}" />
        </antcall>
    </target>

    <!-- 修改服务端打jar包前需要更改的配置文件 -->
    <target name="changeConfigBefore">
        <property name="svncode.server.src" value="${basedir}/${svncode.path}/${src.prj.name}/${src.prj.server}" />
        <replaceregexp byline="true" file="${svncode.server.src}/src/com/dy/core/trust/hisxfpay/hisxfpay.properties" match="trust.hisxfpay.weburl=(.*)" replace="trust.hisxfpay.weburl=${trust.hisxfpay.weburl}" />
        <replaceregexp byline="true" file="${svncode.server.src}/src/com/dy/core/trust/hisxfpay/hisxfpay.properties" match="trust.hisxfpay.mobile.url=(.*)" replace="trust.hisxfpay.mobile.url=${trust.hisxfpay.mobile.url}" />
    </target>

    <!-- 编译项目 -->
    <target name="compile" depends="clean">
        <antcall target="build.server" />
        <!--<antcall target="build.protal" >
            <param name="prj_name" value="admin"/>
        </antcall>
        <antcall target="build.protal" >
            <param name="prj_name" value="user"/>
        </antcall>-->
    </target>

    <target name="clean">
        <delete dir="${basedir}/${compile.path}/${src.prj.name}" />
    </target>

    <!-- 编译服务端项目 -->
    <target name="build.server">
        <mkdir dir="${basedir}/${compile.path}/${src.prj.name}/${src.prj.server}" />

        <property name="server.path" value="${basedir}/${svncode.path}/${src.prj.name}/${src.prj.server}" />
        <property name="server.build.path" value="${basedir}/${compile.path}/${src.prj.name}/${src.prj.server}" />
        <copy overwrite="true" todir="${server.build.path}" includeemptydirs="true">
            <fileset dir="${server.path}/WebContent" excludes="**/*.svn,**/*.class" />
        </copy>

        <!-- 编译java文件-->
        <javac srcdir="${server.path}/src" includes="**/*.java" 
            destdir="${server.build.path}/WEB-INF/classes" fork="true" compiler="javac1.6" 
            source="1.6" target="1.6" memoryInitialSize="1024m" memoryMaximumSize="1024m" 
            debug="true" failonerror="true" includeantruntime="true" deprecation="false" encoding="UTF-8">
            <classpath refid="server.classpath" />
        </javac>

        <copy overwrite="true" todir="${server.build.path}/WEB-INF/classes" includeemptydirs="false">
            <fileset dir="${server.path}/src" excludes="**/*.svn,**/*.java" />
        </copy>
        <copy overwrite="true" todir="${server.build.path}/WEB-INF/classes" includeemptydirs="false">
            <fileset dir="${server.path}/config" excludes="**/*.svn,**/*.java" />
        </copy>
        <copy overwrite="true" todir="${server.build.path}/WEB-INF/classes" includeemptydirs="false">
            <fileset dir="${server.path}/resources" excludes="**/*.svn,**/*.java" />
        </copy>
        <copy overwrite="true" todir="${server.build.path}/WEB-INF/classes" includeemptydirs="false">
            <fileset dir="${server.path}/xmlmapper" excludes="**/*.svn,**/*.java" />
        </copy>

        <!-- 打jar包供protal端调用 -->
        <jar jarfile="${basedir}/${compile.path}/${src.prj.name}/lib/server.jar">
            <fileset dir="${server.build.path}/WEB-INF/classes" includes="**/core/**/*.key,**/core/**/*.properties,**/core/**/*.pfx,**/core/**/*.p12"/>
            <fileset dir="${server.build.path}/WEB-INF/classes" includes="**/core/**/*.class" excludes="**/core/dao/interceptor/*.class,**/core/dao/jotm/*.class,**/core/dao/BaseMapper.class"/>
            <fileset dir="${server.build.path}/WEB-INF/classes" includes="**/baf/entity/**/*.class" />
            <fileset dir="${server.build.path}/WEB-INF/classes" includes="**/*Service.class" />
            <fileset dir="${server.build.path}/WEB-INF/classes" includes="cunnar.properties" />
        </jar>
    </target>

    <!-- 更改配置文件 -->
    <target name="changeConfigAfter">
        <!-- 更改数据库配置 -->
        <replaceregexp byline="true" file="${src.server}/WEB-INF/classes/dbconfig.properties" match="system.jdbc.username:(.*)" replace="system.jdbc.username:${jdbc.username}" />
        <replaceregexp byline="true" file="${src.server}/WEB-INF/classes/dbconfig.properties" match="system.jdbc.password:(.*)" replace="system.jdbc.password:${jdbc.password}" />
        <replaceregexp byline="true" file="${src.server}/WEB-INF/classes/dbconfig.properties" match="system.jdbc.url:(.*)" replace="system.jdbc.url:${jdbc.url}" />
    </target>

    <!-- 打war包 -->
    <target name="package">
        <delete file="${basedir}/${war.path}/${src.prj.name}/${war.prj.server}.war" />
        <war encoding="gbk" destfile="${basedir}/${war.path}/${src.prj.name}/${war.prj.server}.war" basedir="${basedir}/${compile.path}/${src.prj.name}/${src.prj.server}">
            <include name="**/*" />
        </war>
    </target>

    <!-- 上传到svn -->
    <target name="upload">
        <antcall target="svnCommit">
            <param name="upload.dir" value="${basedir}/${war.upload.path}/${src.prj.name}" />
            <param name="upload.war" value="${war.prj.server}.war" />
        </antcall>
    </target>

    <!-- svn提交war -->
    <target name="svnCommit" depends="isNewWar,isUpdateWar">
        <if>
            <equals arg1="${svn.is.add}" arg2="1" />
            <then>
                <antcall target="copyWar" />
                <antcall target="svnAdd" />
            </then>
            <else>
                <antcall target="copyWar" />
            </else>
        </if>
        <java classname="org.tmatesoft.svn.cli.SVN" dir="${basedir}" fork="true">
            <arg value="commit"/>
            <arg value="--username"/>
            <arg value="${svn.dest.username}"/>
            <arg value="--password"/>
            <arg value="${svn.dest.password}"/>
            <arg value="-m"/>
            <arg value='"daily build"'/>
            <arg value="${upload.dir}/${upload.war}"/>
            <classpath refid="antlib" />
        </java>
    </target>

    <!-- 首次部署 -->
    <target name="isNewWar" unless="isFileExist" depends="isDestWarExist">
        <property name="svn.is.add" value="1" />
    </target>

    <!-- 二次更新war包 -->
    <target name="isUpdateWar" if="isFileExist" depends="isDestWarExist">
        <property name="svn.is.add" value="0" />
    </target>

    <!-- svn服务器是否有war文件 -->
    <target name="isDestWarExist">
        <condition property="isFileExist">
            <and>
                <available file="${upload.dir}/${upload.war}" />
            </and>
        </condition>
    </target>

    <!-- 新打的war包覆盖检出的war包 -->
    <target name="copyWar">
        <copy overwrite="true" tofile="${upload.dir}/${upload.war}" file="${basedir}/${war.path}/${upload.war}" />
    </target>

    <!-- 服务器新增war包 -->
    <target name="svnAdd">
        <java classname="org.tmatesoft.svn.cli.SVN" dir="${basedir}" fork="true">
            <arg value="add"/>
            <arg value="--username"/>
            <arg value="${svn.dest.username}"/>
            <arg value="--password"/>
            <arg value="${svn.dest.password}"/>
            <arg value="${upload.dir}/${upload.war}"/>
            <classpath refid="antlib" />
        </java>
    </target>

    <!-- 停止tomcat服务 -->
    <target name="shutdown">  
        <exec executable="${svn.dest.repository}/data/tomcat/bin/shutdown.sh" failonerror="false" />  
        <sleep seconds="10" />  
    </target>

    <!-- 重启tomcat服务 -->
    <target name="restart" depends="shutdown">  
        <sleep seconds="5" />  
        <exec executable="${svn.dest.repository}/data/tomcat/bin/startup.sh" failonerror="true" />  
    </target> 
</project>

每个项目各自写自己的prop文件
prop文件名与config.properties里projects要能对应上
如bhjf.properties

#源代码 svn信息
svn.src.username=root
svn.src.password=123456
svn.src.repository=svn\://192.168.10.22/project/testproject

#源文件 svn路径、名称
src.prj.name=testproject
src.prj.server=test_server

#war包 svn信息
svn.dest.username=root
svn.dest.password=123456
svn.dest.repository=svn://192.168.10.22

#war包 svn路径、名称
dest.prj.name=test.server.com
war.prj.server=test.server.com

#是否部署:0只打war 1war包上传到测试站服务器
is_upload=0

#测试站数据库地址
jdbc.username:root
jdbc.password:123456
jdbc.url:jdbc:mysql://127.0.0.1:3306/test_db?useUnicode=true&characterEncoding=utf8

#开启定时器0关闭,1开启
is_scheduled=1

这里写图片描述

猜你喜欢

转载自blog.csdn.net/ragin/article/details/69950595