歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux綜合 >> Linux資訊 >> Linux文化

技術指南:使用開源工具進行持續集成


談到持續集成,不如先談談集成。軟件開發中的集成,通俗地講就是把各個相關部分的東西組合起來,形成一個可用的軟件。比如一個軟件項目由幾個小組來負責完成,每個小組負責其中一部分功能的實現,比較典型的是在現在的網絡游戲開發中,通常有負責引擎的小組,負責游戲邏輯的小組,負責美工的小組,這些小組開發出的東西必須結合在一起才能形成一個可用的游戲;而每個小組內部的每個成員,他們每天在寫著不同部分的代碼,這些開發人員必須將各自的成果組合起來,才能完成他們共同的目標。從這個意義上講,從每天每個開發者的日常開發,到各個軟件模塊的組合拼接,軟件集成無所不在,一個完整可用的軟件,就是通過不斷地集成每個開發人員的代碼而形成的。

每個開發過軟件的人都能體會到,軟件開發絕非一帆風順,每個人開發出來的代碼絕對不會魔術般的自己組合在一起,當新的功能加入到原有軟件中的時候,往往不小心破壞了原有的功能,引入了一些bug,當老的bug被修復的時候,又往往會導致其他bug的產生,更糟糕的是,這些bug往往在當時並不能及時被發現。當小組成員們完成了自己所負責的模塊,等到最後來一起集成的時候,他們可能已經做好了修復集成問題的心理准備。所有的這一切,都是每個開發人員的切膚之痛。那麼,問題到底出在哪了?

讓我們不妨換一種思維,讓我們不要停留在如何地去修復bug和集成過程中產生的問題,我們渴望的理想狀況是,每當我們開發出新的代碼並將他們加入原系統中的時候,如果我們能夠被及時告知我們是否破壞了原有系統的功能,那麼我就能夠及時的作出反應,修復這些部分。如果這個過程的粒度足夠的細、足夠地頻繁,我們就能期望每次新功能引入的時候所引起的破壞足夠小,並且修復起來足夠簡單,如果每個開發人員都能夠享受到如此的方便並且保證新加入的功能不會影響原有的功能,我們的整個軟件過程就能夠以一個穩步可靠的步伐,持續增量的向前行進,而不是不斷地加入新的代碼,然後等到後來bug被人發現的時候被動地去修復它。我想穩步可靠、持續增量的軟件過程,是我們每個開發者心目中的理想過程。從開發者的角度來看,畢竟誰也不想經歷那種當發現自己的修改破壞的原有的功能的時候的惱火的感受。

談到這裡,我想聰明的讀者應該能夠想到,剛才我們所說的就是前面最開始提到的持續集成。持續集成通俗地說就是持續地、頻繁地進行集成,每當有新的修改加入的時候,修改的作者能夠被及時地告知他的修改是否在引入新的功能的同時保證原有功能的完整。如果整個軟件開發團隊在一開始就采用這種方式,我們的軟件就能被穩步可靠的構建起來。

講到這裡,讀者們馬上就會有疑問:“你說的只是一種理想狀況罷了,誰都希望自己在加入新的代碼的時候得知自己的代碼是否破壞了原有的功能,但是怎麼能夠做到這一點,誰有能力來及時地告訴我們哪裡有問題?持續集成這個想法不錯,但怎麼樣能夠做到持續集成?”我想這些問題是非常好也是關鍵的問題,持續集成究竟是否可行,如果可行,又該如何執行?我們這裡不妨來整理一下,看看究竟什麼是持續集成的難點。持續集成的難點主要在於,在新的功能加入的時候,如何來判斷整個系統功能仍然完整;出錯或者成功,誰來告訴我,如何告訴我;當大家一起協作的時候,如何保證每個人都能夠准確地被告知而不會發生混亂。讓我們來一個個地分析這些問題。

