持續集成CI(Continuous Integration):持續集成是一種軟件開發實踐,即團隊開發成員經常集成他們的工作,通常每個成員每天至少集成一次,也就意味著每天可能會發生多次集成。每次集成都通過自動化的構建(包括編譯,發布,自動化測試)來驗證,從而盡快地發現集成錯誤。
集成問題會導致大量的返工,包括不得不通過手動合并解決變更沖突,以及多名開發人員共同解決導致自動化測試或手動測試失敗的合并問題。因為在傳統的開發模式里,代碼集成工作通常發生在項目末期,所以在集成工作消耗過多時間時,我們不得不為了按時發布而偷工減料。這會導致另一個惡性循環:既然合并代碼如此痛苦,那么大家就索性減少合并次數,而這會使未來的合并工作更加令人痛苦。
持續集成旨在通過將合并代碼融入日常工作來解決這個問題。以下圖說明持續集成的流程:
開發人員通將代碼變更提交到版本控制倉庫,觸發CI系統,CI服務器立即對代碼進行構建、單元測試,輸出結果,從而可以確定新代碼是否可以和原有代碼正確的集成在一起。
持續交付(Continuous Delivery):持續交付是指所有開發人員都在主干上進行小批量工作,或者在短時間存在的特性分支上工作,并且定期像主干合并,同時始終讓主干保持可發布狀態,并能做到在正常的工作時間段里按需進行一鍵式發布。
開發人員在引入任何回歸錯誤時(包括缺陷、性能問題、安全問題、可用性問題等),都能快速得到反饋。一旦發現這類問題,就立即加以解決,從而保證主干始終處于可部署狀態。
以下圖說明持續交付流程圖:
持續交付在持續集成的基礎上,自動將代碼在類生產環境中進行測試,也就是說項目開發人員在提交代碼后,在通過集成、構建、單元測試后,還會進行自動化的類生產環境測試,以確保當代碼部署到生產環境后可以正常工作。至此,我們的代碼就隨時處于可部署狀態。
持續部署(Continuous Deployment ):在持續交付的基礎上,由開發或運維人員自助式地定期像生產環境部署優質的構建版本,這通常意味著每人每天至少做一次生產環境部署,甚至每當開發人員提交代碼變更時,就觸發一次自動化部署。
以下圖說明持續部署流程圖:
通過將代碼部署過程自動化,從而實現從開發人員從提交代碼到編譯、測試、部署的全流程不需要人工的干預,加快代碼提交到功能上線的速度。從而使開發人員快速看到客戶對新特性的滿意度,并且能夠快速修復故障而不必等運維人員提交故障單。
通常自動化部署必須具備以下條件:
-? ? 保證在持續集成階段構建的軟件包可以部署到生產環境;
-? ? 使生產環境的就緒情況一目了然;
-? ? 為能在生產環境中部署的任何代碼,建立一鍵式和自助式的發布機制;?
-? ? 自動記錄審計和合規管理所需的相關內容,包括在哪臺機器上運行了命令,運行了什么命令,是誰授權的,以及結果如何;
-? ? 通過冒煙測試驗證系統正常工作,并且數據庫連接字符串等配置正確;
-? ? 為開發人員快速提供反饋,使他們能夠盡快了解部署結果(例如部署是否成功,應用是否能在生產環境正常運行等等)。
總結:從上述定義可知,持續集成是持續交付的前提條件,而持續交付是持續部署的前提條件。通過將集成和部署融入日常工作,能夠大大縮短集成時間,降低集成的復雜度,并把部署時間從幾個月縮短到幾分鐘,使我們能夠快速地向客戶交付價值,同時避免意外事故和服務中斷。