Ant 利用 ant 脚本 自动构建 svn 增量 / 全量 系统程序升级包

scmroad · 发布于 2014年1月06日 · 175 次阅读
96

[i=s] 本帖最后由 scmroad 于 2014-1-6 14:12 编辑

作者:hoojo 出处: http://www.blogjava.net/hoojo/archive/2013/11/05/405984.html#406000

首先请允许我这样说,作为开发或测试,你一定要具备这种本领。你可以手动打包、部署你的工程,但这不是最好的方法。最好的方式就是全自动化的方式。开发人员提交了代码后,可以自动构建、打包、部署到测试环境。测试通过后进入到模拟环境或是直接发布的生产环境,这个过程可以是全自动的。但这个自动化的方式有一些公司用到了,但也有很多公司还不知道,他们的攻城师天天在做反复、没有多大意义的、浪费生命的事情。当然这种方式一般针对做自己的产品,如电商、通信行业。而给其他公司或企业做项目的比较少利用这种方式,当然也可以利用这种方式,只是不能直接发布到客户的服务器而已。当然有些公司是专门有人做这部分事情的!

说了这么多也没有什么恶意,只是觉得这种方式可以大大提高效率,降低人力、物力、财力而已。勿喷,O(∩_∩)O哈哈~嘿嘿~

在部署项目或打包项目中,通常大家都是手动部署或打包的多。很多公司把这一任务交个了我们做开发的,其实这部分应该谁做呢?本质上应该是测试的来完成,但一些公司的测试不会做这个,慢慢的就变成了开发的事情。有些公司是人手比较少、不健全,所以一部分人自己承担了这个事情。在我们手动打包的时,其实这是一个重复的、没有技术含量的、耗费体力的活儿。一般步骤就是更新svn上代码、修改好相关的配置、编译class、发布到tomcat(web工程)、测试启动无误、手动打包。

而有一种比较简单快速的方式就是利用meven或ant来完成这些工作,只要我们编写好脚本后。给相关的工作人员去运行这部分脚本就可以完成打包,甚至是部署项目,这些都是so easy~!我个人也比较赞成使用这种方式,比较简单、快速、重用性好,最难的可能编写build脚本,但这个脚本其实也是很简单的,它就想dos命令行,只不过它是用xml方式来完成命令行的而已。所以测试会写ant的build脚本这个也是应该的,如果你不会的话,还是建议你学习学习。反正是百益无一害的事情,何乐而不为呢!

一、基本流程

利用ant打包项目或打增量包的基本流程

[attach]2252[/attach]

值得一提的是jar包这个部分,这个步骤是为下面编译增量包做准备的。因为增量包导出的增量文件,它依赖于整个项目的其他代码,如果没有这些代码的支持是编译不通过。然而又不能直接通过diff得到增量的class,所以只能导出增量文件后,通过引用全部工程的代码的class再进行编译即可。

二、运行环境

1、安装jdk,不会自己上网查其他的

2、如果你还没有安装ant,那么你可以参考:http://www.cnblogs.com/hoojo/archive/2013/06/14/java_ant_project_target_task_run.html

会介绍一下ant的安装和使用的方法。

3、这里需要用到svn的ant相关工具包、命令支持。你需要下载svnant-1.3.1.zip,将里面的lib库放置在你的ant脚本的编译运行环境中。

4、因为某些项目使用到了泛型、annotation注解,使用javac有些代码是编译不通过的,所以这里使用了jdt的编译方式。参考:使用eclipse JDT compile class 会有很详细的介绍。

需要用到

jdtCompilerAdapter.jar org.eclipse.jdt.compiler.tool_1.0.1.v_793_R33x.jar org.eclipse.jdt.core_3.3.3.v_793_R33x.jar org.eclipse.jdt.debug.ui_3.2.102.v20071002_r332.jar 复制到ant_home/lib目录下,如果是利用eclipse运行脚本就需要把它加载到运行环境中。可以参考上面的:使用eclipse JDT compile class

