什么是持續集成?Continuous Integration, CI
它是一種軟件項目管理方法,依據資產庫(源碼,類庫等)的變更自動完成編譯、測試、部署和反饋。
持續集成的背景
在沒有CI的情況,開發人員進行開發,測試人員測試,最后支持人員進行部署和代碼的發布。
這是一種線性的開發流程,一旦測試通不過,可能最后就沒辦法交付產品。
有句話說得對,目前軟件開發最大的難度在於:
1 確定軟件的需求
2 確定軟件的剩余量
無法確定軟件的需求,是因為需求隨着開發的落實在不斷的變化。最開始用戶不知道自己想要什么,你給了他一種方案,他便在這種方案基礎上想象更多,於是無論提交什么產品,都不會是用戶最終想要的。
無法確定軟件的剩余量,是因為我們無法像造汽車一樣,看到整個開發過程。也許生於的20%工作,要花費80%的時間。
持續集成采用”水滴石穿、分而治之“的思想,既然我們不能馬上交付一個可用的產品,為什么不隨時提供一個可以使用的產品呢。
通過上面的結構圖,就可以看到CI持續集成的基本思想。
就是程序員在向版本庫中提交代碼后,CI持續集成服務器自動發現或者定時發現變更,依據這些源碼,重新構建產品的編譯、測試、審查、部署和反饋過程。
如何做到持續集成
根據上面的思想,持續集成工具需要做到下面幾個功能:
1 自動構建:要求無人值守,如果人工來操作,那就沒有持續集成的必要了。
2 發現版本庫的變更:通過輪詢或者定時,或者程序員使用命令,處罰持續集成發現版本庫的變更
3 反饋機制:在出現問題時,能及時的把問題反饋給正確的人(提交者、測試者、管理者)
4 回滾:在出現問題后,擁有回滾到可交付的能力。
5 純凈的構建環境:每一次都應該把之前的環境刪除干凈,讓每一次構建都是一個新的構建。
6 完善的集成功能:代碼的測試,審查都應該做到完善。如果單純的利用它做持續的編譯,那就是大材小用了。
利用什么工具都是其次的,關鍵是要注意養成持續集成的習慣,軟件的開發流程以及代碼的編寫,都應該注意CI的風格。
比如編寫具有單元測試的代碼,命名符合代碼審查的規范等等。
另外在持續集成的時候,還需要注意:
1 為了避免每次過多出現問題的構建,開發者在提交代碼的時候,最好在本地獨立的構建一次。可以自行運行構建腳本,模擬構建。
2 由於數據庫與編碼的分離,最好把數據庫相關的DDL\DML等腳本一起放入版本庫中,這樣CI進行構建的時候,可以連同數據庫一起重新構建。
推薦的工具資料
【1】《持續集成:軟件質量改進和風險降低之道》
【2】持續集成:http://www.martinfowler.com/articles/continuousIntegration.html
【3】CI持續集成工具:
Apache Continuum: http://continuum.apache.org/
CruiseControl: http://cruisecontrol.sourceforge.net/
Hudson: http://hudson-ci.org/
Jekins: http://jenkins-ci.org/
Luntbuild: http://jenkins-ci.org/
【4】構建腳本:
Ant: http://ant.apache.org/
Maven: http://maven.apache.org/
【5】測試:
JUinit
DbUnit
Floyd
HtmlUnit
JWebUnit
SQLUnit
【6】自動化審查:
CheckStyle: http://sourceforge.net/projects/eclipse-cs/files/
JavaNCSS: http://mojo.codehaus.org/javancss-maven-plugin/
JDepend: http://www.clarkware.com/software/JDepend.html
PMD: http://pmd.sourceforge.net/
Siminan: http://www.redhillconsulting.com.au/products/simian/
【7】反饋
Jabber: http://www.jabber.org/