一步一步搞定hudson+ant+JUNIT+EMMA 持续集成(CI)服务器环境搭建(2)

  • 作者
  • 戈寒
  • 2022-11-20 07:32:04
  • 阅读  18

什么是持续集成

    在软件工程中,持续集成(CI)是指将所有开发者的工作副本每天多次合并到主干的做法。Grady Booch 在1991年的 Booch method 中首次命名并提出了 CI 的概念,尽管在当时他并不主张每天多次集成。而 XP(Extreme programming,极限编程)采用了 CI 的概念,并提倡每天不止一次集成。


持续集成服务器

    持续集成服务器就是能够采用自动化的手段,来解放人的双手,实现项目持续集成的工具。与之配套的软件有TeamCity、Hudson、Go,等。


    本主将会就利用hudson+ant+JUNIT+EMMA 搭建持续集成环境,做一步一步的详细解剖.

    本文是该系列文章的第二部分,主要以代码为主。本代码的核心作用是,利用ant脚本去控制项目的编译,以EMMA和JUNIT的调用和报告生成,以及最后的项目打包发布到tomcat目录。


<?xml version="1.0" encoding="UTF-8"?>
<project name="TestActivityPlatform" default="all" basedir=".">
    <!--设置Java类被注入字节码后存放的路径-->
    <property name="bin.instrument.dir" location="${basedir}/instrbin" />
    <!--设置覆盖率元数据和报告的路径-->
    <property name="coverage.dir" location="${basedir}/coverage" />
    <!--设置junit报告的路径 -->
    <property name="junitReport.html.dir" location="${basedir}/junitReport/html" />
    <property name="junitReport.xml.dir" location="${basedir}/junitReport/xml" />
    <!-- 日志 目录-->
    <property name="logs.dir" location="${basedir}/logs" />
    <!--设置主代码编译文件存放路径-->
    <property name="realesBin.dir" location="${basedir}/realesBin" />
    <!--设置主代码编译文件存放路径-->
    <property name="war.dir" location="${basedir}/war" />
    <!--设置测试代码编译文件路径-->
    <property name="testBin.dir" location="${basedir}/testBin" />
    <!--设置主题代码源路径-->
    <property name="src.main.dir" location="${basedir}/src" />
    <!--设置测试代码源路径-->
    <property name="src.test.dir" location="${basedir}/src" />
    <!--设置引用包的位置-->
    <property  name ="libs" value ="${basedir}/webapp/WEB-INF/lib"/>
    <!--指示需要注入字节码的Java类的路径-->
    <path id="classpath.main">
        <pathelement location="${realesBin.dir}" />
    </path>
    <!--指示 emma.jar 和emma_ant.jar 的路径-->
    <path id="emma.lib">
        <pathelement location="${libs}/emma.jar" />
        <pathelement location="${libs}/emma_ant.jar" />
    </path>
    <path id="libPath">
        <fileset dir="${libs}">
            <include name="*.jar"/>
        </fileset>
    </path>
    <!--允许emma-->
    <property name="emma.enabled" value="true" />
    <!--为ANT添加EMMA任务-->
    <taskdef resource="emma_ant.properties" classpathref="emma.lib" />
    <target name="init">
        <delete dir="${bin.instrument.dir}"/>
        <delete dir="${coverage.dir}"/>
        <delete dir="${junitReport.html.dir}"/>
        <delete dir="${junitReport.xml.dir}"/>
        <delete dir="${realesBin.dir}"/>
        <delete dir="${testBin.dir}"/>
        <delete dir="${war.dir}"/>
        <delete dir="${logs.dir}"/>
        <mkdir dir="${logs.dir}" />
    </target>
    <target name="compile-src.main">
        <mkdir dir="${realesBin.dir}" />
        <javac srcdir="${src.main.dir}" destdir="${realesBin.dir}" includeantruntime="on" compiler="javac1.6" source="1.6" encoding="UTF-8" debug="on">
            <classpath location="${realesBin.dir}"/>
            <classpath refid="libPath"/>
        </javac>
        <copydir dest="${realesBin.dir}/config" src="${src.main.dir}/config">
        </copydir>
        <copy todir="${realesBin.dir}" overwrite="true">
            <fileset dir="${src.main.dir}">
                <include name="*.*"/>
            </fileset>
        </copy>
    </target>
    <!--对编译在路径bin.main.dir中的Java类注入字节码, 并且把注入字节码的新Java类存放到路径bin.instrument.dir-->
    <!--覆盖率的元数据存放在路径coverage.dir中-->
    <target name="instrument">
        <mkdir dir="${bin.instrument.dir}" />
        <mkdir dir="${coverage.dir}" />
        <emma enabled="${emma.enabled}">
            <instr instrpathref="classpath.main" destdir="${bin.instrument.dir}" metadatafile="${coverage.dir}/metadata.emma" merge="true">
            </instr>
        </emma>
        <copy todir="${bin.instrument.dir}">
            <fileset dir="${realesBin.dir}">
                <exclude name="**/*.java" />
            </fileset>
        </copy>
        <copydir dest="${bin.instrument.dir}/config" src="${src.main.dir}/config">
        </copydir>
        <copy todir="${bin.instrument.dir}" overwrite="true">
            <fileset dir="${src.main.dir}">
                <include name="*.*"/>
            </fileset>
        </copy>
    </target>
    <!--执行测试用例同时生成junit测试报告和emma代码覆盖率报告-->
    <target name="test">
        <mkdir dir="${junitReport.html.dir}" />
        <mkdir dir="${junitReport.xml.dir}" />
        <junit fork="true" forkmode="once" printsummary="yes" errorproperty="test.error" showoutput="on">
            <!--指明代码覆盖率的元数据的存放位置-->
            <jvmarg value="-Demma.coverage.out.file=${coverage.dir}/metadata.emma" />
            <jvmarg value="-Demma.coverage.out.merge=true" />
            <classpath location="${bin.instrument.dir}"/>
            <classpath refid="libPath"/>
            <classpath refid="emma.lib" />
            <formatter type="xml" />
            <!--执行所ProjectAllTest.class的junit测试用例-->
            <batchtest todir="${junitReport.xml.dir}" haltonfailure="no">
                <fileset dir="${bin.instrument.dir}">
                    <include name="**/ProjectAllTest.class" />
                </fileset>
            </batchtest>
        </junit>
    </target>
    <target name="gen-report-junit">
        <!--生成junit测试报告-->
        <junitreport todir="${junitReport.html.dir}">
            <fileset dir="${junitReport.xml.dir}">
                <include name="*.xml"/>
            </fileset>
            <report format="frames" todir="${junitReport.html.dir}" />
        </junitreport>
    </target>
    <!--生成代码覆盖率报告-->
    <target name="gen-report-coverage">
        <!--如果属性emma.enabled的值是true,就生成代码覆盖率报告 -->
        <emma enabled="${emma.enabled}">
            <report sourcepath="${src.main.dir}"
                sort="+block,+name,+method,+class"
                metrics="method:70,block:80,line:80,class:100">
                <fileset dir="${coverage.dir}">
                    <include name="*.emma" />
                </fileset>
                <html outfile="${coverage.dir}/coverage.html" 
                    depth="method" columns="name,class,method,block,line" encoding="utf-8"/>
                <xml outfile="${coverage.dir}/coverage.xml"/>
            </report>
        </emma>
    </target>
    <target name ="war" depends="compile-src.main">
        <mkdir dir="${war.dir}"/>
        <war destfile ="${war.dir}/TMS.war"  webxml ="${basedir}/webapp/WEB-INF/web.xml">
            <lib dir ="${libs}">
                <exclude name="jsp-api.jar"/>
                <exclude name="servlet-api.jar"/>
            </lib>
            <classes dir ="${realesBin.dir}">
                <exclude name="cn/tv189/activityplatform/test/"/>
            </classes>
            <fileset dir ="${basedir}/webapp">
                <include name="pages/*.*"/>
                <include name="css/*.*"/>
            </fileset>
        </war>
    </target>
    <target name="all" depends="init,compile-src.main,instrument,test,gen-report-coverage,gen-report-junit,war">
    </target>