首先,確保真個系統功能完整性的手段就是測試,如果我們對所有的功能都有完整的測試,那麼當新的功能引入的時候,如果某些原有的測試失敗,就說明新的修改破壞了原有的功能,而失敗的測試就能准確地告訴我們新的修改破壞了哪些原有的功能。其次,持續集成工具將告訴我們集成是否成功,持續集成工具通過運行整個系統中的測試,根據測試的結果來通知開發者,哪些測試失敗導致的集成失敗。每個軟件項目通常會使用版本控制工具例如SVN、CVS,每當有開發者將新的修改加入到系統的代碼庫中時,持續集成工具會check out出代碼庫中的最新版本,使用自動化的構建工具例如Ant、Rake等,自動地編譯項目中的代碼、部署整個應用、准備測試所需的環境和數據、運行所有的測試包括單元測試、功能測試、集成測試等,在整個過程結束後將結果報告出來,持續集成工具會指出任何一個過程中出現的錯誤,並且准確地報告給開發者。在多人協作的情況下,版本控制工具確保了每個開發者的修改被正確有序地保存,當每個開發者想要提交自己的修改的之前,必須首先確保上一個人所提交的修改被成功集成,才能提交自己的代碼,當確保自己的代碼被正確集成之後,自己的工作才算完成,否則,就必須修復錯誤,再次提交,如此反復,直到被成功集成。

開源社區已經為我們提供了非常優秀的持續集成工具,CruiseControl、CruiseControl .Net已成為廣泛使用而且非常成熟的持續集成工具,而持續集成所需要的自動化構建工具和版本管理工具如Ant、NAnt、SVN也已經是非常成熟。在下面,我嘗試在我的使用經驗的感受的基礎上,挑選一些比較成熟或者很有潛力的工具,結合自己的使用經驗,給大家做一些介紹。

我們先從持續集成的核心工具入手,這些工具在持續集成的整個過程扮演了類似於中央處理器的角色,它們負責更新每個開發人員提交的代碼,使用構建工具自動運行所有的測試,然後調用其他工具將結果報告給開發人員。這一類的工具包括CruiseControl、CruiseControl .Net以及新興的DamageControl等。

