温暖洁森

勇敢做自己

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  13 随笔 :: 1 文章 :: 70 评论 :: 0 Trackbacks
最近自己出于对项目持续构建感兴趣,特花一点时间对这块进行研究并取得一些不错的效果,目前使项目达到了自动化构建集成的效果,说一下自己的方案

持续集成工具:CruiseControl,俗称cc
构建工具:Ant (Maven不错,但还未使用熟练)
应用服务器:tomcat
版本控制器:Subversion



1、cc的设置

首先下载CruiseControl,目前版本是2.7.1,打开目录,找到config.xml文件

<cruisecontrol>
    <project name="sanitation">

        <listeners>
            <currentbuildstatuslistener file="logs/${project.name}/status.txt"/>
           </listeners>

        <bootstrappers>
            <svnbootstrapper localWorkingCopy="projects/${project.name}" />
                   </bootstrappers>

        <modificationset quietperiod="30">
            <svn localWorkingCopy="projects/${project.name}"/>
                  </modificationset>

        <schedule interval="3600">
           <ant anthome="apache-ant-1.7.0" buildfile="projects/${project.name}/build.xml"/>
          </schedule>

        <log>
           <merge dir="projects/${project.name}/target/test-results"/>
                  </log>

        <publishers>
            <onsuccess>
                <artifactspublisher dest="artifacts/${project.name}" file="projects/${project.name}/target/${project.name}.jar"/>
                            </onsuccess>
            <email mailhost="XXXX" returnaddress="XXX" buildresultsurl="XXXX" skipusers="true" spamwhilebroken="true">
             <always address=XXX@XXX/>
               <failure address=XXX@XXX/>
            </email>
        </publishers>

    </project>
</cruisecontrol>


其中${project.name}根据实际情况改成自己的项目名称,<schedule interval="3600">是指过一小时进行下次轮循,这里单位是秒,<publishers>执行完毕后可以通过发送有邮件方式进行通知,上面是成功或失败都进行通知,这样 cc环境就布置完毕

2、ant脚本

只摘取关键部分

<project basedir="." default="deploy-test" name="sanitation">
<target name="deploy-test" depends="quickstart,fun-test,test" />

<!-- ===================================
   把打包的文件拷贝到tomcat目录下
  ==================================== -->
 <target name="quickstart" depends="war" description="santation程序">
  <echo message="打包部署开始..." />
  <antcall target="tomcat.stop" />
  <delete dir="${server.deploy}/${ant.project.name}" />
  <delete file="${server.deploy}/${ant.project.name}.war" />
  <copy todir="${server.deploy}" file="${release.warfile}" />
  <echo message="打包部署结束..." />
 </target>

<!-- 执行Selenium Web功能测试 -->
 <target name="fun-test" depends="compile">
  <path id="selenium.server.runtime">
   <fileset dir="lib/test" includes="selenium-server-*.jar" />
  </path>

  <delete dir="${functional_test.data}/**" />
  

  <antcall target="tomcat.start" />
  <antcall target="selenium.server.start" />

  <junit printsummary="yes" fork="true" errorProperty="test.failed" failureProperty="test.failed">
   <classpath>
    <path refid="test.classpath" />
    <path location="${test.build}" />
   </classpath>
   <formatter type="xml" />
   <formatter type="brief" usefile="false" />

   <test name="${testcase}" if="testcase" />
   <batchtest todir="${functional_test.data}" unless="testcase">
    <fileset dir="${test.build}">
     <include name="**/view/*Test.class" />
    </fileset>
   </batchtest>
  </junit>
  <antcall target="tomcat.stop" />
  <if>
   <istrue value="${test.failed}" />
   <then>
    <functional_test-report report.dir="${functional_test.report}" data.dir="${functional_test.data}" />
    <fail>Unit tests 失败. 请于${functional_test.report}目录观看错误信息报表.</fail>
   </then>
  </if>
 </target>

<!-- 执行JUNIT功能测试 -->

<target name="test" depends="compile">

  <!-- 检查 junit.jar -->
  <available classname="junit.framework.TestCase" property="junit.present" />
  <fail unless="junit.present" message="Please copy lib/junit-3.8.1.jar into env.ANT_HOME/lib or Class Path" />
  <!-- 清除上次的data数据 -->
  <delete dir="${test.data}" />
  <mkdir dir="${test.data}" />
  <!-- 执行测试 -->
  <junit printsummary="yes" fork="true" errorProperty="test.failed" failureProperty="test.failed">
   <classpath>
    <path refid="test.classpath" />
    <path location="${test.build}" />
   </classpath>
   <formatter type="xml" />
   <formatter type="brief" usefile="false" />

   <!-- 执行单个或批量的test case。
    如果在命令行有定义testcase,
    如: ant -Dtestcase=com.gresoft.sanitation.test.MyTestCase
    则执行单个test case. -->
   <test name="${testcase}" if="testcase" />

   <batchtest todir="${test.data}">
    <fileset dir="${test.build}">
     <exclude name="**/functional/**/*Test.class" />
     <exclude name="**/view/*Test.class" />
     <include name="**/*Test.class" />
    </fileset>
   </batchtest>
  </junit>
  <if>
   <istrue value="${test.failed}" />
   <then>
    <test-report report.dir="${test.report}" data.dir="${test.data}" />
    <fail>Unit tests 失败. 请于${test.report}目录观看错误信息报表.</fail>
   </then>
  </if>
 </target>


此脚本主要目的是自动从svn服务器上更新最新程序并进行编译,部署,selenium页面测试,junit功能测试的过程,并自动把运行后结果以邮件形式进行提醒,这样整个流程就算结束,然后一小时后cc自动进行下一次的自动构建过程


问题:其中脚本中  <antcall target="tomcat.stop" />是过程中必须要加入的,如果脚本执行完tomcat还没关闭,cc会一直处于停止状态,一小时后也不会继续轮循,因为它需要等待一个返回信息目前这好象是cc一个bug

详情看:http://confluence.public.thoughtworks.org/display/CC/Starting+a+server+with+cc

好处:使用此方式可以每小时能跟踪项目中各组员项目开发情况,并对系统功能进行持续测试,把问题可以及时进行反馈以便解决,其中项目中测试完整性是整个过程的最关键部分,测试完整加上持续集成工具就可以达到项目自动构建集成功能


这是自己一些简要的步骤,如大家有兴趣我可以以后提供更为详细的步骤!


一些截图

 




参考资料     CruiseControl step by step 搭建你的持续集成服务器

posted on 2008-01-03 11:51 harry520 阅读(2133) 评论(3)  编辑  收藏 所属分类: J2EE

评论

# re: 关于每日构建|每小时构建[未登录] 2008-01-05 14:32 切尔斯基
在浏览器中输入 http://10.62.1.11:9001/dashboard/, 你会看到全新的CruiseControl的界面  回复  更多评论
  

# re: 关于每日构建|每小时构建 2008-01-06 16:13 wuxj888java
有一篇参考文章
http://www.blogjava.net/chelsea/archive/2008/01/05/173004.html  回复  更多评论
  

# re: 关于每日构建|每小时构建 2009-04-08 10:19 zyf
写的是蛮详细的,但是能否再加上注释啊?有些步骤看的不太明白呢  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: