在軟件開發過程中,我們會涉及到配置管理、源碼控制、發布計劃、審計、符合性和集成,以及構建測試和部署流程、驗收測試、依賴管理和生產環境的創建與管理,很多人認為這些與確定需求、實現需求、寫代碼相比,這些活動并不那么重要,它只為是軟件開發過程很小的一部分并且不需求多大的技術投入。其實不然,恰恰相反它們會消耗大量的時間和精力,而且是成功交付軟件的關鍵因素。假如沒有關注這一方面帶來的潛在風險,就可能耗費大量不必要的資金,甚至導致整個項目嚴重延期。
如果沒有持續集成,我們可能會遇到下列問題:
1、如何將一個想法以最快的速度交付給用戶。
2、如何協調開發人員、測試人員,以及構建和運維人員在一起高效地工作。
3、在發布當天是否遇到很多的問題,發布過程時候需要很長的時間。
4、是否在開發完成之后才發布軟件,失敗后長期的加班。
5、如何快速的獲取用戶的反饋,并讓團隊人員及時的改正。
6、生產環境是否還是采用的手工部署,還在為不同環境之間的部署煩惱。
7、在開發過程中,應用程序在相當長的一段時間內無法運行,無法驗證每次修改的正確性。
一行代碼的改動需要花多長時間才能部署上線,處理方式是否可重復且可靠呢?從決定做某種修改到該修改結果正式上線的這段時間稱為周期時間。對任何項目而言,它都是一個極為重要的度量標準。
軟件開發的首要任務是盡早交付有價值的軟件并讓客戶滿意,速度是至關重要的,因為未交付的軟件就意味著成本。如果不能按時按量的交付,就會產生不必要的成本浪費。而為了更好的協調組內人員高效的工作,在整個交付過程中,團隊中的每一個成員都必須對每一個交付特性負責,無論什么樣的修改都應該觸發反饋流程,反饋應該盡快發出,團隊必須接受反饋,并依據它作出相應的行動??焖俚慕桓妒鼓隳軌蝌炞C那些新開發的特性或者修復的缺陷是否真的有用。
為了達到短周期、高質量的交付目標,發布軟件必須自動且頻繁化。
自動化:構建、部署、測試、發布
頻繁化:頻繁發布,每個發布版本之間的差異會很小,大大減少與發布相關的風險,且容易回滾,頻繁發布也會加快反饋速度。每當有人提交代碼,就對整個應用進行構建,執行全面的自動化測試,以驗證其正確性。更重要的是,如果構建或測試失敗了,開發團隊就要停下手頭的工作,立即修復它,時時刻刻都要讓正在開發的軟件一直處于可工作的狀態。
實現持續集成,你需要的:
1、版本控制,所有涉及產品的都要加入到版本控制中,包括構建與部署腳本。
2、自動化構建,自動化的構建整個過程,縮短周期時間(Cycle time)。
3、持續集成系統,Jenkins, ThoughtWorks公司的Go,JeBrains的TeamCity等。
提交代碼必須遵守以下原則:
1、查看構建是否成功,如果失敗,停下手頭的工作和團隊中的其他人一起修復。
2、如果構建且測試全部通過,就從版本控制庫中的代碼更新到自己的開發環境上。
3、在自己的修改上重新構建,運行所有的測試,確保在自己機器上的代碼都是正確的且工作正常。
4、如果本地構建成功, 再從版本構建庫中更新代碼到本地, 再做一次構建,如果成功的話,就提交本地的修改到版本庫中。
5、在遠程持續集成服務器上再次構建包含你的這次提交的構建結果(通常是自動的)。
6、如果構建失敗,就停下手中的事,在自己的開發機上修復這個問題后,再重新回到步驟3.。
7、構建成功,小慶祝一下,并開始下一項任務。
持續集成縮短從想法到商業價值實現的時間,減少時間和降低風險,增加反饋,改進負責交付的開發、測試和運維人員之間的協作關系。