</project>


一步一步搞定hudson+ant+JUNIT+EMMA 持续集成(CI)服务器环境搭建(2)

  • 2022-11-20 07:32:04
  • 阅读  18

什么是持续集成

    在软件工程中,持续集成(CI)是指将所有开发者的工作副本每天多次合并到主干的做法。Grady Booch 在1991年的 Booch method 中首次命名并提出了 CI 的概念,尽管在当时他并不主张每天多次集成。而 XP(Extreme programming,极限编程)采用了 CI 的概念,并提倡每天不止一次集成。


持续集成服务器

    持续集成服务器就是能够采用自动化的手段,来解放人的双手,实现项目持续集成的工具。与之配套的软件有TeamCity、Hudson、Go,等。


    本主将会就利用hudson+ant+JUNIT+EMMA 搭建持续集成环境,做一步一步的详细解剖.

    本文是该系列文章的第二部分,主要以代码为主。本代码的核心作用是,利用ant脚本去控制项目的编译,以EMMA和JUNIT的调用和报告生成,以及最后的项目打包发布到tomcat目录。


<?xml version="1.0" encoding="UTF-8"?>
<project name="TestActivityPlatform" default="all" basedir=".">
    <!--设置Java类被注入字节码后存放的路径-->
    <property name="bin.instrument.dir" location="${basedir}/instrbin" />
    <!--设置覆盖率元数据和报告的路径-->
    <property name="coverage.dir" location="${basedir}/coverage" />
    <!--设置junit报告的路径 -->
    <property name="junitReport.html.dir" location="${basedir}/junitReport/html" />
    <property name="junitReport.xml.dir" location="${basedir}/junitReport/xml" />
    <!-- 日志 目录-->
    <property name="logs.dir" location="${basedir}/logs" />
    <!--设置主代码编译文件存放路径-->
    <property name="realesBin.dir" location="${basedir}/realesBin" />
    <!--设置主代码编译文件存放路径-->
    <property name="war.dir" location="${basedir}/war" />
    <!--设置测试代码编译文件路径-->
    <property name="testBin.dir" location="${basedir}/testBin" />
    <!--设置主题代码源路径-->
    <property name="src.main.dir" location="${basedir}/src" />
    <!--设置测试代码源路径-->
    <property name="src.test.dir" location="${basedir}/src" />
    <!--设置引用包的位置-->
    <property  name ="libs" value ="${basedir}/webapp/WEB-INF/lib"/>
    <!--指示需要注入字节码的Java类的路径-->
    <path id="classpath.main">
        <pathelement location="${realesBin.dir}" />
    </path>
    <!--指示 emma.jar 和emma_ant.jar 的路径-->
    <path id="emma.lib">
        <pathelement location="${libs}/emma.jar" />
        <pathelement location="${libs}/emma_ant.jar" />
    </path>
    <path id="libPath">
        <fileset dir="${libs}">
            <include name="*.jar"/>
        </fileset>
    </path>
    <!--允许emma-->
    <property name="emma.enabled" value="true" />
    <!--为ANT添加EMMA任务-->
    <taskdef resource="emma_ant.properties" classpathref="emma.lib" />
    <target name="init">
        <delete dir="${bin.instrument.dir}"/>
        <delete dir="${coverage.dir}"/>
        <delete dir="${junitReport.html.dir}"/>
        <delete dir="${junitReport.xml.dir}"/>
        <delete dir="${realesBin.dir}"/>
        <delete dir="${testBin.dir}"/>
        <delete dir="${war.dir}"/>
        <delete dir="${logs.dir}"/>
        <mkdir dir="${logs.dir}" />
    </target>
    <target name="compile-src.main">
        <mkdir dir="${realesBin.dir}" />
        <javac srcdir="${src.main.dir}" destdir="${realesBin.dir}" includeantruntime="on" compiler="javac1.6" source="1.6" encoding="UTF-8" debug="on">
            <classpath location="${realesBin.dir}"/>
            <classpath refid="libPath"/>
        </javac>
        <copydir dest="${realesBin.dir}/config" src="${src.main.dir}/config">
        </copydir>
        <copy todir="${realesBin.dir}" overwrite="true">
            <fileset dir="${src.main.dir}">
                <include name="*.*"/>
            </fileset>
        </copy>
    </target>
    <!--对编译在路径bin.main.dir中的Java类注入字节码, 并且把注入字节码的新Java类存放到路径bin.instrument.dir-->
    <!--覆盖率的元数据存放在路径coverage.dir中-->
    <target name="instrument">
        <mkdir dir="${bin.instrument.dir}" />
        <mkdir dir="${coverage.dir}" />
        <emma enabled="${emma.enabled}">
            <instr instrpathref="classpath.main" destdir="${bin.instrument.dir}" metadatafile="${coverage.dir}/metadata.emma" merge="true">
            </instr>
        </emma>
        <copy todir="${bin.instrument.dir}">
            <fileset dir="${realesBin.dir}">
                <exclude name="**/*.java" />
            </fileset>
        </copy>
        <copydir dest="${bin.instrument.dir}/config" src="${src.main.dir}/config">
        </copydir>
        <copy todir="${bin.instrument.dir}" overwrite="true">
            <fileset dir="${src.main.dir}">
                <include name="*.*"/>
            </fileset>
        </copy>
    </target>
    <!--执行测试用例同时生成junit测试报告和emma代码覆盖率报告-->
    <target name="test">
        <mkdir dir="${junitReport.html.dir}" />
        <mkdir dir="${junitReport.xml.dir}" />
        <junit fork="true" forkmode="once" printsummary="yes" errorproperty="test.error" showoutput="on">
            <!--指明代码覆盖率的元数据的存放位置-->
            <jvmarg value="-Demma.coverage.out.file=${coverage.dir}/metadata.emma" />
            <jvmarg value="-Demma.coverage.out.merge=true" />
            <classpath location="${bin.instrument.dir}"/>
            <classpath refid="libPath"/>
            <classpath refid="emma.lib" />
            <formatter type="xml" />
            <!--执行所ProjectAllTest.class的junit测试用例-->
            <batchtest todir="${junitReport.xml.dir}" haltonfailure="no">
                <fileset dir="${bin.instrument.dir}">
                    <include name="**/ProjectAllTest.class" />
                </fileset>
            </batchtest>
        </junit>
    </target>
    <target name="gen-report-junit">
        <!--生成junit测试报告-->
        <junitreport todir="${junitReport.html.dir}">
            <fileset dir="${junitReport.xml.dir}">
                <include name="*.xml"/>
            </fileset>
            <report format="frames" todir="${junitReport.html.dir}" />
        </junitreport>
    </target>
    <!--生成代码覆盖率报告-->
    <target name="gen-report-coverage">
        <!--如果属性emma.enabled的值是true,就生成代码覆盖率报告 -->
        <emma enabled="${emma.enabled}">
            <report sourcepath="${src.main.dir}"
                sort="+block,+name,+method,+class"
                metrics="method:70,block:80,line:80,class:100">
                <fileset dir="${coverage.dir}">
                    <include name="*.emma" />
                </fileset>
                <html outfile="${coverage.dir}/coverage.html" 
                    depth="method" columns="name,class,method,block,line" encoding="utf-8"/>
                <xml outfile="${coverage.dir}/coverage.xml"/>
            </report>
        </emma>
    </target>
    <target name ="war" depends="compile-src.main">
        <mkdir dir="${war.dir}"/>
        <war destfile ="${war.dir}/TMS.war"  webxml ="${basedir}/webapp/WEB-INF/web.xml">
            <lib dir ="${libs}">
                <exclude name="jsp-api.jar"/>
                <exclude name="servlet-api.jar"/>
            </lib>
            <classes dir ="${realesBin.dir}">
                <exclude name="cn/tv189/activityplatform/test/"/>
            </classes>
            <fileset dir ="${basedir}/webapp">
                <include name="pages/*.*"/>
                <include name="css/*.*"/>
            </fileset>
        </war>
    </target>
    <target name="all" depends="init,compile-src.main,instrument,test,gen-report-coverage,gen-report-junit,war">
    </target>
