Ant + SvnLib实现自动更新,编译,打包,发布部署

时间:2022-10-18 11:21:59

每次修改点东西后,重新发布的时候要从svn上将最新代码更新下来,重新编译打包,停掉服务器,把打好的包传上去,如果是WebSphere这样的web服务器的话,还要一步一步的部署,然后在启动服务器,感觉麻烦,搞程序开发的就是这样,懒,能自动处理的绝不手动做,能点一下完成的绝不点第二下,我就想能不能搞个脚本什么的一下就将这些事情搞完,就用ant 和 SVNKit弄了一下。

原理就是利用脚调用ant ,通过ant调用SVNKit的类来检出代码,然后编译,打成war包,在停掉服务器,将war包拷到服务器上,然后启动服务器就ok了,下面就开始吧

需要的东西(点击下边连接百度云下载)
 1、ant
 2、SVNKit(一些jar包)
 3、javaee.jar(编译时需要这个jar包)

点击此处下载所需要的东西

1、下载ant的安装包apache-ant-1.9.3-bin.tar.gz

2、解压到一个目录,比如/opt下

3、如果bin目录下的ant文件没有执行权限,切换到bin目录下,用chmod +x ant添加执行权限

4、配置环境变量,使ant命令在任意位置都可以用

在/etc/profiles文件最后添加如下(注意路径要写对)

PATH=$PATH:$HOME/bin
export ANT_HOME=/opt/apache-ant-1.9.3
export PATH=$ANT_HOME/bin:$PATH
export PATH

保存并退出

执行source /etc/profiles,使修改的环境变量生效

5、将SVNKit的jar和javaee.jar包复制到一个制定目录下,我将SVNKit的jar包都放到/opt/apache-ant-1.9.3/svnlib下了,将javaee.jar放到/opt/apache-ant-1.9.3/下了,这个位置随意只要下边写build文件时把路径搞对了就可以

6、就是写build.xml文件和脚本了,下载的文件里有,只要把相应的地方(标红的部分)改对就行

/opt/build.xml文件内容

<?xml version="1.0" encoding="utf-8"?>
<project basedir="/cfiles/antTemp" name="myProject" default="packageWar">

<!-- SVN相关属性 -->

<!-- SVN 用户名-->
<property name="svn.username" value="username" />
<!-- SVN密码 -->
<property name="svn.password" value="password" />
<!-- SVN需要的一些jar包,我把它放到ant目录下了,你也可以放到其他目录 -->
<property name="svn.libPath" value="/opt/apache-ant-1.9.3/svnlib" />
<!-- SVN地址 -->
<property name="svn.repository" value="http://www.nontrace.com:81/project/server" />
<!-- 项目名称 -->
<property name="projectName" value="Blog" />
<!-- SVN检出目录 -->
<property name="svn.checkoutDir" value="/cfiles/antTemp" />
<property name="svn.checkOutProject" value="${svn.checkoutDir}/${projectName}" />


<!-- 构建相关属性 -->
<!-- war包保存目录 -->
<property name="dir.warPath" value="/cfiles/publish" />
<!--
javaee.jar包所在目录,
如果是web项目的话,编译的时候会用到它,
我把它放到ant目录下了,你也可以放到其他目录 -->
<property name="dir.javaee" value="/opt/apache-ant-1.9.3" />
<!--
项目名称项目中源文件夹,
我这里有两个,src和config,一个里边是java代码,一个是配置文件-->
<property name="dir.src" value="${svn.checkOutProject}/src" />
<property name="dir.config" value="${svn.checkOutProject}/config" />
<!--WebRoot目录-->
<property name="dir.web" value="${svn.checkOutProject}/WebRoot" />
<!--项目依赖的jar包-->
<property name="dir.lib" value="${dir.web}/WEB-INF/lib" />
<!--编译后的class文件保存目录-->
<property name="dir.classes" value="${dir.web}/WEB-INF/classes" />
<property name="ContextRoot" value="ROOT" />

