持續集成、持續交付、持續部署(CI/CD)簡介

概述:

軟件開發週期中需要一些可以幫助開發者提升速度的自動化工具。其中工具最重要的目的是促進軟件項目的持續集成與交付。通過CI/CD工具,開發團隊可以保持軟件更新並將其迅速的投入實踐中。CI/CD也被認爲是敏捷開發的最重要實踐之一。


一 、持續集成

從上圖可以看到,持續集成應該至少包括以下幾部分:

  • 自動化構建Continuous Build
  • 自動化測試Continuous Test
  • 自動化集成Continuous Intergration
  1. 自動化構建

包括以下過程:

  • 將源碼編譯成爲二進制碼
  • 打包二進制碼
  • 運行自動化測試
  • 生成文檔
  • 生成分發媒體(例如:Debian DEB、Red Hat RPM或者Windows MSI文件)

所以,自動化構建,從功能角度分,最關鍵的是三部分:版本控制工具、構建工具、CI服務器。而其中最核心的又是構建工具。其他開源的、與持續集成相關的工具也有很多,但大多數是輔助性的工具。

(1)版本控制工具

有時,版本控制又稱爲配置管理(SCM),所以版本控制工具同時也是配置管理工具。在各類版本控制的開源軟件中,最著名的莫過於CVS、SVN(Subversion)、GIT三個了。
這三個工具各有千秋。其中,GIT支持離線工作,更適合開源軟件或者開發人員不能集中辦公情況下的版本管理工作。同時,SVN和GIT可以配合使用。

(2)構建工具

構建工具是持續集成的核心,它對源代碼進行自動化編譯、測試、代碼檢查,以及打包程序、部署(發佈)到應用服務器上。從配置管理工具上下載最新源代碼後,所有的後續工作幾乎都可以通過構建工具完成。
在java開發中,比較有名的構建工具就是Ant、Maven、Gradle。在PHP開發中,Phing(基於Ant)也比較有名。同樣的,Maven也可通過相關的PHP-Maven插件完成對PHP開發構建的支持。

(3)CI服務器

CI服務器的主要作用就是提供一個平臺,用於整合版本控制和構建工作,並管理、控制自動化的持續集成。
開源軟件中,比較有名的CI服務器包括Jenkins、CruiseControl、Continuum。而比較有名的商業化CI服務器是TeamCity、Bamboo、Pulse等。

(4)其他工具

很多工具可以通過與構建工具、CI工具相結合(當然,其中有很多工具也可以單獨工作),來完成更多的自動測試、報告生成等工作。根據工具不同,其具體的結合方法也不同,但大體都是通過插件形式進行結合的。例如:

  • Maven中通過依賴和plugin方式引入第三方工具
  • Jenkins主要通過各類插件引入第三方工具

這些工具種類實在太多,可以根據實際工作需要進行選擇。

2.自動化測試

自動化測試是持續集成必不可少的一部分,基本上,沒有自動化測試的持續集成,都很難稱之爲真正的持續集成。我們希望持續集成能夠儘早的暴露問題,但這遠非配置一個 Hudson/Jenkins服務器那麼簡單,只有真正用心編寫了較爲完整的測試用例,並一直維護它們,持續集成才能孜孜不倦地運行測試並第一時間報告問題。

測試自動化是使用特定的軟件(獨立於被測試的軟件)來控制測試的執行以及比較實際輸出與預期輸出。測試自動化可以將某些重複但必要的任務自動化,或者執行某些難以手動執行的額外測試。

自動化測試還包括單元測試、集成測試、系統測試、驗收測試、性能測試等,在不同的場景下,它們都能爲軟件開發帶來極大的價值。


二、持續交付

持續交付(Continuous Delivery, CD)是一種軟件工程的手段,讓軟件在短週期內產出,確保軟件隨時可以被可靠地發佈。其目的在於更快、更頻繁地構建、測試以及發佈軟件。通過加強對生產環境的應用進行漸進式更新,這種手段可以降低交付變更的成本與風險。一個簡單直觀的與可重複的部署過程對於持續交付來說是很重要的。

 持續交付流水線示意圖


三、持續部署

如圖所示,持續部署與持續交付之間的差異就是前者將部署自動化了。
在持續交付的實踐中,交付的目標是QA,但是實際上,軟件最終是要交付到客戶手上的。在SaaS領域裏,持續部署採用得比較廣泛,因爲服務比較容易做到靜默升級。
採用持續部署的前提是自動化測試的覆蓋率足夠高。
採用持續部署的好處是能減少運維的工作量,縮短新特性從開發到實際交付的週期。


四、CI/CD具體實現

常見CI/CD工具及其比較:

這裏的支持,意思應該是直接的支持,例如Jenkins,其實和git結合也很簡單,通過腳本就可以實現。


五、持續集成工具集之 Jenkins簡介

Jenkins 是一個可擴展的持續集成引擎。