</project>


诗与远方

  • 请你用慈悲心和温和的态度
    把你的不满与委屈说出来
    别人就容易接受得多地多

诗与远方

  • 诚实的面对你内心的矛盾和缺点
    不要欺骗你自己

诗与远方

  • 成功要爬上梯子才能到达
    双手插在口袋里的人是爬不上去的

诗与远方

  • 良心是每一个人最公正的审判官
    你骗得了别人
    却永远骗不了你自己的良心

诗与远方

  • 不要因为小小的争执
    疏远了你的至亲好友
    也不要因为小小的怨恨
    忘记了别人的恩情

诗与远方

  • 凡是能多站在别人的角度着想
    就能做到,理解,体谅

诗与远方

  • 当幻想和现实面对时
    总是很痛苦的
    要么你被痛苦击倒
    要么你把痛苦踩在脚下

诗与远方

  • 梯子的梯阶从来不是用来搁脚的
    它只是让人们的脚踏上去
    以便让另一只脚能够再往上攀登

诗与远方

  • 毁灭一个人只要一句话
    培植一个人却要千句话
    所以请你多多口下留情

诗与远方

  • 财以不炫为富,官以不显为贵
    名以不彰为誉,施以不报为惠

诗与远方

  • 世界原本就不是属于你
    因此你用不着抛弃
    要抛弃的是一切的执着
    万物皆为我所用,但非我所属

