본문 바로가기

Tools

Ant Build 시에 Chechstyle, Findbugs 실행

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

Ant Build 시에 CheckStyle과 Findbugs 를 넣어보려한다.  CheckStyle과 Findbugs 는 PMD 와 함께 정적분석 툴로 유명하다. 


정적분석을 왜 할까?

-. 정적분석은 프로그램을 분석하는 하나의 방법으로 프로그램을 실행하지 않고 정적분석 툴을 실행하여 코드레벨에서 분석하는 방법이다.


위의 두가지를 적용하기 위해 로컬에 Jenkins 를 설치하였다. Jenkins 설치는 구글링만 해보면 금방 찾을 수 있다.


1. Jenkins 설정


빌드시 Run 은 build.xml에 설정하였으며, FTP전송 등 정보는 [고급] 의 properties 에 작성하였다.


2. build.xml

<project name="build" basedir="." default="clean" >

<property file="build.properties"/>

<property name="lib.dir" value="WebRoot/WEB-INF/lib" />

<property name="build.dir" value="classes" />

<property name="src.dir" value="src" />

<property name="deploy.dir" value="deploy" />

<path id="classpath">

<fileset dir="${lib.dir}" includes="**/*.jar" />

</path>

    <!-- Change the paths to your individual installation directories -->

    <property name="checkstyle.home.dir" location="D:/work/usr/analysis/checkstyle" />

    <property name="findbugs.home.dir" value="D:/work/usr/analysis/findbugs" />

<property name="report.dir" value="D:/work/usr/analysis/export" />

<property name="report.checkstyle.dir" location="${report.dir}/checkstyle" />

    <property name="report.findbugs.dir" location="${report.dir}/findbugs" />


<property name="report.temp.dir" location="${report.dir}/temp" />


<taskdef resource="net/sf/antcontrib/antlib.xml">  

<classpath>

<pathelement location="D:/work/usr/analysis/ant-contrib-0.6.jar"/>  

</classpath>  

</taskdef>


<!-- -->

    <target name="clean.temp" description="Delete all temporary files and folders.">

    <delete dir="${report.findbugs.dir}" />

<delete dir="${report.checkstyle.dir}" />

<delete dir="${report.temp.dir}" />

    </target>

    <!-- -->

    <target name="report.checkstyle" description="Generate a report of code convention violations." depends="clean.temp">

    <mkdir dir="${report.dir}"/>

<mkdir dir="${report.temp.dir}/source"/>

<mkdir dir="${report.temp.dir}/classes"/>

<script language="javascript">

            <![CDATA[

filenames = build.getProperty("deploy_file_list");

build.setProperty("filenames", filenames.replace("aaaaaaa/", "")

.replace("bbbbbb/", "")

.replace("ccccccc/", "")

.replace("ddddd/", "")

.replace("eeeee/", "")

.replace("ffffff/", "")

.replace("ggggggggg/", ""));

            ]]>

        </script>

<if>

<equals arg1="${filenames}" arg2=""/>

<then>

<echo message="================================ 전체배포 막음 ==========================">전체배포 막음</echo>

</then>

<else>

<echo>부분체크</echo>

<!-- 로컬 -->

<for list="${filenames}" param="filename" delimiter=",">

<sequential>

<echo>copy file : @{filename}</echo>

<if>

<equals arg1="${is_include_classfile}" arg2="true"/>

<then>

<copy todir="${report.temp.dir}/source" includeEmptyDirs="false">

<fileset dir="${src.dir}" includes="@{filename}" />

</copy>

</then>

<else>

<echo message="class파일 배포 제외로 classfile copy Skip..." />

</else>

</if>

</sequential>

</for>

<javac srcdir="${report.temp.dir}/source" destdir="${report.temp.dir}/classes" fork="yes" executable="D:/Utils/jdk8/bin/javac" compiler="javac1.8" classpathref="classpath" debug="on" includeantruntime="false" encoding="euc-kr" />

<!-- 서버

<ac:for list="${filenames}" param="filename" delimiter="," xmlns:ac="antlib:net.sf.antcontrib">

<ac:sequential>

<echo>copy file : @{filename}</echo>

<if>

<equals arg1="${is_include_classfile}" arg2="true"/>

<then>

<copy todir="${check.export.dir}/checkstyle/source" includeEmptyDirs="false">

<fileset dir="${src.dir}" includes="@{filename}" />

</copy>

</then>

<else>

<echo message="class파일 배포 제외로 classfile copy Skip..." />

</else>

</if>

</ac:sequential>

</ac:for>

-->

</else>

</if>

   

    <taskdef resource="com/puppycrawl/tools/checkstyle/ant/checkstyle-ant-task.properties">

<classpath>

