引言
CI/CD 是一種通過在應用開發階段引入自動化來頻繁向客戶交付應用的方法。CI/CD 的核心概念是持續集成、持續交付和持續部署。作為一種面向開發和運維團隊的解決方案,CI/CD 主要針對在集成新代碼時所引發的問題(亦稱:“集成地獄”)。
具體而言,CI/CD 可讓持續自動化和持續監控貫穿于應用的整個生命周期(從集成和測試階段,到交付和部署)。這些關聯的事務通常被統稱為“CI/CD 管道”,由開發和運維團隊以敏捷方式協同支持,采用的方法不是?DevOps?就是站點可靠性工程(SRE)。
一、CI/CD簡介:
1. 持續集成(CI)
CI是指在代碼倉庫中的每次提交都自動觸發構建和測試流程,確保新代碼與現有代碼的集成不會破壞應用的穩定性。現代應用開發的目標是讓多位開發人員同時處理同一應用的不同功能。但是,如果企業安排在一天內將所有分支源代碼合并在一起(稱為“合并日”),最終可能造成工作繁瑣、耗時,而且需要手動完成。這是因為當一位獨立工作的開發人員對應用進行更改時,有可能會與其他開發人員同時進行的更改發生沖突。如果每個開發人員都自定義自己的本地集成開發環境(IDE),而不是讓團隊就一個基于云的 IDE 達成一致,那么就會讓問題更加雪上加霜。
持續集成(CI)可以幫助開發人員更加頻繁地(有時甚至每天)將代碼更改合并到共享分支或“主干”中。一旦開發人員對應用所做的更改被合并,系統就會通過自動構建應用并運行不同級別的自動化測試(通常是單元測試和集成測試)來驗證這些更改,確保這些更改沒有對應用造成破壞。這意味著測試內容涵蓋了從類和函數到構成整個應用的不同模塊。如果自動化測試發現新代碼和現有代碼之間存在沖突,CI 可以更加輕松地快速修復這些錯誤。
2. 持續交付(CD)
CD建立在CI的基礎上,它的目標是自動化從構建到部署的整個交付過程,以便在任何時候都可以快速、可靠地將軟件推送到生產環境。
完成 CI 中構建及單元測試和集成測試的自動化流程后,持續交付可自動將已驗證的代碼發布到存儲庫。為了實現高效的持續交付流程,務必要確保 CI 已內置于開發管道。持續交付的目標是擁有一個可隨時部署到生產環境的代碼庫。
在持續交付中,每個階段(從代碼更改的合并,到生產就緒型構建版本的交付)都涉及測試自動化和代碼發布自動化。在流程結束時,運維團隊可以快速、輕松地將應用部署到生產環境中。
3. 持續部署(CD)
對于一個成熟的 CI/CD 管道來說,最后的階段是持續部署。作為持續交付——自動將生產就緒型構建版本發布到代碼存儲庫——的延伸,持續部署可以自動將應用發布到生產環境。由于在生產之前的管道階段沒有手動門控,因此持續部署在很大程度上都得依賴精心設計的測試自動化。
實際上,持續部署意味著開發人員對云應用的更改在編寫后的幾分鐘內就能生效(假設它通過了自動化測試)。這更加便于持續接收和整合用戶反饋。總而言之,所有這些 CI/CD 的關聯步驟都有助于降低應用的部署風險,因此更便于以小件的方式(而非一次性)發布對應用的更改。不過,由于還需要編寫自動化測試以適應 CI/CD 管道中的各種測試和發布階段,因此前期投資還是會很大。
二、CI/CD關鍵步驟:
- 代碼管理: 使用版本控制系統,如Git,確保代碼的版本和變更都能被追蹤。
- 自動化構建: 使用構建工具,如Jenkins、Travis CI等,自動化執行構建和單元測試。
- 自動化測試: 包括單元測試、集成測試和端到端測試,以確保代碼質量。
- 持續交付: 制定自動化的部署流程,使得每次通過CI的代碼變更都能快速而安全地部署到生產環境。
- 監控與反饋: 設置監控系統,追蹤應用性能和問題,同時建立反饋機制,及時發現并修復構建和部署的問題。
三、?Netflix Tech Stack (CI/CD Pipeline)
- 規劃:Netflix Engineering 使用 JIRA 進行規劃,使用 Confluence 進行文檔編寫。
- 編碼:Java 是后端服務的主要編程語言,而其他語言用于不同的用例。
- 構建:主要使用 Gradle 進行構建,并構建了 Gradle 插件以支持各種用例。
- 打包:將包和依賴項打包成 Amazon Machine Image (AMI) 進行發布。
- 測試:測試強調了生產文化對構建混沌工具的關注。
- 部署:Netflix 使用其自建的 Spinnaker 進行金絲雀發布部署。
- 監控:監控指標集中在 Atlas 中,使用 Kayenta 來檢測異常。
- 事故報告:根據優先級分派事故,使用 PagerDuty 進行事故處理。
四、常用的 CI/CD 工具有哪些?
CI/CD 工具可以協助團隊自動進行開發、部署和測試。有些工具專門處理集成(CI)方面的問題,有些工具負責管理開發和部署(CD)工作,而另外一些工具則專注于持續測試或相關功能。
針對 CI/CD 的最著名的開源工具之一就是自動化服務器 Jenkins。從簡單的 CI 服務器到完整的 CD 集線器,Jenkins 都可以處理。
在紅帽 OpenShift 上部署 Jenkins
Tekton Jenkins 是一個面向 Kubernetes 平臺的 CI/CD 框架,可通過容器為您提供標準的云原生 CI/CD 體驗。
在紅帽 OpenShift 上部署 Jenkins
除了 Jenkins 和 Tekton Pipelines,您可能想要研究的其他開源 CI/CD 工具包括:
-
Spinnaker,一個面向多云環境構建的 CD 平臺。
-
GoCD,一個側重于建模和可視化呈現的 CI/CD 服務器。
-
Concourse, “一個開源的持續作業器”。
-
Screwdriver,一個面向 CD 設計的構建平臺。
此外,團隊也可考慮使用托管式 CI/CD 工具,它們可從不同供應商處獲得。主流公共云提供商全部提供 CI/CD 解決方案,以及?GitLab、CircleCI、Travis CI、Atlassian Bamboo?及眾多其他工具。
此外,任何工具只要是 DevOps 的基本工具,就有可能屬于 CI/CD 流程的一部分。用于配置自動化(如?Ansible、Chef?和?Puppet)、容器運行時(如?Docker、rkt?和?cri-o)以及容器編排(如?Kubernetes)的工具嚴格來說不算是 CI/CD 工具,但它們也現身于許多 CI/CD 工作流中。
根據您首選的應用開發策略和云提供商,您可以采用多種不同的方法來實施 CI/CD。AWS 上的紅帽 ? OpenShift? 服務有多個選項可讓您自己的 CI/CD 工作流程變得更輕松,例如?Tekton 和 OpenShift Pipelines。通過使用紅帽 OpenShift,企業組織可以利用 CI/CD 跨多個本地和云平臺自動構建、測試和部署應用。
?