诗与远方

  • 只要自觉心安,东西南北都好
    如有一人未度,切莫自觉逃了

诗与远方

  • 崇高的理想就像生长在高山上的鲜花
    如果要摘下它
    勤奋才是攀登的途径

诗与远方

  • 人之谤我也
    与其能辩,不如能容
    人之侮我也
    与其能防,不如能化

诗与远方

  • 不要在你的智慧中夹杂着傲慢
    不要使你的谦虚缺乏智慧

诗与远方

  • 看透大事者超脱,看不透者执着
    看透小事者豁达,看不透者计较

诗与远方

  • 坚韧是成功的一大要素
    只要在成功之门上敲得够久够大声
    终会把成功唤醒

诗与远方

  • 根本不必回头去看咒骂你的人是谁
    如果有一条疯狗咬了你一口
    难道你也要趴下去反咬它一口吗

诗与远方

  • 交有道之人,莫结无义之友
    饮清净之茶,莫贪花色之酒
    开方便之门,闲是非之口

诗与远方

  • 谦虚但不自卑
    自信但不自大
    自由但不放纵
    人一生很难做到这三点

诗与远方

  • 活着一天,就是有福气,就该珍惜
    当我哭泣没有鞋子穿的时候
    我发现有人没有脚……

诗与远方

  • 不要让追求之舟停泊在幻想的港湾
    而应扬起奋斗的风帆
    驶向现实生活的大海