<pathelement location="${checkstyle.home.dir}/checkstyle-7.1.2-all.jar"/>

</classpath>

</taskdef>


        <!-- run verification of installation-->

        <available file="${checkstyle.home.dir}/checkstyle-7.1.2-all.jar" property="checkstyle.available" />

        <fail unless="checkstyle.available" message="Error: CHECKSTYLE_HOME not set or checkstyle-7.1.2-all.jar not found." />

   

        <mkdir dir="${report.checkstyle.dir}" />


        <!-- run analysis-->

        <checkstyle config="${checkstyle.home.dir}/checkStyleByGoogle.v.1.1.xml"        

                    failureProperty="checkstyle.failure"

                    failOnViolation="true" maxwarnings="0" maxerrors="0">

            <formatter type="xml" tofile="${report.checkstyle.dir}/checkstyle_report.xml" />

            <fileset dir="${report.temp.dir}/source" includes="**/*.java" />

        </checkstyle>       

    </target>

    <!-- -->

    <target name="findbugs" description="Run code analysis over code to check for problems." depends="report.checkstyle">

        <!-- Fail this target if FindBugs is not installed. -->

        <available file="${findbugs.home.dir}/lib/findbugs.jar" property="findbugs.available" />

        <fail unless="findbugs.available" message="Error: FINDBUGS_HOME not set or findbugs.jar not found." />

   

        <taskdef name="findbugs"

                 classname="edu.umd.cs.findbugs.anttask.FindBugsTask"

                 classpath="${findbugs.home.dir}/lib/findbugs-ant.jar" />

   

        <!-- Run FindBugs. -->

        <mkdir dir="${report.findbugs.dir}" />

   

        <findbugs home="${findbugs.home.dir}"

                  output="xml:withMessages"

         timeout="90000000"

 adjustExperimental="true"

 projectName="GHS Front"

 debug="false"

                  outputFile="${report.findbugs.dir}/findbugs.xml"

         workHard="true"

 reportLevel="experimental"

         errorproperty="true"

         warningsproperty="findbugsFailure"

         failonerror="true"

         quietErrors="true"

        >

            <class location="${report.temp.dir}/classes" />

        </findbugs>

   

    <fail if="findbugsFailure" />

    </target>


    <target name="report.findbugs" description="Generate a report on error analysis." depends="findbugs">

        <xslt in="${report.findbugs.dir}/findbugs.xml"

              style="${findbugs.home.dir}/src/xsl/fancy.xsl"

              out="${report.findbugs.dir}/findbugs-default.html"

        />

    </target>

   

<target name="clean" if="${is_rebuild}" depends="report.findbugs">

<echo message="|================================================| " />

<echo message="|                                                             | " />

<echo message="|                      clean start......                    | " />

<echo message="|                                                             | " />

<echo message="|================================================| " />

<delete dir="${deploy.dir}" />

<mkdir dir="${deploy.dir}" />


<echo message="|================================================| " />

<echo message="|                                                             | " />

<echo message="|                      clean end......                    | " />

<echo message="|                                                             | " />

<echo message="|================================================| " />

</target>

</project>


녹색으로 칠한 부분이 checkstyle과 findbugs 설정부분이다. 


checkstyle 이나 findbugs 에서 warning 이라도 발견이 되면 build fail 을 내기 위하여 


checkstyle 의 failureProperty="checkstyle.failure" 부분과 findbugs 의 warningsproperty="findbugsFailure" 을 작성하여 빌드시 오류가 발생되게 하였다. 


Ant build를 사용하지 않았던터라....... 엄청 헤맸다..;;;;;;;; 적용이야 금방됐지만, 최소 warning 발생시 오류를 내는것이.... ㅠㅠ 


역시 안해보면 모른다. 공부가 더 필요하다...
























고양시 맛집 어선당삼송점 고양시 맛집 어선당삼송점 고양시 맛집 어선당삼송점 고양시 맛집 어선당삼송점 고양시 맛집 어선당삼송점 고양시 맛집 어선당삼송점 고양시 맛집 어선당삼송점 고양시 맛집 어선당삼송점 고양시 맛집 어선당삼송점 고양시 맛집 어선당삼송점 고양시 맛집 어선당삼송점 고양시 맛집 어선당삼송점 


삼송맛집 어선당삼송점 삼송맛집 어선당삼송점 삼송맛집 어선당삼송점 삼송맛집 어선당삼송점 삼송맛집 어선당삼송점 삼송맛집 어선당삼송점 삼송맛집 어선당삼송점 삼송맛집 어선당삼송점 삼송맛집 어선당삼송점 삼송맛집 어선당삼송점 삼송맛집 어선당삼송점 삼송맛집 어선당삼송점 삼송맛집 어선당삼송점 삼송맛집 어선당삼송점