<!-- 日期格式yyyyMMdd 主要是为了生成目录 -->
<tstamp prefix="tempPro.">
<format property="today" pattern="yyyyMMdd" />
</tstamp>

<!-- 项目编译依赖的jar包,包括lib下的jar和javaee.jar -->
<path id="applib">
<fileset dir="${dir.lib}">
<include name="**/*.jar" />
</fileset>
<fileset dir="${dir.javaee}">
<include name="javaee.jar" />
</fileset>
</path>

<!-- SVNKit相关包lib -->
<path id="svnlib">
<fileset dir="${svn.libPath}">
<include name="*.jar" />
</fileset>
</path>

<!-- SVN检出项目代码 -->
<target name="svnCheckout">
<echo message="删除原始文件,重新Checkout" />
<delete dir="${svn.checkOutProject}" />

<echo message="Checkout最新代码" />
<java classname="org.tmatesoft.svn.cli.SVN" dir="${svn.checkoutDir}" fork="true">
<arg value="checkout" />
<arg value="--username" />
<arg value="${svn.username}" />
<arg value="--password" />
<arg value="${svn.password}" />
<arg value="${svn.repository}/${projectName}" />
<classpath refid="svnlib" />
</java>
</target>

<!-- 删除classes目录,为编译构建做准备 -->
<target name="clean">
<delete dir="${dir.classes}" />
</target>

<!-- 编译构建项目 -->
<target name="compile" depends="svnCheckout,clean">
<echo message="编译Java文件" />
<mkdir dir="${dir.classes}" />
<!--
如果有多个源码包的话,每个源码包都要编译,我这里只有src
destdir:编译后的class文件保存目录
srcdir:源码目录
excludes:排除文件(这里将svn相关的一些文件排除)
includeAntRuntime:指出是否应在类路径中包括 Ant 运行时程序库,默认为 yes
classpath:导入需要使用的jar包
-->
<javac encoding="utf-8" destdir="${dir.classes}" srcdir="${dir.src}"
excludes="**/.svn/**" includeAntRuntime="false">
<classpath refid="applib" />
</javac>

<!--如果有多个源码包的话,每个源码包都要编译,我这里只有src-->
<echo message="拷贝资源文件" />
<copy todir="${dir.classes}" preservelastmodified="true">
<fileset dir="${dir.config}" excludes="**/*.java">
</fileset>
</copy>
</target>

<!-- 打包 -->
<target name="packageWar" depends="compile">
<war destfile="${dir.warPath}/${tempPro.today}/${ContextRoot}.war"
basedir="${dir.web}" />
<echo message="删除文件" />
<delete dir="${svn.checkOutProject}" />
</target>
</project>

到这其实就可以自动从svn上检出并打包了,但是还不能自动部署,其实tomat部署就是停掉服务器,将原来部署的删掉,在将新的复制过去就行了

这一过程我们用一个shell脚本来完成

编写shell脚本publish(放到/bin下就不用再设置环境变量了,直接就可以执行,记得添加可执行权限哈)
#vi /bin/publish
脚本内容

!/bin/bash
#调用ant打包
cd /opt
ant
#停止服务器
cd /opt/apache-tomcat-8.0.9/bin
./shutdown.sh
#删除包
cd /opt/apache-tomcat-8.0.9/webapps
rm -rf ROOT
rm -rf ROOT.war
#拷贝war包
rq=` date +%Y%m%d `
cp /cfiles/publish/$rq/ROOT.war /opt/apache-tomcat-8.0.9/webapps
#启动服务器
cd /opt/apache-tomcat-8.0.9/bin
./startup.sh
给脚本添加可执行权限
# chmod +x /bin/publish
  ok了,build.xml和publish脚本中注释都挺清楚的,执行publish脚本就可以了
以上转载其他地方:http://www.nontrace.com/articles/2014/12/06/1417851702121.html