诗与远方

  • 不要刻意去猜测他人的想法
    如果你没有智慧与经验的正确判断
    通常都会有偏差的

诗与远方

  • 心中装满自己的看法与想法的人
    是听不见别人的声音的

诗与远方

  • 要了解一个人
    只需要看他的出发点与目的地是否相同
    就可以知道他是否真心

诗与远方

  • 一个人如果不能从内心去原谅别人
    那他就放不下怨恨,得不到快乐的生活

诗与远方

  • 你不要一直不满人家
    你应该一直检讨自己才是
    不满人家,是苦了你自己

诗与远方

  • 你硬要把单纯的事情看得很复杂
    那你会很痛苦

诗与远方

  • 当你劝告别人时
    若不顾及别人的自尊心
    那么再好的言语都是没有用的

诗与远方

  • 一份耕耘,一份收获,付出就会有回报
    不曾遭遇过失败,因为一直往成功方向发展
    所碰到的都是暂时的挫折

诗与远方

  • 同样的瓶子
    你为什么要装毒药呢
    同样的心理
    你为什么要充满着烦恼呢

诗与远方

  • 把气氛的心境转化为柔和
    把柔和的心境转化为爱
    如此,这个世间将更加完美

诗与远方

  • 说话不要有攻击性
    不要有杀伤力
    不夸已能,勿扬人恶,自然能化敌为友

