6 張圖帶你搞懂 CI/CD 流水線
在CI/CD和DevOps領域中,持續交付和持續部署是一個老生常談的話題。持續集成這個術語最早是在1994年由Grady Booch提出。微服務提出者Martin Flower在2014年發表的論文《Microservice》中也對軟件開發持續集成提供了可參考原則。
持續集成是借助工具對軟件項目進行持續的自動化的編譯打包構建測試發布,來檢查軟件交付質量的一種行為。而持續部署是基于持續交付的優勢自動將經過測試的代碼推入生產環境的過程。下文從細節描述了持續集成和持續部署各階段的關鍵步驟,以下是原文。
本文將探討CI(持續集成)/CD(持續部署)流程中的各個階段;以及從快速、規模交付的視角探討為什么CI/CD流水線對于我們的組織是必不可少的。
CI/CD流水線工作流包括CI/CD流程開始時所有階段等一系列步驟,負責創建自動、連貫的軟件交付模型。
通過CI/CD流水線,軟件研發可以實現從代碼簽入、測試、構建和部署直至生產階段都在流水線中向前推進。此概念之所以高大上,是因為一旦實施了流水線,就可以將其部分或全部自動化,從而加快開發流程并減少錯誤。換句話說,CI/CD流水線使企業可以更輕松地應對軟件的自動、快速、持續交付。
DevOps工程師經常會將CI/CD各階段的和其CI/CD流水線混淆。盡管不同的工具可以將每個復雜階段自動化完成分階段的CI/CD,但是整體CI/CD軟件鏈仍然可能由于不可避免的人工干預而中斷。因此我們首先需要了解CI/CD流程中的各個階段,以及從快速、規模交付的視角探討為什么CI/CD流水線對于我們的組織是必不可少的。
CI/CD 階段:理解參與者、流程、技術
企業應用程序開發參與者通常由開發人員,測試人員/QA工程師,運維工程師以及SRE(站點可靠性工程師)或IT運營團隊組成。他們緊密合作,目標是高質量軟件交付。CI/CD是兩個獨立過程的組合:持續集成和持續部署。下面列出了每個步驟中的主要步驟:
持續集成
持續集成(CI)是構建軟件和完成初始測試的過程。持續部署(CD)是將代碼與基礎設施相結合的過程,確保完成所有測試并遵循策略,然后將代碼部署到預期環境中。當然,許多公司也有自己特有流程,但主要步驟如下。
CI:代碼提交階段
-
參與者:開發工程師,數據庫管理員(DBA),基礎架構團隊 -
技術:GitHub,GitLab,SVM,BitBucket -
流程:代碼提交階段也稱為版本控制。提交是將開發人員編寫的最新代碼變更發送到代碼存儲庫的操作。開發人員編寫的代碼的每個版本都被無限期地存儲。在與合作者討論和審查變更之后,開發人員將編寫代碼,并在軟件需求、特性增強、bug修復或變更請求完成后提交。管理編輯和提交變更的存儲庫稱為源代碼管理工具(配置管理工具)。在開發人員提交代碼(代碼推送請求)后,代碼更改被合并到主線代碼分支中,這些主線代碼分支存儲在GitHub這樣的中央存儲庫中。
CI:靜態代碼檢查階段
-
參與者:開發工程師,數據庫管理員(DBA),基礎架構團隊 -
技術:GitHub,GitLab,SVM,BitBucket -
流程:開發人員編寫代碼并將其推送到存儲庫后,系統將自動觸發以啟動下一個代碼分析過程。開發過程中存在這種情況:提交的代碼可以構建成功,但在部署期間構建失敗。無論從機器還是人力資源的利用率而言,這都是一個緩慢而昂貴的過程。因此必須檢查代碼中的靜態策略。SAST(靜態應用程序安全性測試):SAST是一種白盒測試方法,可以使用SonarQube,Veracode,Appscan等SAST工具從內部檢查代碼,以發現軟件缺陷,漏洞和弱點(例如SQL注入等)。這是一個快速檢查過程,其中檢查代碼是否存在語法錯誤。盡管此階段缺少檢查運行時錯誤的功能,但該功能將在以后的階段中執行。
將額外的策略檢查加入自動化流水線中可以顯著減少流程中稍后發現的錯誤數量。
CI:構建
-
參與者:開發工程師 -
技術:Jenkins,Bamboo CI,Circle CI,Travis CI,Maven,Azure DevOps -
流程:持續集成過程的目標是提交的代碼持續構建為二進制文件或構建產物。通過持續集成來檢查添加的新模塊是否與現有模塊兼容,不僅有助于更快地發現bug,還有助于減少驗證新代碼更改的時間。構建工具可以根據幾乎所有編程語言的源代碼創建可執行文件或包(.exe,.dll,.jar等)。在構建過程中,還可以生成SQL腳本,配合基礎設施配置文件一起進行測試。簡而言之,構建階段就是編譯應用程序的階段。Artifactory存儲、構建驗證測試和單元測試也可以作為構建過程的一部分。
構建驗證測試(BVT)/冒煙測試/單元測試:
創建構建后立即執行冒煙測試。BVT將檢查所有模塊是否正確集成,以及程序的關鍵功能是否正常運行。這樣做的目的是拒絕嚴重損壞的應用程序,以使QA團隊不會在安裝和測試軟件應用程序步驟浪費時間。
在完成這些檢查后,將向流水線中執行UT(單元測試),以進一步減少生產中的故障。單元測試可驗證開發人員編寫的單個單元或組件是否按預期執行。
構建產物存儲:
一旦構建就緒,程序包就會存儲在稱為Artifactory或Repository工具的中央數據庫。隨著每天構建量的增加,跟蹤所有構建產物也會變得愈加困難。因此,一旦生成并驗證了構建產物,就將其發送到存儲庫進行存儲管理。諸如Jfrog Artifactory之類的存儲庫工具可用于存儲諸如.rar,.war,.exe,Msi等之類的二進制文件。測試人員可以從此處手動進行選擇,并在測試環境中部署構建產物以進行測試。
CI:測試階段
-
參與者:測試人員、QA -
技術:Selenium,Appium,Jmeter,SOAP UI,Tarantula -
過程:發布構建過程后的一系列自動測試將驗證代碼的準確性。此階段可幫助避免生產中的錯誤。根據構建的大小,此檢查可能持續數秒至數小時。對于由多個團隊提交和構建代碼的大型組織,這些檢查在并行環境中運行,以節省寶貴的時間并盡早將錯誤通知開發人員。
測試人員(或稱為QA工程師)基于用戶描述的測試用例和場景設置自動化測試用例。他們執行回歸分析、壓力測試來檢查與預期輸出的偏差。測試中涉及的活動有完整性測試、集成測試、壓力測試。這是一個高層次測試方法。在這個階段,可以發現開發人員忽視的某些代碼問題。
集成測試:
集成測試是使用Cucumber、Selenium等工具執行的,在這些工具中,單個應用程序模塊被組合起來并作為一組進行測試,同時評估其是否符合指定的功能需求。在集成測試之后,需要有人批準該組中的更新集應該移到下一個階段,這通常是性能測試。這個驗證過程可能很麻煩,但它是整個過程的一個重要部分。驗證這個過程業界有很多優秀的方案。
性能和壓力測試:
Selenium、JMeter等自動化測試工具也可執行性能和壓力測試,以檢查應用程序在面對高負載時是否穩定和性能良好。該測試流程通常不會在每個更新提交上運行,因為完整的壓力測試是長期運行的。當發布主要的新功能時,將對多個更新進行分組,并完成完整的性能測試。在單個更新被轉移到下一階段的情況下,流水線可能將金絲雀測試加入作為可選。
持續部署:Bake和部署
-
參與者:基礎架構工程師,SRE,運維工程師 -
技術:Spinnaker,Argo CD,Tekton CD -
過程:在測試階段完成之后,可以部署到服務器的標準代碼準備就緒。在部署到生產中之前,它們將被部署到產品團隊內部使用的測試環境或beta環境。在將構建移至這些環境之前,構建必須經過Bake和Deploy的子階段。這兩個階段都是Spinnaker所支持存在的。
CD:Bake
Baking是指在生產時使用當前配置從源代碼創建不可變的鏡像實例。這些配置可能是數據庫更改和其他基礎結構更新之類的事情。Spinnaker可以觸發Jenkins執行此任務,并且某些組織更喜歡使用Packer。
CD:部署
Spinnaker自動將已bake的鏡像發送到部署階段。這是將服務器組設置為部署到集群的位置。與上述測試過程類似,在部署階段將執行功能相同的過程。首先將部署移至測試階段,然后最終移至生產環境,以進行批準和檢查。這個處理過程可以由Spinnaker等工具支持。
CD:驗證
這也是團隊優化整個CI/CD流程的關鍵位置。因為現在已經進行了如此多的測試,所以失敗很少見。但是,此時必須盡快解決所有故障,以最大程度地減少對最終客戶的影響。團隊也應該考慮使流程的這一部分自動化。
使用藍綠部署、金絲雀分析、滾動更新等策略部署到產品。在部署階段,將監視正在運行的應用程序以驗證當前部署是否正確或是否需要回滾。
CD:監控
-
參與者:站點可靠性工程師(SRE)、運營團隊 -
技術:Zabbix、Nagios、Prometheus、Elastic Search、Splunk、Appdynamics、Tivoli -
過程:為了使軟件發行版具有故障安全性和健壯性,在生產環境中跟蹤發行版的運行狀況至關重要。應用程序監視工具將跟蹤性能指標,例如CPU利用率和發行版延遲。日志分析器將掃描由底層中間件和操作系統產生的大量日志,以識別行為并跟蹤問題的根源。如果生產中出現任何問題,將通知利益相關者以確保生產環境的安全性和可靠性。此外,監視階段可幫助組織收集有關其新軟件更改如何為收入貢獻的情報,幫助基礎設施團隊跟蹤系統行為趨勢并進行容量規劃。
持續交付(CD):反饋和協作工具
-
參與者:站點可靠性工程師(SRE)、運營和維護團隊。 -
技術:JIRA、ServiceNow、Slack、電子郵件、Hipchat。 -
過程:DevOps團隊的目標是更快地持續發布,然后不斷減少錯誤和性能問題。這是通過不時地通過發送電子郵件向開發人員、項目經理提供有關新版本的質量和性能的反饋。通常情況下,反饋系統是整個軟件交付過程的一部分。因此,交付中的任何更改都會頻繁地錄入系統,以便交付團隊可以對它采取行動。
總結
企業必須評估一個整體的持續交付解決方案,該解決方案可以自動化或促進上述這些階段的自動化。
文章轉載:DevOps技術棧
(版權歸原作者所有,侵刪)