1.主要用於:

  • 持續、自動地構建/測試軟件項目。
  • 監控一些定時執行的任務。Jenkins擁有的特性包括:

2.Jenkins擁有的特性包括:

  • 易於安裝-只要把jenkins.war部署到servlet容器,不需要數據庫支持。
  • 易於配置-所有配置都是通過其提供的web界面實現。
  • 集成RSS/E-mail通過RSS發佈構建結果或當構建完成時通過e-mail通知。
  • 生成JUnit/TestNG測試報告
  • 分佈式構建支持Jenkins能夠讓多臺計算機一起構建/測試。
  • 文件識別:Jenkins能夠跟蹤哪次構建生成哪些jar,哪次構建使用哪個版本的jar等。
  • 插件支持:支持擴展插件,你可以開發適合自己團隊使用的工具。

3.Jenkins的出現

目前持續集成(CI)已成爲當前許多軟件開發團隊在整個軟件開發生命週期內側重於保證代碼質量的常見做法。它是一種實踐,旨在緩和和穩固軟件的構建過程。並且能夠幫助您的開發團隊應對如下挑戰:

  • 軟件構建自動化 :配置完成後,CI系統會依照預先制定的時間表,或者針對某特定事件,對目標軟件進行構建。
  • 構建可持續的自動化檢查 :CI系統能持續地獲取新增或修改後簽入的源代碼,也就是說,當軟件開發團隊需要週期性的檢查新增或修改後的代碼時,CI系統會不斷確認這些新代碼是否破壞了原有軟件的成功構建。這減少了開發者們在檢查彼此相互依存的代碼中變化情況需要花費的時間和精力。
  • 構建可持續的自動化測試 :構建檢查的擴展部分,構建後執行預先制定的一套測試規則,完成後觸發通知(Email,RSS等等)給相關的當事人。
  • 生成後後續過程的自動化 :當自動化檢查和測試成功完成,軟件構建的週期中可能也需要一些額外的任務,諸如生成文檔、打包軟件、部署構件到一個運行環境或者軟件倉庫。這樣,構件才能更迅速地提供給用戶使用。

部署一個CI系統需要的最低要求是,一個可獲取的源代碼的倉庫,一個包含構建腳本的項目。

下圖概括了CI系統的基本結構:
4.使用Jenkins的一些理由:

該系統的各個組成部分是按如下順序來發揮作用的:

  • 開發者檢入代碼到源代碼倉庫。
  • CI系統會爲每一個項目創建了一個單獨的工作區。當預設或請求一次新的構建時,它將把源代碼倉庫的源碼存放到對應的工作區。
  • CI系統會在對應的工作區內執行構建過程。
  • (配置如果存在)構建完成後,CI系統會在一個新的構件中執行定義的一套測試。完成後觸發通知(Email,RSS等等)給相關的當事人。
  • (配置如果存在)如果構建成功,這個構件會被打包並轉移到一個部署目標(如應用服務器)或存儲爲軟件倉庫中的一個新版本。軟件倉庫可以是CI系統的一部分,也可以是一個外部的倉庫,諸如一個文件服務器或者像Java.NET、 SourceForge之類的網站。
  • CI系統通常會根據請求發起相應的操作,諸如即時構建、生成報告,或者檢索一些構建好的構件。

Jenkins就是這麼一個CI系統。之前叫做Hudson。

  • 是所有CI產品中在安裝和配置上最簡單
  • 基於Web訪問,用戶界面非常友好、直觀和靈活,在許多情況下,還提供了AJAX的即時反饋。
  • Jenkins是基於Java開發的(如果你是一個Java開發人員,這是非常有用的),但它不僅限於構建基於Java的軟件。
  • Jenkins擁有大量的插件。這些插件極大的擴展了Jenkins的功能;它們都是開源的,而且它們可以直接通過web界面來進行安裝與管理。

5.Jenkins的目標

Jenkins的主要目標是監控軟件開發流程,快速顯示問題。所以能保證開發人員以及相關人員省時省力提高開發效率。

CI系統在整個開發過程中的主要作用是控制:當系統在代碼存儲庫中探測到修改時,它將運行構建的任務委託給構建過程本身。如果構建失敗了,那麼CI系統將通知相關人員,然後繼續監視存儲庫。它的角色看起來是被動的;但它確能快速反映問題。

特別是它具有以下優點:

  • Jenkins一切配置都可以在web界面上完成。有些配置如MAVEN_HOME和Email,只需要配置一次,所有的項目就都能用。當然也可以通過修改XML進行配置。
  • 支持Maven的模塊(Module),Jenkins對Maven做了優化,因此它能自動識別Module,每個Module可以配置成一個job。相當靈活。
  • 測試報告聚合,所有模塊的測試報告都被聚合在一起,結果一目瞭然,使用其他CI,這幾乎是件不可能完成的任務。
  • 構件指紋(artifact fingerprint),每次build的結果構件都被很好的自動管理,無需任何配置就可以方便的瀏覽下載。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章