`
johnnywww
  • 浏览: 21028 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
最近访客 更多访客>>
社区版块
存档分类
最新评论

用Hudson做持续集成

阅读更多

虽然以前就知道敏捷开发,并且也参加了一些沙龙,在开发过程中也用了TDD做开发,但是一直没有做持续集成,5月10号参加了百度App开发者大会,在会上和别的朋友交流了敏捷开发相关东东,决定还是要做每日构建,于是开始查资料,做持续集成的测试。在网上找到一篇好文章 ,上面有指导文档下载(强烈推荐),经过这两天测试,在指导文档的指引下,终于调通了,我采用Ant+Hudson+Vss+Emma+PMD+FindBugs+Jabber...,下面附上我的Build.xml,主要看target为ci关联的部分。

<?xml version="1.0" encoding="UTF-8"?>
<project name="testhudsonvss" default="deploy" basedir=".">
    <property name="pmd.home" value="E:/Source/Java/component/pmd-4.2.5"/>
    <property name="javancss.home" value="E:/Source/Java/component/javancss-32.53"/>
    <property name="findbugs.home" value="E:/Source/Java/component/findbugs-1.3.9"/>
    <property name="emma.home" value="E:/Source/Java/component/emma-2.0.5312"/>
    <property name="emma.enabled" value="true"/>
    <property name="junit.home" value="E:/Source/Java/component/junit4.6"/>
    <property name="checkstyle.home" value="E:/Source/Java/component/checkstyle-5.3"/>
    <property name="dist.dir" value="dist"/>
    <property name="build.dir" value="build"/>
    <property name="src.build.dir" value="${build.dir}/classes"/>
    <property name="emma.src.build.dir" value="${build.dir}/instr"/>
    <property name="test.build.dir" value="${build.dir}/test"/>
    <property name="lib.dir" value="lib"/>
    <property name="src.dir" value="src"/>
    <property name="test.dir" value="test"/>
    <property name="test.report.dir" value="${test.dir}/report"/>
    <property name="app.name" value="TestHudsonVss"/>
    <path id="app.classpath">
        <fileset dir="${lib.dir}">
            <include name="**/*.jar"/>
        </fileset>
    </path>
    <path id="junit.classpath">
        <fileset dir="${junit.home}">
            <include name="junit-4.6.jar"/>
        </fileset>
    </path>
    <path id="test.classpath">
        <pathelement path="${src.build.dir}"/>
        <path refid="app.classpath"/>
        <path refid="junit.classpath"/>
    </path>
    <path id="findbugs.classpath">
        <fileset dir="${findbugs.home}/lib">
            <include name="**/*.jar"/>
        </fileset>
    </path>
    <path id="javancss.classpath">
        <fileset dir="${javancss.home}/lib"/>
    </path>
    <path id="checkstyle.classpath">
        <fileset dir="${checkstyle.home}">
            <include name="**/checkstyle-5.3-all.jar"/>
        </fileset>
    </path>
    <path id="pmd.classpath">
        <fileset dir="${pmd.home}/lib/">
            <include name="*.jar"/>
        </fileset>
    </path>
    <path id="emma.classpath">
        <fileset dir="${emma.home}/lib">
            <include name="**/*.jar"/>
        </fileset>
    </path>
    <path id="emma.test.classpath">
        <pathelement path="${emma.src.build.dir}"/>
        <path refid="app.classpath"/>
        <path refid="junit.classpath"/>
    </path>
    <target name="clean" description="==清理构建环境==">
        <echo message="==Clean Project=="/>
        <delete dir="${build.dir}" failonerror="off"/>
        <delete dir="${dist.dir}" failonerror="off"/>
        <delete dir="${test.report.dir}" failonerror="off"/>
        <delete dir="checkstyle" failonerror="off"/>
    </target>
    <target name="prepare" description="==准备构建==" depends="clean">
        <echo message="==Prepare Project=="/>
        <mkdir dir="${src.build.dir}"/>
        <mkdir dir="${test.build.dir}"/>
        <mkdir dir="${test.dir}"/>
        <mkdir dir="${dist.dir}"/>
        <mkdir dir="${test.report.dir}"/>
    </target>
    <target name="pmd" description="pmd-check" depends="prepare">
        <echo message="==pmd=="/>
        <taskdef name="pmd" classname="net.sourceforge.pmd.ant.PMDTask" classpathref="pmd.classpath"/>
        <pmd shortFilenames="true">
            <ruleset>rulesets/favorites.xml</ruleset>
            <ruleset>basic</ruleset>
            <formatter type="xml" toFile="${dist.dir}/pmd.xml"/>
            <fileset dir="${src.dir}" includes="**/*.java"/>
            <fileset dir="${test.dir}" includes="**/*.java"/>
        </pmd>
    </target>
    <target name="javancss" description="javaNCSS" depends="prepare">
        <echo message="==javancss=="/>
        <mkdir dir="${dist.dir}/javancss"/>
        <taskdef name="javancss" classname="javancss.JavancssAntTask" classpathref="javancss.classpath"/>
        <javancss srcdir="${src.dir}" includes="**/*.java" generateReport="true"
                  outputfile="${dist.dir}/javancss-report.xml" format="xml"/>
        <!--<style  in="${dist.dir}/javancss-report.xml" out="${dist.dir}/javancss/javancss_report.html" style="${javancss.home}/xslt/javancss2html.xsl" mce_style="${javancss.home}/xslt/javancss2html.xsl"/>-->
        <xslt style="${javancss.home}/xslt/javancss2html.xsl" mce_style="${javancss.home}/xslt/javancss2html.xsl" in="${dist.dir}/javancss-report.xml"
              out="${dist.dir}/javancss/javancss_report.html"/>
    </target>
    <target name="checkstyle" depends="prepare">
        <echo message="==CheckStyle=="/>
        <mkdir dir="${dist.dir}/checkstyle"/>
        <taskdef resource="checkstyletask.properties" classpathref="checkstyle.classpath"/>
        <checkstyle config="${checkstyle.home}/springside3_checks.xml" failureProperty="checkstyle.failure"
                    failOnViolation="false">
            <formatter type="xml" tofile="${dist.dir}/checkstyle_report.xml"/>
            <fileset dir="${src.dir}" includes="**/*.java"/>
            <fileset dir="${test.dir}" includes="**/*.java"/>
        </checkstyle>
        <style in="${dist.dir}/checkstyle_report.xml" out="${dist.dir}/checkstyle/checkstyle_report.html"
               style="${checkstyle.home}/contrib/checkstyle-simple.xsl" mce_style="${checkstyle.home}/contrib/checkstyle-simple.xsl"/>
    </target>
    <target name="compile" description="==编译源代码==" depends="prepare">
        <echo message="==Compile Source Code=="/>
        <javac debug="true" destdir="${src.build.dir}" deprecation="true">
            <src path="${src.dir}"/>
            <classpath refid="app.classpath"/>
        </javac>
        <echo message="==Copy Config File=="/>
        <copy todir="${src.build.dir}">
            <fileset dir="${src.dir}" includes="**/*.xml"/>
            <fileset dir="${src.dir}" includes="**/*.properties"/>
            <fileset dir="META-INF/" includes="**/*"/>
        </copy>
    </target>
    <target name="findbugs" description="==动态分析源代码中可能存在的bug==" depends="compile">
        <echo message="==FindBugs=="/>
        <mkdir dir="${dist.dir}/findbugs"/>
        <taskdef name="findbugs" classname="edu.umd.cs.findbugs.anttask.FindBugsTask" classpathref="findbugs.classpath">
        </taskdef>
        <findbugs projectname="FindBugs-TestHudsonVss" home="${findbugs.home}" output="html"
                  outputfile="${dist.dir}/findbugs/FindBugs.html" jvmargs="-Xms128m -Xmx256m"
                  stylesheet="fancy-hist.xsl">
            <class location="${src.build.dir}"/>
        </findbugs>
    </target>
    <target name="findbugs-xml" description="==动态分析源代码中可能存在的bug==" depends="compiletest">
        <echo message="==FindBugs=="/>
        <taskdef name="findbugs" classname="edu.umd.cs.findbugs.anttask.FindBugsTask" classpathref="findbugs.classpath">
        </taskdef>
        <findbugs projectname="FindBugs-TestHudsonVss" home="${findbugs.home}" output="xml"
                  outputfile="${dist.dir}/findbugs.xml" jvmargs="-Xms128m -Xmx256m">
            <class location="${src.build.dir}"/>
            <class location="${test.build.dir}"/>
        </findbugs>
    </target>
    <target name="compiletest" description="==编译测试代码==" depends="compile">
        <echo message="==Compile Test Code=="/>
        <javac debug="true" destdir="${test.build.dir}" deprecation="true">
            <src path="${test.dir}"/>
            <classpath refid="test.classpath"/>
        </javac>
        <echo message="==Copy Test Config File=="/>
        <copy todir="${test.build.dir}">
            <fileset dir="${test.dir}">
                <include name="**/*.xml"/>
                <include name="**/*.properties"/>
            </fileset>
        </copy>
    </target>
    <target name="test" description="==运行测试代码==" depends="compiletest">
        <echo message="==Run Test Code=="/>
        <junit printsummary="withOutAndErr" errorproperty="test.failed" failureproperty="test.failed">
            <classpath refid="test.classpath"/>
            <classpath location="${test.build.dir}"/>
            <formatter type="xml"/>
            <batchtest todir="${test.report.dir}">
                <fileset dir="${test.build.dir}" excludes="**/*BaseTest.class">
                    <include name="**/*Test.class"/>
                    <exclude name="**/AllTest.class"/>
                </fileset>
            </batchtest>
        </junit>
        <fail message="Tests failed. Check log and/or reports" if="test.failed"/>
    </target>
    <target name="genjunitreport" description="==产生JUnit报告==">
        <echo message="==Generate JUnit Report=="/>
        <junitreport todir="${test.report.dir}">
            <fileset dir="${test.report.dir}">
                <include name="TEST-*.xml"/>
            </fileset>
            <report format="frames" todir="${test.report.dir}/html/"/>
        </junitreport>
    </target>
    <target name="testandreport" depends="test,genjunitreport" description="==运行测试代码并产生报告==">
    </target>
    <target name="instrument" description="==字节码增强==" depends="compile">
        <echo message="==Emma Code Instrument=="/>
        <taskdef resource="emma_ant.properties" classpathref="emma.classpath"/>
        <mkdir dir="${emma.src.build.dir}"/>
        <mkdir dir="${dist.dir}/emma"/>
        <emma enabled="${emma.enabled}">
            <!--<instr inst="${src.build.dir}" destdir="${emma.src.build.dir}" metadatafile="${dist.dir}/emma/metadata.emma"-->
                   <!--merge="true"/>-->
            <instr instrpath="${src.build.dir}" destdir="${emma.src.build.dir}"
                   metadatafile="${dist.dir}/emma/metadata.emma" merge="true">
            </instr>
        </emma>
        <copy todir="${build.dir}/instr" overwrite="false">
            <fileset dir="${src.dir}" includes="**/*.xml"/>
            <fileset dir="${src.dir}" includes="**/*.properties"/>
            <fileset dir="${src.build.dir}">
                <include name="**/*.class"/>
            </fileset>
        </copy>
    </target>
    <!--<target name="emmatestcompile" description="==编译所有的测试代码==" depends="instrument">-->
    <!--<echo message="==Compile Emma Test Code==">-->
    <!--</echo>-->
    <!--<javac debug="true" destdir="${build.dir}/test" deprecation="true" source="1.5" includeantruntime="on">-->
    <!--<src path="${test.dir}"/>-->
    <!--<classpath refid="emma.test.classpath"/>-->
    <!--</javac>-->
    <!--<copy todir="${build.dir}/test">-->
    <!--<fileset dir="${test.dir}">-->
    <!--<include name="**/*.xml"/>-->
    <!--<include name="**/*.properties"/>-->
    <!--</fileset>-->
    <!--</copy>-->
    <!--</target>-->
    <target name="emmatest" depends="compiletest,instrument" description="==编译Emma测试代码==">
        <echo message="==Run EMMA Test Code=="/>
        <junit printsummary="withOutAndErr" errorproperty="test.failed" failureproperty="test.failed" fork="true"
               forkmode="once">
            <jvmarg value="-Demma.coverage.out.file=${dist.dir}/emma/metadata.emma"/>
            <jvmarg value="-Demma.coverage.out.merge=true"/>
            <classpath refid="emma.test.classpath"/>
            <classpath location="${build.dir}/test"/>
            <classpath refid="emma.classpath"/>
            <formatter type="xml"/>
            <batchtest todir="${test.report.dir}">
                <fileset dir="${test.build.dir}" excludes="**/*BaseTest.class">
                    <include name="**/*Test.class"/>
                    <exclude name="**/AllTest.class"/>
                </fileset>
            </batchtest>
        </junit>
        <fail message="Tests Emma failed. Check log and/or reports" if="test.failed"/>
    </target>

    <!-- 生成测试覆盖率报告-->
    <target name="emmareport" depends="emmatest,genjunitreport">
        <echo message="==Generate JUnit Report and Emma Report=="/>
        <taskdef resource="emma_ant.properties" classpathref="emma.classpath"/>
        <emma enabled="${emma.enabled}">
            <report sourcepath="${src.dir}" sort="+block,+name,+method,+class"
                    metrics="method:70,block:80,line:80,class:100">
                <fileset dir="${dist.dir}/emma">
                    <include name="*.emma"/>
                </fileset>
                <xml outfile="${dist.dir}/coverage.xml" depth="package"/>
                <html outfile="${dist.dir}/emma/core-coverage.html" depth="method"
                      columns="name,class,method,block,line" encoding="UTF-8"/>
            </report>
        </emma>
    </target>
    <target name="package" description="==生成java Archive发布包==" depends="compile">
        <echo message="====Crate Jar===="/>
        <jar destfile="${dist.dir}/${app.name}.jar" compress="true" update="true">
            <fileset dir="${src.build.dir}">
            </fileset>
        </jar>
    </target>
    <target name="ci" description="==Continuous Integration=="
            depends="checkstyle,javancss,pmd,findbugs-xml,emmareport">
    </target>
    <target name="deploy" depends="package,testandreport">
    </target>
</project>

 

分享到:
评论

相关推荐

    Hudson持续集成实战

    《Hudson持续集成实战》是一本专注于自动化部署的教程,旨在帮助读者掌握使用Hudson进行持续集成的关键技术和实践策略。Hudson,作为一个开源的持续集成工具,被广泛应用于软件开发过程中,以提升效率,减少错误,并...

    使用Hudson进行持续集成.doc

    **使用Hudson进行持续集成** Hudson是一款开源的持续集成工具,它可以帮助开发团队自动执行构建、测试和部署等任务,以确保软件项目的质量和稳定性。本文将详细介绍如何使用Hudson进行持续集成,主要涵盖以下几个...

    使用Hudson持续集成

    使用Hudson持续集成使用Hudson持续集成

    使用Hudson持续集成 ppt

    ### 使用Hudson持续集成知识点详解 #### 一、持续集成概念与价值 - **定义**:持续集成(Continuous Integration, CI)是一种软件开发实践,开发者经常将代码提交到共享存储库,每次提交后都会自动构建并进行自动...

    使用Hudson进行持续集成资料总结

    通过阅读"使用Hudson进行持续集成.chm"这个文件,你可以更详细地了解Hudson的使用方法、常见问题及最佳实践。这份资料可能涵盖了安装教程、插件介绍、故障排查指南等内容,对于初学者和有经验的用户来说都是宝贵的...

    使用Hudson持续集成.pptx

    通过持续集成控制代码质量 Maven+Hudson+Sonar 持续集成的基本原则很简单:尽早集成,经常集成。 持续自动构建 :使用CI,您只要按一下按钮,它会依照预先制定的时间表,或者响应某一特定事件,就开始进行一次构建...

    hudson持续集成包

    通过使用Hudson,开发团队能够更有效地进行持续集成,提升软件质量,减少错误,加速交付速度。对于这个压缩包文件“hudson”,可能是Hudson的安装包或特定版本的归档,用于在本地或服务器上搭建Hudson环境。为了...

    Hudson持续集成实战.zip

    【Hudson持续集成实战】 Hudson,作为一个开源的持续集成工具,被广泛应用于软件开发团队中,以自动化构建、测试和部署过程,确保代码的质量和项目的稳定性。它提供了丰富的插件支持,使得集成多种工具和服务变得...

    Hudson持续集成

    Hudson 是一个可扩展的持续集成引擎。 主要用于: 1.持续、自动地构建/测试软件项目,如CruiseControl与DamageControl。 2.监控一些定时执行的任务。 Hudson拥有的特性包括: •易于安装-只要把hudson.war部署到...

    持续集成工具Hudson入门介绍(结合Ant)

    本篇将详细介绍如何使用Hudson与Ant进行持续集成。 【描述】:虽然没有具体的描述,但可以推测文章可能涵盖了设置Hudson环境、配置Ant构建脚本以及实现自动化的构建和测试流程等内容。 【标签】:“源码”和“工具...

    基于Hudson的持续集成指南

    【Hudson】是一个开源的持续集成工具,用Java编写,它可以监视编译、测试和部署过程,确保软件项目始终处于可发布状态。Hudson支持多种版本控制系统,如Git、SVN等,并提供了丰富的插件体系,用于扩展其功能,如代码...

    hudson持续集成包 01

    【Hudson持续集成包 01】:这是一个与Hudson持续集成工具相关的压缩包,包含了必要的组件和资源,用于支持软件开发过程中的自动化构建、测试和部署。Hudson是开源的持续集成服务器,旨在帮助开发者频繁地进行构建,...

    Hudson持续集成服务器的安装配置和使用

    根据提供的信息,我们可以详细探讨如何安装配置和使用Hudson持续集成服务器。Hudson是一个开源的持续集成工具,用于自动化软件开发中的构建、测试和部署过程。以下内容将围绕Hudson的安装配置及其与相关工具(如SVN...

Global site tag (gtag.js) - Google Analytics