诗与远方

  • 如果你不给自己烦恼
    别人也永远不可能给你烦恼
    因为你不会放在自己的心上

诗与远方

  • 懦弱的人只会裹足不前
    莽撞的人只能引火烧身
    只有真正勇敢的人才能所向披靡

诗与远方

  • 多一分心力去注意别人
    就少一分心力反省自己

诗与远方

  • 有时候我们要冷静问问自己
    我们再追求什么
    我们活着为了什么

诗与远方

  • 彩云飘在空中,自然得意洋洋
    但最多智能换取几声赞美
    唯有化作雨并倾注于土壤之中
    才能给世界创造芳菲

诗与远方

  • 当你快乐时你要想,这快乐不是永恒的
    当你痛苦时你要想,这痛苦也不是永恒的

诗与远方

  • 快乐是一份自然
    做自己想做的事
    做好自己选择的事
    自然地做人,自然地笑,自然地生活

诗与远方

  • 狂妄的人有救
    自卑的人没有救
    认识自己,相信自己,改变自己
    才能改变别人对你的态度

诗与远方

  • 只要永不放弃,持之以恒
    每次挫折,都是你进步的阶梯
    如果你逃避退缩,那就等于自毁前途

诗与远方

  • 用伤害别人的手段来掩饰自己缺点的人是可耻的

诗与远方

  • 玩像玩的,干像干的
    人生苦短,能享受时就享受,能轻松时就轻松
    不要跟自己过不去,要保持一种良好的心境

诗与远方

  • 责人要含蓄,忌太尽
    劝人要委婉,忌太直
    警人要疑似,忌太真

诗与远方

  • 你一定要宽恕众生
    不论他有多坏,甚至伤害过你
    你只有放下了,才能得到真正的快乐

诗与远方

  • 要是面前有一堵墙
    不要轻易退缩逃避
    要想办法绕过去,超越过去
    即使有困难也不要轻易放弃

诗与远方

  • 势不可使尽,聪明不可用尽
    福不可享尽,便宜不可占尽

诗与远方

  • 当你对自己诚实的时候
    世界上没有人能够欺骗得了你

诗与远方

  • 心是最大的骗子
    别人能骗你一时
    而它却会骗你一辈子

诗与远方

  • 大多数的人一辈子只做了三件事
    自欺,欺人,被人欺

诗与远方

  • 一个人如果没有感受过苦难
    就不会体会到他人的苦难
    你要学救苦救难的精神,就得先受苦受难

诗与远方

  • 每一个人都拥有生命
    但并非每个人都懂得生命,珍惜生命
    不了解生命的人,体会不到生命的价值

诗与远方

  • 生活可以是甜的,也可以是苦的
    但不能是没味的
    你可以胜利,也可以失败
    但你不能屈服

随意打赏