您好,登錄后才能下訂單哦!
作者:Tony Qu
首先,我們先回顧下過去我們是怎么構建build server的。
大部分人最先想到的肯定是bat還有Windows系統的計劃任務,確實,這兩個東西在過去誰也離不開誰,bat充當腳本引擎,計劃任務充當觸發器。但在實際操作中我們發覺bat的能力是有限的,需要很多輔助的工具,因為它沒辦法像高級語言一樣直接訪問系統組件,比如需要用vbscript來訪問adsi、訪問com對象、控制IIS、訪問注冊表、訪問wmi等。通常我們的做法是借助一些輔助命令或工具,比如iis我們可以用系統自帶的iisweb.vbs, 操作ADSI也有相應的vbs腳本或者可以自己寫一個,但這樣以為著你要不停在各種語言中間切換,再加上vbscript和bat的調試并不容易(相對于.NET集成Visual Studio而言),這無形中增加了維護的成本和出錯的可能。另外,bat本身沒有任何倒退機制,我們必須花大力氣構建錯誤處理機制,接著就是出錯了如何退回到原來的狀態,這些是非常費時間的。另外有個很大的問題就是bat只適合單機執行,如何及時的獲取執行的結果(比如編譯是否成功、編譯后的版本號),目前比較通行的做法是通過腳本發郵件出來,當然這確實是可行的,但要完全搭建出來確實要費不少人力物力,這也是為什么現在很多公司設立了release engineer/manager職位。
如今越來越多的公司開始上敏捷開發,其中非常重要的一個環節就是持續集成,但事實上很多公司依然使用傳統的編譯模式,讓release engineer專門負責編譯的執行,雖然每天會有daily build,但如果是按需編譯,都需要專人來完成,而不是由dev自己觸發編譯動作。傳統的編譯由于采用了bat,我們不得不登上某臺dev, qa, stage server去執行編譯和部署腳本,這樣在有些時候會帶來一些問題,比如允許登錄該機器的人數不夠,登不進去(通常IT只給2-3個人的上限,因為虛擬機處理能力有限);誰執行了上次編譯,帶來了哪些問題,沒有任何log可查等一系列問題。
接下來我們要請出今天的主角:CuriseControl.NET和NAnt。
CuriseControl.NET,簡稱CC.NET,由ThoughtWorks公司出品,免費開源軟件,主要用于分布式版本發布,這款軟件的最大特點是部署方便,可以輕易搭建輕量級Daily Build Server,是中小企業做Build的首選,并且支持各種不同的第三方版本控制和build軟件,如svn, vss, nant, msbuild等。同時CC.NET提供了CCTray客戶端,可以在遠程開發機器上觸發Build,也可以實時查看Build的狀態,是成功還是失敗,這樣就解決了Build Server上的權限分配問題,我們不需要給所有的開發Build Server的登錄權限,只需要給CC.NET的訪問權限就可以了,由于它提供了Windows Service的運行方式,部署就更加方便了(在調試時可以使用控制臺方式)。另外,當然CC.NET還有很多細致的功能來協助你完成Build,比如你可以在Build成功或失敗時發郵件,可以把build直接部署到codeplex這樣的開源技術社區等。總的來說,CC.NET不僅提供了整套的Build部署方案,更多的是Build的管理。
CC.NET不僅提供了服務器端,也提供了客戶端,客戶端分為web和桌面兩種,web版就是CC.NET自帶的web dashboard,桌面版則是之前提到過的CCTray,從它的名字不難看出,它就是一個任務欄托盤程序,但有任何的編譯會及時通知所有人編譯的進展情況,目前最新的版本號等,對于希望部署持續集成的團隊來說,絕對是首選,更何況它是免費的。CC.NET還提供了日志機制,能夠方便的記錄每次編譯的細節,并可作為郵件附件發出來,而你要做的不是編寫大段大段的腳本,只需要配置一個xml文件就可以了(ccnet.config),稍后我們來學習如何配置這個文件。
以上就是CC.NET的web界面,看起來比較清爽,其中列出了所有編譯項目,當然現在我只做了NPOI一個編譯項目,如果團隊中有多個項目,只需要多建幾個Project就行了。web dashboard默認部署在IIS默認網站的ccnet目錄下面,在CC.NET安裝的時候會自動創建,當然前提是IIS已經安裝并能正常工作。
上面這個就是CCTray的界面,這兩個界面的區別在于,web dashboard只會列出當前服務器的任務,但CCTray通過配置是可以列出多個CC.NET服務器的任務的,你可以在File->Settings->Build Projects中選擇需要監控的編譯/部署任務。另外CCTray還有些比較花哨的功能,比如更換不同狀態的圖標(successful, failed, broken)、用語音觸發任務、根據不同狀態執行命令、輸出x10硬件信號(可接外部設備,如紅綠燈)、根據狀態播放音頻等。
在使用CCNet時最讓人頭疼的莫過于配置ccnet.config文件,它位于server目錄(ccnet子目錄之一)下,所有的關于build項目的配置信息都是從這里面讀出來的,由于是xml文件,所以首先要保證不能寫錯標簽,其次是不能寫當前版本不支持的東西。CCNet發展到現在已經有了1.1, 1.2, 1.3, 1.4, 1.5,每個版本的配置文件都會有所不同,支持的東西也不同,出于這一點有人寫了個輔助的工具叫做CCNetConfig,這是一個簡單的Winform程序,但是它非常有用,因為它解決了這個最棘手的問題——寫ccnet.config。下面就是CCNetConfig的界面,讓繁瑣的xml配置工作轉變成了窗口操作,非常方便,說實話,如果沒有這東西讓我直接寫ccnet.config,這簡直就是噩夢。
以上各軟件的下載地址如下:
CC.Net下載地址:http://sourceforge.net/projects/ccnet/
CCTray下載地址:http://ccnetlive.thoughtworks.com/ccnet/CCTrayDownload.aspx
CCNetConfig下載地址:http://ccnetconfig.codeplex.com/
接著說NAnt,相對于CC.NET,NAnt則更注重于Build的運行,而非Build的管理。不得不提的是,NAnt是一個半移植半借鑒項目,來源于Java的Ant工具,但是NAnt的很多插件是為微軟編程平臺特地設計的,比如regasm,所以不能說它是一個完全移植的項目。NAnt雖然只提供了nant.exe一個可執行文件,但是它內部有很多插件,如copy, exec, cvs, zip, tar, unzip, mail, regasm等,這些都是編譯時常用的,另外它的腳本引擎系統可以基于xml寫執行和編譯腳本,功能絕對不亞于我們平時常用的bat或powershell,還有大量的分支邏輯語句,如if, ifnot, foreach, call等,這些絕對是CC.NET目前望塵莫及的。由于使用日漸頻繁,開源社區又為Nant提供了一個重要的增加組件——NAnt.Contrib,這個東西說白了其實就是一些自定義的NAnt Task的集合,但確實提供了不少有用的東西,比如支持vb6, msbuild, adsi, depends, ini, sql, svn, vss, registry等任務,在實際應用中這些任務的執行也是不可或缺的,所以在接下來的文章中我會連帶介紹Nant.Contrib的使用。
NAnt下載地址:http://nant.sourceforge.net/
NAnt-contrib下載地址:http://nantcontrib.sourceforge.net/
下面是一個最簡單Hello World NAnt腳本,我把它取名為helloworld.build。
<?xml version="1.0"?> <project name="NPOI"> <echo message="Hello World!" /> </project>
上面這段代碼的意思是顯示Hello world!,項目名稱叫NPOI。運行結果如下:
C:\Documents and Settings\Administrator>nant -buildfile:c:\scm\buildfiles\hellow orld.build NAnt 0.90 (Build 0.90.3780.0; release; 2010-5-8) Copyright (C) 2001-2010 Gerry Shaw http://nant.sourceforge.net Buildfile: file:///c:/scm/buildfiles/helloworld.build Target framework: Microsoft .NET Framework 2.0 [echo] Hello World! BUILD SUCCEEDED Total time: 0 seconds.
Nant指定build文件時必須使用-buildfile標簽,你會看到最后有一句BUILD SUCCESSED,這表示整個build過程中沒有任何錯誤,一旦有錯誤就會出現BUILD FAILED,整個build會停止,不會繼續執行下去。
當然這是最最簡單的build文件,復雜的build邏輯可能需要上千行的代碼,我們會在接下來的文章中慢慢講解。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。