CruiseControl & CruiseControl .Net談到持續集成工具就不能不談談CruiseControl(cruisecontrol.sourceforge.net),CruiseControl可謂持續集成工具中的龍頭老大,也可以說是第一個成熟的開源持續集成工具。該工具由ThoughtWorks公司開發,並將其開源,同時提供了豐富的文檔支持(http://confluence.public.thoughtworks.org/display/CC/Home)。

CruiseControl非常完美的實現了一個持續集成工具所需要具備的所有功能,它集成了包括SVN,CVS,VSS,StarTeam,ClearCase等在內的十幾種版本管理工具,內建地支持了Ant,NAnt,Maven,Maven2等自動化構建工具,並且通過執行shell命令的方式間接支持幾乎所有其他構建工具如make,jam等。你可以設置CruiseControl以多種方式運行系統的集成,既可以在每次有新的代碼修改提交時自動運行,也可以讓它定時運行。在運行完後,CruiseControl可用允許你使用各種方式報告運行的結果,包括發送電子郵件、使用ftp、rss、jabber、scp等工具報告結果,也可以讓你自動化地在運行完後將整個系統打包、部署。它甚至允許你在運行完成後根據結果成功與否播放不同的音樂或電影,及時地告訴大家。

CruiseControl附帶的web應用,用於報告每次的集成結果 在實際開發過程中,開發人員可以將CruiseControl配置為每次有新的修改時運行所有集成工作,這樣當你提交你的修改以後,CruiseControl會自動地將代碼庫中的新的修改更新到一個事先指定的地方,然後按照你的配置准備測試數據、編譯、運行系統中的所有測試。開發人員可以通過web方式通過CruiseControl附帶的一個web程序查看運行的結果,這個結果頁面會告訴大家該次build是否成功或失敗,如果失敗,大家也可以看到失敗的錯誤信息,也可以告訴你在某一段時間之內所運行的集成的統計信息。根據配置,CruiseControl可以顯示幾乎集成過程中每個環節出現的錯誤,例如編譯錯誤、junit測試運行錯誤、checkstyle代碼風格檢查錯誤,以及功能測試、集成測試錯誤等。當其他人想要提交他們的修改之前,都應改事先查看CruiseControl的結果頁面,如果當前CruiseControl沒有在運行,並且上一次運行結果為成功,才能提交自己的修改,在提交後,還要保證新的一輪集成成功完成,才算完成了自己的工作。

CruiseControl具備很好的擴展能力,目前已經有很多為CruiseControl編寫的插件。eXtreme Feedback Devices (XFDs)(http://www.artima.com/weblogs/viewpost.jsp?thread=67492)就是一個很有意思的插件,該插件的一個功能就可以將CruiseControl的運行結果用一個外接的紅綠燈顯示出來,如果build成功就亮綠燈,如果失敗就亮紅燈,以次來讓開發人員們對CruiseControl的build結果。

紅綠燈圖片

另一個trac插件(https://oss.werkbold.de/trac-cc/)可以讓CruiseControl將運行結果自動地放到trac上去,使CruiseControl和trac很好地結合了起來。CruiseControl同時還擁有Firefox和Thunderbird(http://www.md.pp.ru/mozilla/cc/)、Eclipse等的插件,使你可以在浏覽器的狀態欄上及時的看到集成的最新結果。

CruiseControl是用java語言編寫的,並且可以運行在各種平台上,然而,並不是只有java程序才能用它來進行持續集成,CruiseControl可以用來做任何語言編寫的系統的持續集成,例如C++程序員就可以使用make或jam,配合svn火車cvs來進行持續集成,使用CppUnit、mockpp等工具編寫測試。盡管如此,還是誕生了一些在特定平台上運行的持續集成工具,CruiseControl.Net就是其中一個例子。

CruiseControl.Net(http://ccnet.thoughtworks.com)運行在.Net平台上,采用.Net框架實現,在實現了幾乎所有的CruiseControl的功能的基礎上,提供了對於Windows平台和.Net編程更多更友好的支持。

CruiseControl.Net的一個特點是它集成了對Visual Studio .NET和MSBuild的支持。用戶可以將Visual Studio .NET工程的sln文件指定給它,讓它運行其中的build、rebuild和clean等功能。在NAnt出現之前,幾乎所有開發人員在都是使用Visual Studio .NET來管理他們的.Net項目的。這樣,CruiseControl.Net可以支持對原有Visual Studio .NET工程的持續集成,而用戶也既可以使用NAnt或者Visual Studio .NET來管理整個項目的構建。MSBuild是Visual Studio 2005項目的標准格式,CruiseControl.Net對其的內建支持可以使大家很容易地將Visual Studio 2005的項目放到CruiseControl.Net中去。

CruiseControl.Net使用Web Dashboard來發布運行結果,它有點類似於CruiseControl中用來發布結果的web應用,不過是用.Net寫成的。另外它還包含一個Windows托盤程序CCTray來方便用戶隨時查看build結果。

DamageControl

在Ruby成為一種新的流行時尚的今天, DamageControl(http://dev.buildpatterns.com/trac/wiki/DamageControl)的出現大概不會讓大家感到奇怪,它是一個用ruby寫成的持續集成工具,也是由ThoughtWorks公司開發的一個開源產品。DamageControl目前還處於開發階段,但是已經實現了CruiseControl的絕大部分功能,包括對CVS和SVN的內建支持,同時支持多種自動化構建工具等。

DamageControl區別於CruiseControl的一個顯著特性是它提供了一個用Ruby on Rails框架寫成的web管理應用程序,用戶可以很簡單的使用這個web程序來配置持續集成項目。憑借著這個簡單的web管理程序,用戶可用方便的建立一個持續集成項目,並可以配置運行策略、版本管理、運行結果的查看方式等,而不用像在CruiseControl或CruiseControl.Net裡面一樣,需要手動修改一個xml配置文件來完成集成項目的配置。

盡管DamageControl目前還處於開發狀態,它已經逐漸被廣泛應用起來,由於它使用ruby寫成的,所以自然會成為ruby項目的首選工具。它的安裝也比較簡單,用戶可以直接從DamageControl項目的SVN代碼庫中check out出源代碼,稍加配置就可以運行了。

DamageControl還實現了一個非常酷的功能: AppCasting。該功能能夠讓你將你運行完持續集成後得到的系統交付給對你的系統感興趣的人。當某一次集成運行完畢後,DamageControl會使用一些工具如Ruby Gems, Apt, Maven repository等將你的系統打包,然後在它自己的RSS裡面加上一條消息表明新的系統已經被成功構建了。這樣,任何訂閱了該RSS的人就可以及時的知道某一個項目的進展情況,並且在有新的集成成功運行完成後得到最新被構建的系統以及相關的發布信息。

談完了這些持續集成工具,我們有必要來看看自動化構建工具,這些工具在持續集成中同樣扮演著非常重要的角色,可以這麼說,持續集成工具就像一個指揮,而真正完成工作需要依靠這些自動化的構建工具。正是這些工具的存在,是我們可以自動化的完成編譯源碼、運行測試、打包系統、部署應用等所有這些我們在集成中需要完成的工作。目前在這方面已經有很多非常成熟的開源工具,比如古老的Make,鼎鼎有名的Ant和它在.Net世界中的兄弟NAnt,用ruby寫就的Rake等等。在下面的內容中,我將挑選其中的幾個工具進行一些介紹。


Copyright © Linux教程網 All Rights Reserved