淺談 CI, Continuous Integration (持續整合)
當軟體專案執行的過程越長,所累積的程式碼也越複雜,整合變得相當不容易,持續整合目 的就是在解決與改進這樣的問題。持續整合顧名思義就是隨時整合,無時無刻都在進行整合,整合的過程會驗證程式碼的正確性與單元測試等等。當程式碼被更新與 改變時,立即進行自動化的整合作業,自動化在持續整合中扮演重要的角色,我想你不會希望每 Commit 一次就招集各個子系統的開發人員進行手動測試。
當程式碼一改變就進行整合,這樣的好處為不必等到整合出現重大問題的時候才來改寫系統,此外透過自動化的整合與測試工作,隨時做好品質管理,提昇系統品質。伴隨著建置報表的分析可以讓管理者發現系統的潛在問題,提早做出預防措施,降低專案失敗的風險。
在 Agile Software Development (敏捷開發) 方法論與其著名的 XP, eXtreme Programming (極限編程) 實作理念中皆有提出持續整合的重要性,在 M$ VSTS 2010 (Visual Studio Team System 2010) 也使用的一樣的概念。可現持續整合對於軟體工程來說越來越受到重視。
持續整合的概念上希望開發者做到以下幾個重點:
- Maintain a Single Source Repository
使用版本控制來管理程式碼,像是 SVN, CVS等。
- Everyone Commits To the Mainline Every Day
每天都 Commit 撰寫的程式碼,減少程式碼衝突的情況。
- Every Commit Should Build the Mainline on an Integration Machine
每一次 Commit 都進行建置 (Build)與整合,提早發現程式錯誤。
- Automate the Build
專案自動建置,每一個 Commit (程式碼上傳) 都進行建置工作。
- Make Your Build Self-Testing
程式碼進行有效的切割,使得程式變得更容易維護。並且撰寫單元測試,將片段式的程式在建置後進行自我測試。
- Test in a Clone of the Production Environment
提供一個穩健的建置與測試環境,這個環境必須相當接近真實的執行環境,採用 VM 來實作 Nightly Build 是不錯的選擇。
- Automate Deployment
透過一些 Script 的執行達到自動佈署與安裝測試,通常採用 Ant, NAnt, Shell Script 來完成。
- Everyone can see what's happening
透過程式碼更新與建置的過程中所產生的報表,讓所有人清楚發生了什麼事?程式碼做了哪些修正?
- Make it Easy for Anyone to Get the Latest Executable
建置的時間越快越好,理論上不得超過十分鐘,且提供一個可以穩定運作的最新版本。
持續整合 = 平時要用功,不可臨時抱佛腳。
Hudson 持續整合與自動建置工具
Hudson 為一套實作持續整合與自動建置的工具,功能與另一套 CruiseControl 並列前茅。Hudson 使用 Java 開發完成,使用 WAR 檔的方式進行安裝,除了本身提供的功能外,還有其他許多的 Plugin 支援。
後記:後來 Hudson 掛上 ORACLE 之後,我就改用 Jenkins 囉(跟 Hubson 一樣而且管家長的比較可愛!)
Hudson 安裝教學
- 下載 hudson.war 網址如下:
http://hudson-ci.org/latest/hudson.war - 下載任何一項支援 Servlet 的 Web Container (Jetty 或 Tomcat 都可以),將 hudson 放在 webapps 目錄中,啟動伺服器這樣就安裝完成了。
- 連進網址 http://127.0.0.1:8080/hudson 會看到以下畫面
結論
在 實作與執行持續整合的過程中是痛苦的,必須規劃出專案的標準結構,且需要對開發人員進行適當的教育訓練。在建立自動化建置也會花上許多時間,畢竟要將原本 手動操作的安裝打包佈署工作進行自動化。在程式設計師沒有優良的素質下也不容易撰寫出可進行測試的程式碼,但是持續整合確實能夠有效提高系統品質。藉由這 樣的系統開法手法來牽制程式設計師所撰寫的程式品質,未來在維護上也有很大的幫助。對於整的專案進行的過程中,可以幫助團隊掌握開發節奏。
參考資料
- http://martinfowler.com/articles/continuousIntegration.html
- http://en.wikipedia.org/wiki/Continuous_integration
- http://wiki.hudson-ci.org/display/HUDSON/Home
- http://en.wikipedia.org/wiki/CruiseControl
- http://en.wikipedia.org/wiki/Hudson_%28software%29
- http://www.josephj.com/entry.php?id=251
- http://www.dtosolutions.com/continuous-integration-and-dep/