三、编写ant的build脚本

1、首先看看ant工程的目录结构

[attach]2253[/attach] 简单介绍下目录结构:

src下面的ExportIncrementFiles.java是导出增量文件要用的,它在build命令increment中执行。它会读取diff 比较后的文件中的内容,并导出文件

dest 是checkout出来最新的svn的工程

dist 是编译上面dest目录中的工程,也是svn全量war的工程目录和jar

increment_dest 是增量工程,也就是上面的ExportIncrementFiles工具导出的工程

increment_dist 是编译上面increment_dest 的工程,也是增量包的工程目录

因为每个人的项目工程目录结构不一样,所以这个脚本并不会通用,我这里指针对自己的项目进行测试。

lib中是运行环境需要的jar库,其中主要的就是svnlib 这个你可以去下载 svnant-1.3.1.zip 以及JDT编译class的jar包,这个可以通过eclipse中的plugin中的jar包找到,可以参考:使用eclipse JDT compile class

increment.export.jar就是ExportIncrementFiles的class打成的jar包,这个是自己打的包,可以直接应用class也可以的,在increment命令引用,jar下载:http://download.csdn.net/detail/ibm_hoojo/6501165

build.properties是当前build的配置文件

build.xml就是主要的ant脚本

选中部分是打的war包,这个就可以部署了

patch.txt就是svn的diff 比较出的增量文件的目录路径列表

2、ExportIncrementFiles.java 导出增量文件

package com.hoo.util;

import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.FileReader;

