发布新日志

  • Daily Build Using CC and MSBuild

    2010-05-25 15:14:27

    在上一篇项目管理实践教程二、源代码控制【Source Control Using VisualSVN Server and TortoiseSVN】中我们已经讲解了如何使用TortoiseSVN和VisualSVN Server来做简单的版本控制,这一篇我们将会讲解使用CruiseControl.NET和MSBuild来搭建每日构建系统。

    在第一篇项目管理实践教程一、工欲善其事,必先利其器【Basic Tools】 中我们已经安装了CruiseControl.NET 1.4,因为我们还要用到MSBuild,所以如果你的系统没有安装Visual Studio,那么你需要首先安装Visual Studio 2005/2008,我们在这里使用的是Visual Studio 2008,准备好这些了吗?OK,我们正式开始今天的课程! 

    首先,我们要配置CruiseControl.NET【下面简写为CCNET】,配置完成后,我们每次提交源代码到SVN服务器后,CCNET就可以自动从SVN服务器上签出源代码,并调用MSBuild自动进行编译。我们以昨天的教程中创建的StartKit项目为实例,先看看下面的配置文件:

    CCNET配置文件代码


    好了,我们已经对CCNET的配置文件有了大致的了解,接下来,你打开CCNET的安装路径,找到子目录server下的ccnet.config文件,把上面的配置信息Copy到ccnet.config文件中,记得把配置文件中的一些路径修改为自己的实际路径啊,修改好后,保存。这时候,检查Windows服务CruiseControl.NET Server是否启动,如果没有则启动它,启动该服务后,打开浏览在地址栏输入上面配置文件中的webUrl地址:http://202.196.96.55:8080/server/local/project/StartKit/ViewProjectReport.aspx 也可以直接输入http://202.196.96.55:8080/server/ ,这里是演示地址,要根据自己的实际情况修改为正确的地址,OK,看到类似下图的效果,好了,搞定!如果你遇到了什么麻烦,请在下面留言,我一定会及时回复!
    点击StartKit,转入下图所示的页面:
    OK,到这里,我们提交更新到SVN服务器后,CCNET就会根据我们配置自动编译项目,而且我们也可以通过Web Dashboard来查看具体的编译信息了,提示如果配置了邮件发送,那么我们还可以通过邮件收到详细的编译信息,怎么样?够方便吧!

    其实,CCNET的功能是相当强大的,上面只是最常用的配置,其他还有很多非常好的功能。你想知道吗?那你可以在这里查看CCNET官方文档 ,实际上,你安装CCNET后,文档也已经安装到你的电脑了,在CCNET的安装目录下的webdashboard的子目录doc中就是。

    好了,我们今天的教程就到这里,本来我应该把如何使用CruiseControl.NET Tray来监视每次更新后的编译状态,但是今天真的太晚了,明天还要做项目,所以我明天补上,请大家见谅!
    补充部分:
    下面我简单讲一下,如何使用CruiseControl.NET Tray【以下简称CCTray】来监视每次提交后的编译状态。
    安装好打开CCTray后,运行CCTray程序,点击左上角的菜单File下的Settings…,如下图:

    点击Settings…会弹出下面的窗体:

    切换到Build Projects选项卡,如下图:

    点击Add…按钮,添加我们的CCNET服务器,如下图:

    输入我们的CCNET服务器后,CCNET服务器上的项目就会在右侧显示出来,如下图:

    选中右侧的项目后,点击OK按钮,返回CCTray打开时的界面,我们的二个项目已经添加进来了,如下图:

    我们在桌面的右下角的任务栏,可以看到如下图所示的图标:

    绿色的那个标示就是CCTray的标示,绿色表示所有的项目都通过了编译,紫红色表示至少有一个项目没有通过编译,橘黄色表示有项目正在编译,橘红色表示有项目被强制编译,显示为灰色则说明和CCNET服务器失去了链接。

    OK,大家可以使用CCTray实时监视提交更新后项目的编译状态了。

  • cruisecontrol下载地址

    2010-05-25 12:06:56

    http://cruisecontrol.sourceforge.net/download.html

  • 如何用CruiseControl.Net来进行持续化集成

    2010-05-25 12:02:47

     

    本文总结了过去一年中使用CruiseControl.Net来对工作流程进行持续化集成的经验教训,详细地讲述安装配置,使用CruiseControl.Net的具体步骤,希望通过阅读本文,能理解和掌握使用CruiseControl.Net的基本使用技巧,用工具来改善工作流程和提高工作效率。

    什么是持续化集成


    首先,我们先搞清楚什么是持续化集成?它对我们的日常工作有什么样的帮助?在过去几年中,敏捷已经是一个非常热门的话题,它高效的工作方式和快速的需求应对能力,赢得了很多中小软件厂商的关注。那么敏捷除了一些经常谈论到编程思维和迭代的开发模式等,其实还部分依赖于好的改善工作流程的工具。持续化集成工具便是服务于敏捷软件开发的一个系列。它主要将原本分散,无序的工作流程,通过工具软件有机的组织起来,并且在组织的过程中,参与开发设计测试的各个部门的人员都能从中获取到自动化方面的优惠。使得团队的工作效率大大提升。

    CruiseControl.Net是什么?

    上面讲解了什么是持续化集成,那CruiseControl.Net就是一款由ThoughtWorks公司提供给我们的轻量级的持续化集成工具。它能够将代码版本控制,单元测试,代码规范检查,项目的发布部署等工作步骤有机的组织起来,并且利用其调度性可作自动化处理,它还有强大的日志记录功能,能将集成结果及时地反馈给项目管理人员和项目开发人员。在下文中凡是用到CruiseControl.Net均用CC.Net来代替。下面是CC.Net的工作流程图
    附件: 030308_1005_CruiseContr1.png


    如何安装CC.Net

    CC.Net是一款开源软件,它的官方主页是: http://confluence.public.thoughtworks.org/display/CCNET/Welcome+to+CruiseControl.NET

    打开它的主页,便能看出他的官方采用另外一款非常出色的团队协作平台:Confluence,用它结合jira Bug管理系统,也能极大限度的提高团队协作能力,有关他们的介绍请访问:http://www.jira.com/ 。好了,返回来继续介绍CC.Net,当前官方已经发布了最新的CruiseControl.NET-1.3.0.2918,在首页的release栏中,便可以找到下载最新版CC.Net的连接,它是一款开源软件,你也可以在http://www.sf.net中找到它的源码和安装文件。如果你就是想使用CC.Net直接下载exe文件即可。下载后,在本地的安装过程如下:

    • 双击CruiseControl.NET-1.3-Setup.exe程序,打开软件安装界面,如下:
      附件: 030308_1005_CruiseContr2.png

    • 一直点击Next,选择软件安装路径,等待软件安装完成,界面如下:
      附件: 030308_1005_CruiseContr3.png

    • 软件安装完成之后,在系统windows服务中将增加名为CruiseControl.Net Server的系统服务,如下:
      附件: 030308_1005_CruiseContr4.png

      注意,默认情况该服务是出于未启动状态的。

    因为CC.Net是一个集成持续工具在部署CC.Net之前,单独靠它自己是没有实际意义的,所以在部署配置CC.Net之前,您需要事先准备好并且安装下述 软件:
    • 代码版本管理工具如VSS
    • 代码构建工具,如果您是vs.net的用户,强烈建议不要使用NAnt,配置起来比较麻烦,建议使用MsBuild来做构建工具。MsBuild是随.Net FrameWork 2.0一起安装的,所您需要在CC.Net服务器上安装.Net FrameWork 2.0或者以上版本。
    • 代码规范检查工具,.Net用户推荐使用FxCop.exe,下载地址:http://www.microsoft.com/downloads/details.aspx?FamilyID=3389f7e4-0e55-4a4d-bc74-4aeabb17997b&displaylang=en,很不幸的是,它原来的官方主页 http://code.msdn.microsoft.com/GotDotNet.aspx 关闭了,在新的站点中,我没有搜索到它。
    • 单元测试工具:Nunit,官方主页:http://sourceforge.net/projects/nunit
    • 发布部署工具,如果是asp.net网站,可以使用ASP.NET 编译工具 (Aspnet_compiler.exe),但我感觉它不好用,于是我自己实现了一系列的代码发布,FTP上传,XCopy安装等组件,在后面会提到。
    除了上述,CC.Net还支持NCover,Simian和Fitness,我没有具体应用,便不多讲。

    如何配置和部署

    假定上述的几个工具已经成功安装,下面就用一个项目来演示一下如何实现自动化构建,单元测试,代码规范检测,自动发布部署。并且可以演示项目管理和开发人员通过什么样的手段能及时了解持续集成化的结果。

    在演示制作之前,我们先来看一下当前的持续集成环境。

    工具
    地址和路径
    Visual Studio SouceSafe
    本局域网下一台服务器,IP地址192.168.1.200,共享目录:VSS,所以其根路径为: [url=file://192.168.1.200//VSS]\\192.168.1.200\\VSS[/url] ,用户名user,密码pwd
    CC.Net
    CC.Net安装在IP地址为:192.168.1.10的服务器上。
    单元测试工具NUnit
    和CC.Net安装在同一主机
    代码规范工具FxCop
    和CC.Net安装在同一主机
    发布服务器
    位于公网的一台服务器,IP假设为200.100.11.15


    首先,我们创建用于演示的解决方案Jillzhang.DailyBuild,其中包括四个项目:
    项目
    项目描述
    Jillzhang.DailyBuild.Core
    这个是一个公共类库项目,目的是测试类似这样的项目也在构建范围之内。
    Jillzhang.DailyBuild.Test
    单元测试项目
    Jillzhang.DailyBuild.Web
    网站项目一
    Jillzhang.DailyBuild.Web2
    网站项目二

    建立好解决方案之后,将其添加到VSS项目管理器中。层次结构如下:
    附件: 030308_1005_CruiseContr5.png
    下面我让我们看一下,如何配置CC.Net使其工作起来。
    • 在CC.Net服务器上,点击开始菜单,在所有程序中选择CruiseControl.Net,打开CruiseControl.NET Config配置文件。
    • CC.Net支持同时监控和集成多个解决方案,每个解决方案在CC.Net中被称为1个Project.,在CruiseControl.NET Config中1个Project被一个<project>元素来描述。当然我们还要为每个Project指定名称和工作目录和日志存放目录。阅读CC.Net的文档,你可以了解<project>元素的一些属性和子元素。这里我只讲述一些我用到的。
    • name ,如<project name="Project1">表示1个名称为Project1的新工程,这个名称在日后会作为项目的标识显示给查看报告的用户。比如显示在cctray上或者在网站doashboard上进行显示。还有一个比较重要的子元素<workingDirectory>这个元素非常类似于WCF配置中的<baseAddress>,用它来指示工程的工作目录,也就是从版本管理器上下载文件的根目录。除了这些我们还需要设定子元素<artifactDirectory >它用来指示日志记录的保存位置。CC.Net为我们提供了几种版本管理方式,可以用<labeler> 来指定使用哪种类型的版本标签,如Date Labeller,Default Labeller等,具体也可以查阅文档。我们这里使用Date Laberller,所以设置为<labeler type="dateLabeller"/>。下面可以设置源代码管理器,CC.Net支持目前绝大多数主流的版本控制工具,如CVS,VSS,Rational ClearCase,VSTS, Alienbrain等十几种。我们这里使用VSS,根据上文VSS和解决方案的配置,我们这里设置为:
    1. <sourcecontrol type="vss" autoGetSource="true" applyLabel="true">

    2. <project>$/Jillzhang.DailyBuild.root/Jillzhang.DailyBuild</project>

    3. <username>user</username>

    4. <password>pwd</password>

    5. <ssdir>\\192.168.1.200\vss\</ssdir>

    6. <cleanCopy>false</cleanCopy>

    7. </sourcecontrol>
    复制代码


    将autoGetSource设置为true,CC.Net会通过监视VSS中代码的版本变化,自动从版本管理器中获取源代码。Project是要使用的解决方案在vss中的路径,值为如下:


    附件: 030308_1005_CruiseContr6.png

    Username为访问vss的用户名,password为访问vss的密码。ssdir是 vss代码库的共享路径,我这里为\\192.168.1.200\vss\ 。如果将cleanCopy设置为true,那么CC.Net每次获取最新文件的时候是否完全覆盖更新文件。
    当前,我们的配置文件为:

    1. <cruisecontrol>

    2. <project name="TestProject" webURL="http://127.0.0.1/ccnet/">

    3. <workingDirectory >E:\DailyBuild</workingDirectory>

    4. <artifactDirectory>E:\DailyBuild\Log</artifactDirectory>

    5. <labeller type="dateLabeller"></labeller>

    6. <sourcecontrol type="vss" autoGetSource="true" applyLabel="true">

    7. <project>$/Jillzhang.DailyBuild.root/Jillzhang.DailyBuild</project>

    8. <username>user</username>

    9. <password>pwd</password>

    10. <ssdir>\\192.168.1.200\vss\</ssdir>

    11. <cleanCopy>false</cleanCopy>

    12. </sourcecontrol>

    13. </project>

    14. </cruisecontrol>
    复制代码



    设置好VSS后,我们可以启动CC.Net了,方法如下,打开Services.Msc,找到CruismControl.Net Server服务,在启动之前,需要先解决一下可能最影响情绪的问题:我们知道windows services默认情况下是用本地系统账户运行的,可一般情况下我们会在当前操作用户下设置对vss共享目录的访问权限,比如当前windows运行账户为administrator,那么我们在administrator中通过net use设置对[url=file://192.168.1.200/vss/]\\192.168.1.200\vss\[/url]的访问,也可以通过Source Safe Client打开该代码库,可这往往是一个烟雾弹,当我们在CC.Net中试图用服务来访问[url=file://192.168.1.200/vss/]\\192.168.1.200\vss\[/url] 的时候,系统服务账户并没有与该共享目录建立会话,所以会拒绝访问[url=file://192.168.1.200/vss/]\\192.168.1.200\vss\[/url],连访问权限都没有,更不用说获取代码了。所以首先要注意的是启动前,先设置服务的运行账户:

    附件: 030308_1005_CruiseContr7.png

    只有这样,我们才能进行下面的工作:
    启动CruismControl.Net Server服务,重新签出,嵌入一下解决方案,稍等一段时间,我们便会在工作目录E:\DailyBuild中看到自动获取过来的文件。还要值得注意的一点是在log目录中最好事先创建好buildlogs,如果您在启动CrusimControl.Net Server服务的时候有错误出现,比如在启动的时候总是出现:
    附件: 030308_1005_CruiseContr8.png

    很可能得情况就是上面的配置有错误,您可以通过下面两种方式来确定服务到底出现了什么样的问题:
    • 按照提示,在事件查看器中查看错误,如:
      附件: 030308_1005_CruiseContr9.png

    • 您还可以到CrusimControl.Net Server的应用程序目录查找名为ccnet.log的文件,里面有CC.Net详细的操作步骤。
    如果没有启动错误并且在ccnet.log中没有明显的异常,可以打开监视网站来查看集成结果,监视网站的地址是在<project>元素上通过设置webURL属性来完成的,我们打开这个网址,如图:
    附件: 030308_1005_CruiseContr10.png

    当Last Build Status为Success的时候表示项目集成成功,此时点击项目名,可以查看具体的集成结果:
    附件: 030308_1005_CruiseContr11.png

    如果调用MsBuild来对代码进行生成,调用FxCop进行代码规范检查,和调用NUnit进行单元测试集成,还需要对CC.Net进行下一步的配置。
    代码规范检侧工具FxCop不能被CC.Net直接使用,它必须附加到MsBuild.Exe的命令行中,有关如何使用MSBuild,可以参考msdn,不做具体介绍。为此我们创建一个用于生成并检查代码规范的任务,CC.Net支持自定义任务,方法是:使用Task中的Executable Task。
    首先在工作目录,创建一个用于msbuild参数的DailyBuild.msbuild文件,文件内容如下:

    1. <Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

    2. <Target Name="Build">

    3. <!-- Clean, then rebuild entire solution -->

    4. <MSBuild Projects="Jillzhang.DailyBuild.sln" Targets="Clean;Rebuild"/>

    5. <!-- Run FxCop analysis -->

    6. <Exec Command="exeu.bat"
    7. />

    8. </Target>

    9. </Project>
    复制代码



    这个MsBuild选项会使得msbuild.exe在生成完成之后调用工作目录中的exeu.bat文件,exeu.bat中是关于使用FxCop方法的,内容如下:

    cd D:\Program Files\Microsoft FxCop 1.36

    d:

    FxCopCmd /project:E:\DailyBuild\Jillzhang.DailyBuild.FxCop /out:E:\DailyBuild\log\DailyBuild.FxCop.xml

    目的就是通过调用FxCop安装目录下的FxCopCmd命令行工具,对指定的程序集进行规范性检查,上述代码中,E:\DailyBuild\Jillzhang.DailyBuild.FxCop是事先生成好的FxCop项目文件,生成办法是打开FxCop 可视化界面,添加target,并保存到此为位置即可,如图:

    附件: 030308_1005_CruiseContr12.png

    并保存到E:\DailyBuild\Jillzhang.DailyBuild.FxCop
    添加能生成代码并且检测代码规范性的配置如下:

    1. <tasks>

    2. <exec>
    3. <executable>D:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\MSBuild.exe</executable>
    4. <baseDirectory>E:\DailyBuild</baseDirectory>

    5. <buildArgs>DailyBuild.msbuild /p:Configuration=Release</buildArgs>

    6. <buildTimeoutSeconds>1200</buildTimeoutSeconds>

    7. </exec >

    8. <merge>

    9. <files>

    10. <file>E:\DailyBuild\log\Build.FxCop.xml</file>

    11. </files>

    12. </merge>

    13. </tasks>
    复制代码



    注意,buildTimeoutSeconds是生成操作的超时时间,还有最好设置/p:Configuration=Release,因为这样有利于以后发布。而Merge是将上面各个任务中生成的日志进行合并。

    下面重新签出嵌入,观察集成结果:
    附件: 030308_1005_CruiseContr13.png

    可以看到,已经release成功。
    下面就看一下生成的DailyBuild.FxCop.xml,
    附件: 030308_1005_CruiseContr14.png
    打开看里面的内容便可以发现代码检测结果。

    http://www.pin5i.com/showtopic-21719.html

  • CruiseControl 配置

    2010-05-25 12:00:17

     

    CruiseControl 的概念和好处,我就不在复诉,下面是我的配置环境与配置文件。

    配置环境:

    CruiseControl : cruisecontrol-bin-2.7.zip

    Apache-Ant : 1.7.0

    Junit : 4.0

    JRE : 5.0_12

    Eclipse :

    在此环境中,要保持Ant与Junit的版本协调,最初使用Cruisecontrol-2.7随包发布的apache-ant-1.6.5进行单元测试时,会报 No tests found in .... ,Ant1.7是支持JUnit4的,所以将Ant升级为1.7.0的版本,问题解决。

    1、设置环境变量

         由于使用ZIP的版本,所以需要设置 JAVA_HOME 的路径。注意由ANT的版本已升级为1.7.0,所以在config.xm中应该指定ant_home的路径。

    2、CruiseControl 的config.xml

     

     1<?xml version='1.0' encoding='gb2312'?>
     2<cruisecontrol>
     3    <project name="projectName">
     4
     5        <!-- 用于处理一些项目有关的事件 -->
     6        <listeners>
     7            <!-- 用来访问项目当前创建的状态   file: 指定了状态文件的位置 -->
     8            <currentbuildstatuslistener file="logs/${project.name}/status.txt"/>
     9        </listeners>
    10        
    11        <!-- 在 CC 进行创建之前运行,是创建前的准备工作 -->
    12        <bootstrappers>
    13            <!-- 从源码控制系统更新本地文件: cvsbootstrappers、vssbootstrappers、svnbootstrapper -->
    14            <svnbootstrapper localWorkingCopy="projects/${project.name}" />
    15        </bootstrappers>
    16
    17        <!-- 检查各个源码控制系统中是否发生变化;quietperiod: 单位为秒 设定等待的时间 -->
    18        <!-- 第一次的取出工作为手动执行 -->
    19        <modificationset quietperiod="600">
    20            <svn localWorkingCopy="projects/${project.name}"/>
    21        </modificationset>
    22
    23        <!-- 指定了构建的时间间隔 单位为秒-->
    24        <schedule interval="60">
    25            <ant anthome="apache-ant-1.7.0" buildfile="projects/${project.name}/build.xml"/>
    26        </schedule>
    27        
    28        <!-- 指定项目日志保存的地点 -->
    29        <log>
    30            <!-- 通常是指定 CC 的合并日志的目录 -->
    31            <merge dir="projects/${project.name}/test-reports"/>
    32        </log>
    33        
    34        <!-- 在 build loop 结束之后运行,发布 build 的结果 -->
    35        <publishers>
    36            <!--onsuccess-->
    37                <!--用于对创建过程中产生的人工制品进行发布-->
    38                <!--artifactspublisher dest="artifacts/${project.name}" file="projects/${project.name}/target/${project.name}.jar"/>
    39            </onsuccess-->
    40
    41            <!--
    42                mailhost=邮件主机
    43                returnname=发件人
    44                returnaddress=发件地址
                           defaultsuffix=默认邮件后缀
    45            -->
    46            <htmlemail
    47                charset="UTF-8"
    48                mailhost="smtp.163.com" 
    49                defaultsuffix="@xxx.com"
    50                username="xxx@163.com"
    51                password="xxx"
    52                returnname="CruiseControl"
    53                returnaddress="xxx@163.com"
    54                subjectprefix="构建日志"
    55                xsldir="webapps/cruisecontrol/xsl"
    56                css="webapps/cruisecontrol/css/cruisecontrol.css">
    57                <always address="xxx@xxx.com.cn"/>
    58                <failure address="xxx@xxx,yyy@yyy.com.cn"/>
    59                
    60            </htmlemail>
    61
    62        </publishers>
    63
    64    </project>
    65</cruisecontrol>


    2、build.xml的特性文件

     1
     2projcet.path=xxx
     3
     4projcet.name=xxx
     5
     6catalina.home=xxx
     7
     8catalina.port=xxx
     9
    10catalina.username=xxx
    11
    12catalina.password=xxx


    3、工程的build.xml

     

      1<?xml version="1.0" encoding="UTF-8" ?>
      2
      3<!-- Continuous Integration 工程名称 Gms 默认任务 CI -->
      4<project default="CI" name="xxx" basedir=".">
      5
      6    
      7    <!-- 特性文件 在特性文件中 注意路径的正反斜杠问题 -->
      8    <property file="build.properties"/>
      9    
     10    <!-- ================================ 工程参数 ================================ -->
     11    
     12    <!-- 工程中文名称 -->
     13    <property name="projectName_CN" value="xxx"/>
     14    <!-- 工程目录 -->
     15    <property name="projectFolder" value="${projcet.path}/${projcet.name}"/>
     16    
     17    <!-- 源程序目录 -->
     18    <property name="sourceFolder" value="${projectFolder}/src/main/java"/>
     19    <!-- 配置文件目录 -->
     20    <property name="configFolder" value="${projectFolder}/src/main/config"/>
     21    <!-- 测试程序目录 -->
     22    <property name="testFolder" value="${projectFolder}/src/test/java"/>
     23    <!-- lib目录 -->
     24    <property name="libFolder" value="${projectFolder}/WebRoot/WEB-INF/lib"/>
     25    <!-- 编译程序目录 -->
     26    <property name="classFolder" value="${projectFolder}/WebRoot/WEB-INF/classes"/>
     27
     28    <!-- 单元测试报告目录 -->
     29    <property name="reportFolder" value="${projectFolder}/test-reports"/>
     30    <!-- 单元测试报告文件名 -->
     31    <property name="reportFileName" value="junit-noframes.html"/>
     32    
     33    <!-- ================================ 发布设置 ================================ -->
     34    
     35    <!-- 生成war文件 -->
     36    <property name="warFile" value="${projectFolder}/${projcet.name}.war"/>
     37    <!-- web.xml文件 -->
     38    <property name="webFile" value="${projectFolder}/WebRoot/WEB-INF/web.xml"/>
     39    <!-- 生成war文件的基础路径 -->
     40    <property name="warSource" value="${projectFolder}/target/classes"/>
     41
     42    <!-- ================================ 路径设置 ================================ -->
     43    
     44    <!-- 编译过程中用到的路径 -->
     45    <path id="compilePath">
     46        <!-- 编译程序目录 -->
     47        <pathelement path="${classFolder}" />
     48        <!-- 编译时lib路径 -->
     49        <path refid="libPath" />
     50    </path>
     51
     52    <!-- 单元测试时用到的路径 -->
     53    <path id="jUnitPath">
     54        <!-- 编译程序目录 -->
     55        <pathelement path="${classFolder}" />
     56        <!-- 编译时lib路径 -->
     57        <path refid="libPath" />
     58    </path>
     59
     60    <!-- 编译时lib路径 -->
     61    <path id="libPath">
     62        <!-- lib目录 -->
     63        <fileset dir="${libFolder}">
     64            <include name="**/*.jar" />
     65        </fileset>
     66    </path>
     67    
     68    <!-- ================================ 持续集成 ================================ -->
     69    
     70    <!-- 集成流程 暂时没有加入 Test -->
     71    <target name="CI" depends="init,compile,test,makewar,deploy-catalina" description="持续集成"/>
     72
     73    <!-- 1.初始化目标目录, class ; report -->
     74    <target name="init" description="初始化">
     75        
     76        <echo>正在删除编译程序目录</echo>
     77        <delete dir="${classFolder}" />
     78        <echo>正在创建编译程序目录</echo>
     79        <mkdir dir="${classFolder}" />
     80        
     81        <echo>正在删除单元测试报告目录</echo>
     82        <delete dir="${reportFolder}" />
     83        <echo>正在创建单元测试报告目录</echo>
     84        <mkdir dir="${reportFolder}" />
     85    </target>
     86
     87    <!-- 2.编译程序生成目标类 -->
     88    <target name="compile" depends="init" description="编译">
     89        <echo>编译源程序</echo>
     90        <!-- classpathref="编译路径" destdir="${编译程序目录}" -->
     91        <javac classpathref="compilePath" fork="true" memorymaximumsize="128m"
     92               destdir="${classFolder}" debug="true" deprecation="false"
     93               failonerror="false" verbose
Open Toolbar