Java學習

          java,spring,structs,hibernate,jsf,ireport,jfreechart,jasperreport,tomcat,jboss -----本博客已經搬家了,新的地址是 http://www.javaly.cn 如果有對文章有任何疑問或者有任何不懂的地方,歡迎到www.javaly.cn (Java樂園)指出,我會盡力幫助解決。一起進步

           

          cruisecontrol、ant、svn持續集成

          自己兩個多星期以來對持續集成的概念和應用有了一些了解。下面主要對自己配置持續集成的環境進行總結。(看上去簡單,但是對我開始對持續集成都沒什么了解的人來說確實費了不少周折)

          一  本次持續集成環境的搭建所使用的工具有

           cruisecontrol、ant、svn、junit、Slik-Subversion-1.5.6-win32、svnant-1.1.0-RC2.zip

           cruisecontrol:是一種持續集成過程的框架,包括了郵件通知,ant 和各種源碼控  制工具的插 件。并提供了web接口,用于查看當前和以前的創建的結果.

          ant:構建工具。

          svn:版本控制工具。

          junit:單元測試工具。

          slik-subversion:是為了調用svn的客戶端命令安裝的。

          svnant:主要是用到它里面的lib中的jar包,它具體使用還不是很清楚

          另外本次的輔助環境還有jdk,相信大家都再也熟悉不過了。

          二 環境的搭建步驟:

          1. jdk的安裝:根據jdk安裝包的提示安裝jdk。設置系統的環境變量:

          a) JAVA_HOME指明JDK安裝路徑,就是剛才安裝時所選擇的路徑D:"java"jdk1.5.0_08,此路徑下包括libbinjre等文件夾(此變量最好設置,因為以后運行tomcat都需要依賴此變量);

          b) Path使得系統可以在任何路徑下識別java命令,設為%JAVA_HOME%"bin;%JAVA_HOME%"jre"bin

           c)CLASSPATH為java加載類(class or lib)路徑,只有類在  classpath中,java命令才能識別,設為:.;JAVA_HOME"lib"dt.jar;JAVA_HOME%   "lib"tools.jar (要加.表示當前路徑);%JAVA_HOME%就是引用前面指定的JAVA_HOME;不過本人還是比較相信絕對路徑的。 

          2 ant的安裝:ant是集成構建工具,想必大家都不太陌生了。只需要到ant.apache.org的網站下載ant的適當版本解壓縮后,配置系統的環境變量:ANT_HOME:d:"apache-ant-1.7.0, path:d:"apache-ant-1.7.0"bin 后,ant就可以在任意目錄下運行了,如cmd下運行ant,顯示:buildfile:build.xml does not exsit。。。。。

          3 安裝svn,因為cruisecontrol要用到svn(不知道這兩個有什么先后順序沒,因為cc要用svn就先裝cc嘍)。svn的安裝TortoiseSVN-1.5.3.13783-win32-svn-1.5.2.msi安裝提示裝就可以了。

          4 安裝tomcat ,設置系統環境變量CATALINA_HOME=c:"tomcat,CLASSPATH=C:"tomcat"common"lib(加載必要的包)。

          5 cuisecontrol的安裝,因為本文使用的操作系統為XP,就使用CruiseControl-2.8.2.exe安裝就可以了(.exe文件還是很受大家喜歡的)。配置系統的環境變量:CC_HOME=d:"cruisecontrol

          6 安裝slik-subversion,它會自動寫入到path=D:"SlikSvn"bin" 如果沒有寫入的話,要麻煩手動加入到系統的環境變量path中,本人曾經遇到過,cmd窗口已經打開但是配置文件執行過程中svn的命令總不能識別發現此 處的路徑沒有加入到path中。

          7下載svnant-1.1.0-RC2.zip,把lib包中的jar考到ant的jar中。

          三 以上的準備工作已經基本搞定,下面就介紹一下配置文件。此次環境的搭建配置文件是很關鍵的,因為他們各自有自己的標簽,所以還要想達到什么功能慢慢查找,(如果有時間系統學習一下就好了)。

          1 ant的關鍵文件為build.xml(當然也可以起別的名稱,自己還要改它的啟動文件,就用這個名稱吧)下面是一個實例:

          <?xml version="1.0" encoding="UTF-8" standalone="no"?>

          定義basedir當前的根目錄,default默認執行的標簽,name工程名
          <project basedir="." default="all" name="framework">
           <property environment="env" />

          定義tomcat的安裝目錄
           <property name="TOMCAT_DIR" location="D:/Tomcat 5.5" />

          定義debug的級別
           <property name="debuglevel" alue="source,lines,vars" />

          為了引用tomcat固有包方便所以增加次屬性
           <property name="coolink.dist.path" location="D:/Tomcat 5.5/webapps/txsd/WEB-INF" />

          指定要編譯的工程目錄
           <property name="CLASS_DIR" location="D:/CruiseControl/projects/framework" />
           <property name="target" value="1.5" />
           <property name="source" value="1.5" />

          編譯時候所使用的類路徑,id為引用的名稱
           <path id="Apache Tomcat v5.5 [Apache Tomcat v5.5].libraryclasspath">
            <pathelement location="${TOMCAT_DIR}/common/lib/commons-el.jar" />
            ....
            <pathelement location="${TOMCAT_DIR}/common/lib/servlet-api.jar" />
           </path>
           <path id="Web App Libraries.libraryclasspath">
            <pathelement location="${coolink.dist.path}/lib/activation.jar" />
            .............
            <pathelement location="${coolink.dist.path}/lib/xmlParserAPIs.jar" />
           </path>
            <path id="ant.svn.classpath">
            <fileset dir="D:/CruiseControl/apache-ant-1.7.0/lib">
             <include name="*.jar" />
            </fileset>
           </path>
           <taskdef name="svn" classname="org.tigris.subversion.svnant.SvnTask">
            <classpath refid="ant.svn.classpath" />
           </taskdef>
           <path id="txsd.classpath">
            <path refid="Apache Tomcat v5.5 [Apache Tomcat v5.5].libraryclasspath" />
            <path refid="Web App Libraries.libraryclasspath" />
           </path>

          clean操作,如果build之前不執行此操作,build檢查到原有的class文件就不再編譯。
           <target name="clean">
               <delete file="${CLASS_DIR}/longcon-framework.jar" />
               <delete dir="target" quiet="true" />
            <delete dir="${CLASS_DIR}/source/classes" />
           </target>

          要build模塊的名稱build-framework看來可以隨便起名字,但是有人說必須和模塊名稱一致,至今還不知道為什么
           <target name="build-framework">
            <echo message="${ant.project.name}: ${ant.file}" />
            <mkdir dir="${CLASS_DIR}/source/classes" />
            <copy includeemptydirs="false" todir="source/classes">
             <fileset dir="${CLASS_DIR}/source" excludes="**/*.launch, **/*.java" />
            </copy>
            <javac debug="true" debuglevel="${debuglevel}" destdir="${CLASS_DIR}/source/classes" source="${source}" target="${target}" encoding="UTF-8">
             <src path="${CLASS_DIR}/source" />
             <exclude name="**/.svn/**" />
             <classpath refid="txsd.classpath" />
            </javac>
           </target>

          單元測試的部分
           <target name="test">
            <mkdir dir="target/test-classes" />
            <javac encoding="UTF-8" srcdir="${CLASS_DIR}/test" destdir="target/test-classes">
             <classpath>
              <pathelement location="${CLASS_DIR}/source/classes" />
              <path refid="Apache Tomcat v5.5 [Apache Tomcat v5.5].libraryclasspath" />
                    <path refid="Web App Libraries.libraryclasspath" />
             </classpath>
            </javac>

            <mkdir dir="target/test-results" />
            <junit haltonfailure="no" printsummary="on">
             <classpath>
              <pathelement location="${CLASS_DIR}/source/classes" />
              <pathelement location="${coolink.dist.path}/lib/junit.jar" />
              <pathelement location="target/test-classes" />
             </classpath>
             <formatter type="brief" usefile="false" />
             <formatter type="xml" />
             <batchtest todir="target/test-results">
              <fileset dir="target/test-classes" includes="**/*.class" />
             </batchtest>
            </junit>
           </target>

          打包放到指定目錄
           <target name="jar">
            <jar destfile="${CLASS_DIR}/longcon-framework.jar" encoding="UTF-8" update="false" excludes="**/*Test*.class">
             <fileset dir="${CLASS_DIR}/source/classes" />
            </jar>
            <copy includeemptydirs="false" todir="${coolink.dist.path}/lib">
             <fileset file="${CLASS_DIR}/longcon-framework.jar" excludes="**/*.launch, **/*.java" />
            </copy>
           </target>

          調用svn命令,這與三中的步驟7有密切的聯系
          <target name="commit">
           <svn username="aaa" password="aaa">
                   <commit file="${coolink.dist.path}/lib/longcon-framework.jar" message="${msg.commit}"  />
               </svn>
           </target>
           <target name="all"  depends="clean,build-framework,jar,commit"/>

          </project>
          注釋:

          a設置編譯所需要的類路徑可以用:                      <classpath>
                <pathelement path="${classpath}"/>
                <fileset dir="lib">
                  <include name="**/*.jar"/>
                </fileset>
                <pathelement location="classes"/>
                <dirset dir="build">
                  <include name="apps/**/classes"/>
                  <exclude name="apps/**/*Test*"/>
                </dirset>
                <filelist refid="third-party_jars"/>

             </classpath>

          b <target name="test" depends="clean">depends表示依賴關系
           2 cruisecontrol的config文件,CC啟動的時候會自動尋找此文件,當然你可以通過修改啟動文件修改config.xml名稱,只要兩處一致就能找到,下面是一個config文件的實例:

          <cruisecontrol>//cc的固有標簽,cc中可以有多個project

           <project name="framework">// 工程名稱

          <plugin name="labelincrementer" classname="net.sourceforge.cruisecontrol.labelincrementers.SVNLabelIncrementer"/>
                 <labelincrementer workingcopypath="projects/${project.name}"/> // 顯示svn的版本號

          listeners:監聽器,來報告cc的此項目的運行信息
            <listeners>
             <currentbuildstatuslistener file="logs/${project.name}/status.txt" />
            </listeners>

          bootstrappers從svn源碼控制程序更新本地版本,據說還有向其它插件提供當前創建的狀態

            <bootstrappers>
             <svnbootstrapper localWorkingCopy="projects/${project.name}" username="luojing" password="luojing" />
            </bootstrappers>
            <bootstrappers>//向ant提供當前信息
             <antbootstrapper anthome="apache-ant-1.7.0" buildfile="projects/${project.name}/build.xml" target="jar" />
            </bootstrappers>
            <modificationset quietperiod="30">// 通過svn更新原代碼
             <!-- touch any file in connectfour project to trigger a build -->
             <svn localWorkingCopy="projects/${project.name}" username="luojing" password="luojing" />
            </modificationset>

          <schedule interval="28800">設定檢查編譯build版本的時間單位s
             <ant anthome="apache-ant-1.7.0" buildfile="projects/${project.name}/build.xml" />
            </schedule>
            <log>//顯示單元測試信息
             <merge dir="projects/${project.name}/framework/target/test-results" />
            </log>
            <publishers>//發布版本
             <onsuccess>//成功,并生成有時間戳的目錄
              <artifactspublisher dest="D:/CruiseControl/artifacts/${project.name}" file="projects/${project.name}/longcon-framework.jar" />
             </onsuccess>
             <onfailure>//失敗發送郵件到響應的人員
              <htmlemail buildresultsurl="http://localhost:8080/cruisecontrol/buildresults/${project.name}" mailhost="郵件服務器" password="密碼" username="用戶名" defaultsuffix="@**.com.cn" returnname="PetClinic Continuous Integration" returnaddress="sunny@**.com.cn" charset="UTF-8" skipusers="true" xsldir="webapps/cruisecontrol/xsl" css="webapps/cruisecontrol/css/cruisecontrol.css">
               <always address="接收郵件方的郵箱" />
              </htmlemail>
             </onfailure>
            </publishers>
           </project>
           <project name="site">
            <listeners>
             <currentbuildstatuslistener file="logs/${project.name}/status.txt" />
            </listeners>

            <bootstrappers>
             <svnbootstrapper localWorkingCopy="projects/${project.name}" username="sunny" password="sunny" />
            </bootstrappers>
            <bootstrappers>
             <antbootstrapper anthome="apache-ant-1.7.0" buildfile="projects/${project.name}/build.xml" target="jar" />
            </bootstrappers>
                  <modificationset>//設置只有framework工程成功了才執行此次的操作,體現了project的依賴關系
                     <buildstatus logdir="logs/framework"/>
                  </modificationset>
           </project>
          </cruisecontrol>

          四 啟動CC可以實現集成編譯、集成構建、單元測試的功能,對于持續構建這是最簡單不過了,要繼續努力學習哦。

          五 持續集成使用了一段時間發現了源代碼目錄總是不能自動更新,認真查找發現是因為自己對標簽<svnbootstrapper>的理解不正確,現在就是在ant的build.xml中調用svn的提交命令來解決的,不知道思路是否正確,請大家指教。

          下面就更清晰的介紹一下常用的標簽把。

          CC配置文件范connectfour范例Config.xml如下:

          <cruisecontrol>
              <project name="connectfour">

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

                  <bootstrappers>
                      <antbootstrapper anthome="apache-ant-1.7.0" buildfile="projects/${project.name}/build.xml" target="clean" />
                  </bootstrappers>

                  <modificationset quietperiod="30">
                      <!-- touch any file in connectfour project to trigger a build -->
                      <filesystem folder="projects/${project.name}"/>
                  </modificationset>

                  <schedule interval="300">
                      <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>
                  </publishers>

              </project>
          </cruisecontrol>

          <cruisecontrol>根元素是<cruisecontrol>,該元素很簡單,沒什么需要配置的屬性。

          目前CC支持多項目(multiproject),因此可以有多個并行的<project>元素。支持的子元素包括:
           <project>
               <property/>
               <plugin/>
               <dateformat/>
               <labelincrementer/>
               <listeners>
                  <cmsynergysessionmonitor/>
                  <currentbuildstatusftplistener/>
                  <currentbuildstatuslistener/>
                  <currentbuildstatuspagelistener/>
                  <lockfilelistener/>
                </listeners>
               <bootstrappers>

                  <accurevbootstrapper/>
                  <alienbrainbootstrapper/>
                  <antbootstrapper/>
                  <clearcasebootstrapper/>
                  <clearcaseviewstrapper/>
                  <cmsynergybootstrapper/>
                  <currentbuildstatusbootstrapper/>
                  <currentbuildstatusftpbootstrapper/>
                  <cvsbootstrapper/>
                  <execbootstrapper/>
                  <gitbootstrapper/>
                  <harvestbootstrapper/>
                  <lockfilebootstrapper/>
                  <mercurialbootstrapper/>
                  <p4bootstrapper/>
                  <plasticscmbootstrapper/>
                  <snapshotcmbootstrapper/>
                  <starteambootstrapper/>
                  <surroundbootstrapper/>
                  <svnbootstrapper/>
                  <tfsbootstrapper/>
                  <vssbootstrapper/>
                </bootstrappers>
               <modificationset>

                  <accurev>
                  <alienbrain/>
                  <alwaysbuild/>
                  <buildstatus/>
                  <clearcase/>
                  <cmsynergy/>
                  <compound>
                     <targets/>
                     <triggers/>
                   </compound>
                  <cvs/>

                  <darcs/>
                  <filesystem/>
                  <forceonly/>
                  <git/>
                  <harvest/>
                  <httpfile/>
                  <mavensnapshotdependency/>
                  <maven2snapshotdependency/>
                  <mercurial/>
                  <mks/>
                  <p4/>
                  <plasticscm/>
                  <pvcs/>
                  <snapshotcm/>
                  <starteam/>
                  <store/>
                  <surround/>
                  <svn/>
                  <tfs/>
                  <timebuild>
                  <ucm>
                  <veto/>
                  <vss/>
                  <vssjournal/>
                </modificationset>
               <schedule>

                  <ant/>
                  <maven/>
                  <maven2/>
                  <pause/>
                  <nant/>
                  <phing/>
                  <rake/>
                  <exec/>
                  <composite/>
                </schedule>
               <log>

                  <merge/>
          <gzip/>
          <delete/>
                </log>
               <publishers>

                  <antpublisher/>
                  <artifactspublisher/>
                  <clearcasebaselinepublisher/>
                  <cmsynergybaselinepublisher/>
                  <cmsynergytaskpublisher/>
                  <compoundpublisher/>
                  <currentbuildstatuspublisher/>
                  <currentbuildstatusftppublisher/>
                  <email/>
                  <execute/>
                  <ftppublisher/>
                  <htmlemail/>
                  <http>
                  <jabber/>
                  <onfailure/>
                  <onsuccess/>
                  <rss/>
                  <sametimeannouncement/>
                  <scp/>
                  <sfeedocman/>
                  <sfeefrs/>
                  <sfeetracker/>
                  <socket/>
                  <weblog>
                  <x10/>
                  <xsltlogpublisher/>
                  <yahoopublisher/>
                </publishers>
             </project>

           子元素過多所以詳情可以參看官方文檔的說明。

          這里只介紹幾個常用的子元素:

          <bootstrappers>:<bootstrappers>在創建之前會運行,相當于一個預處理的作用,<bootstrappers>下面每個子元素都是獨立的,因此可以同時配置多個bootstrappers。

          CC提供的bootstrappers包括兩種,一種用于向其他插 件提供項目當前創建的狀態,還有一種是從某個源碼控制系統更新本地文件,其中最常用的就 是<currentbuildstatusbootstrapper> 和<svnbootstrappers>。<currentbuildstatusbootstrapper>指定了狀態文件的 位置,主要是用來訪問項目當前創建的狀態,CC的<currentbuildstatusbootstrapper>會將創基愛你的狀態寫入 這個文件。

          <svnbootstrapper>的作用有點難理解,因為我們每次項目的創建都應該基于最新的代碼,因此在創建之前就要獲得最新的項目文 件,如果使用的是ant來完成這個任務,那么buildfile本身在創建開始之前發生了變化,我們是不是應該先更新這個buildfile,然后才通過 buildfile來對項目進行構建呢?<svnbootstrapper>就是為從源碼控制系統更新buildfile文件而設計的(還有 一種替代的使用方法是使用wrapper buildfile,這樣就不用使用<svnbootstrapper>了,wrapper buildfile也是推薦的方法,<modificationset>部分會進行詳細的討論)。

          <modificationset>:包括了SourceControl插件的配置信息,用于檢查各個源碼控制系統中是否發生變化,<schedule>會用到這里的配置信息,如果檢測到變化,會觸發創建過程。

          <modificationset>的屬性quietperiod(單位為秒)定義了一個時間值。如果CC檢查到了變化,會自檢查到變化的源碼控制系統的最后一次check in 的時間開始等待,等待時間由quietperiod決定,等待結束之后才觸發創建(build)過程,主要是防止有人在check in的過程當中就觸發創建過程(可能check in只做了一半,這個時候觸發創建顯然是不正確的).

          下面是一個modificationset的例子:

          <modificationset quietperiod="30">
                      <svn localworkingcopy="projects/SFA"/>
          </modificationset>


          |

          posted on 2009-11-05 17:50 找個美女做老婆 閱讀(2281) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           

          導航

          統計

          公告

          本blog已經搬到新家了, 新家:www.javaly.cn
           http://www.javaly.cn

          常用鏈接

          留言簿(6)

          隨筆檔案

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 固镇县| 阿鲁科尔沁旗| 高雄市| 西昌市| 梅河口市| 安多县| 雷波县| 高唐县| 拜泉县| 太仓市| 木兰县| 仁布县| 沈阳市| 肥东县| 新田县| 镇康县| 拉孜县| 铜梁县| 凤山县| 泸西县| 和平县| 安远县| 宣恩县| 铜陵市| 晋城| 如皋市| 呼图壁县| 揭东县| 肇州县| 长治县| 察雅县| 任丘市| 东辽县| 同德县| 香港 | 昌黎县| 南乐县| 尉犁县| 石城县| 江门市| 呈贡县|