/**

  • function: 导出在增量的文件
  • @author hoojo
  • @createDate 2013-11-2 下午10:00:01
  • @file ExportIncrementFiles.java
  • @package com.hoo.util
  • @project AntTest
  • @blog http://blog.csdn.net/IBM_hoojo
  • @email [email]hoojo_@126.com[/email]
  • @version 1.0 */ public class ExportIncrementFiles {

    /**

    • function: 导出增量文件
    • @author hoojo
    • @createDate 2013-11-2 下午10:15:43
    • @param configPath 增量文件路径配置目录
    • @param baseDir 基本路径 目标位置
    • @param destDir 增量文件保存位置
    • @throws Exception */ private static void export(String configPath, String baseDir, String destDir) throws Exception { String srcFile = baseDir + configPath; String desFile = destDir + configPath;

      int lastIndex = desFile.lastIndexOf("/"); String desPath = desFile.substring(0, lastIndex);

      File srcF = new File(srcFile); if(srcF.exists()){//如果不存在这样的源文件,就不再拷贝,这个用来解决版本之间有删除文件的情况。 File desF = new File(desFile); File desP = new File(desPath); if(!desP.exists()) { desP.mkdirs(); } System.out.println(srcFile); FileInputStream fis = new FileInputStream(srcF); FileOutputStream fos = new FileOutputStream(desF);

      byte[] buf = new byte[1024]; int len = 0; while((len = fis.read(buf)) != -1) { fos.write(buf,0,len); } fos.flush(); fos.close(); fis.close(); } }

    /**

    • function: 主函数 执行导出增量包任务
    • @author hoojo
    • @createDate 2013-11-2 下午10:00:01
    • @param args 参数1 增量包导出文件路径,参数2 要导出的文件的所在目标位置,参数3 增量包导出保存的位置路径 */ public static void main(String[] args) {

      if (args.length > 0) { if (args.length == 1 && "help".equals(args[0])) { System.out.println("args[0] is Export Increment Files content path"); System.out.println("args[1] is Export Increment Files target path"); System.out.println("args[2] is Increment Files Export loaction"); } else { String configPath = args[0]; String baseDir = args[1]; String destDir = args[2];

      try { BufferedReader br = new BufferedReader(new FileReader(configPath)); String s = null; while((s = br.readLine()) != null) { s = s.trim();//去掉路径前面的空格 String str = destDir + s; if(!destDir.equals(str)){//过滤空行 export(s, baseDir, destDir); } } br.close(); } catch (Exception e) { e.printStackTrace(); } } } } } main函数参数看注释,主要就是读取patch.txt增量文件路径,导出文件到指定目录的。

共收到 1 条回复
96
scmroad · #1 · 2014年1月06日

3、build 脚本

<?xml version="1.0" encoding="UTF-8" ?>

<!-- svn 比较项目最新路径 --> <!-- svn 备份路径-->

<!-- 项目名称 --> <!-- 目标项目的Web 名称(WEB-INF上一级的目录名称) -->

<!-- svn改动文件列表信息 -->

<!-- svn导出/切出文件存放目录 --> <!-- svn导出/切出文件编译后存放目录 --> <!-- svn增量文件保存目录 --> <!-- svn增量文件编译后保存目录 -->

<!-- 利用jdt编译class 解决泛型不能转换的问题 需要将 jdtCompilerAdapter.jar org.eclipse.jdt.compiler.tool_1.0.1.v_793_R33x.jar org.eclipse.jdt.core_3.3.3.v_793_R33x.jar org.eclipse.jdt.debug.ui_3.2.102.v20071002_r332.jar 复制到ant_home/lib目录下 -->

<!-- that is to test i svnant is available //-->

<!-- 比较差异 增量文件 -->

<!-- 下载 切成 导出 服务器上最新代码 -->

<!-- javac编译 --> compile ${dest.path} ......

<!-- -->

<!-- 利用JDT编译 --> compile ${dest_path} ......

<!-- 利用JDT编译SVN 最新项目 --> <!-- 回调任务 -->

<!-- 将全部项目的class 建立jar包 -->

<!-- 导出增量文件 -->

<!-- 利用JDT编译增量文件 -->

<!-- 全部打包 -->
create war file.......

<!--得到当前日期-->


<!-- 全部打包 -->

<!-- 全部打包 -->

<!-- svn 全量包 --> <!-- 增量包 -->

4、build的配置文件内容

#Mon, 04 Nov 2013 11:18:12 +0800 svn._url=http://172.31.100.100/svn/iMVS_DataComm2 bak.svn._url=http://172.31.100.100/svn/iMVS_DataComm svn.username=hoojo svn.password=mypass webapp.name=iMVS_DataComm web.root=WebRoot increment.file=patch.txt

javac.debuglevel=source,lines,vars javac.target=1.6 javac.source=1.6 javac.debug=true

运行svn_war任务可以打全部的包,也就是svn最新地址的项目工程包。

运行increment_war任务可以打增量包,也会形成一个war文件。

如果你需要发布到tomcat目录,可以写一个任务copy相关war包到tomcat的webapps的目录下,这个很简单~如果你需要调用tomcat的相关任务或命令,你需要在build脚本中加入

<!-- tasks: deploy,undeploy,reload,stop,start,list,roles,resources --> 关于这些命令使用方法有兴趣的可以自己研究研究。

四、总结

整个流程稍微有点复杂,只要思路清晰这个build脚本还是很容易编写的。前提是你要懂得Java发布、编译、部署的流程,很多人用eclipse或MyEclipse来发布工程,好像很简单。其实在工具背后也是使用这些脚本完成的,知道在用户目录下有一个 .m2的目录么,这个就是eclipse工具的meven的缓存和配置的内容。所以当我们不使用这些ide的情况下,你怎么编译、部署你的项目呢~!这篇文章只是一个抛砖引玉的效果,希望能给大家一个启示。在这之前,我在网上搜集了些资料也没有找到打增量包的比较好的方法,全都是手动方式。

同时,在一些自动集成或持续集成的智能工具中,也大量的使用到了这方面的技术。如果你想更智能的完成这个项目的发布、部署的话,这里只是其中的第一步。有兴趣的朋友可以研究下Continuous integration或Hudson等相关自动化集成技术应用。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册