Jenkins X–(3)具備什麼樣的加速能力
- 2019 年 11 月 26 日
- 筆記

Jenkins X 重新構思了雲原生時代下的 CI/CD 實現,這些想法受到了 DevOps 狀態報告和近來大熱的《Accelerate》一書的深刻影響,這本書的三位合著者分別是:Nicole Forsgren、Jez Humble以及Gene Kim。
經年累月基於真實世界中的團隊和組織收集上來的數據被 DevOps 領域的思想領袖和數據科學家們進行了深入的分析。《Accelerate》一書總結了一組有助於實施 DevOps 的能力,這些能力被 Jenkins X 實現以幫助用戶以開箱即用的方式獲取到科學證明過的收益。我們會從已經實現的能力項入手,並不斷整合更多的能力進來。

1、對所有構件進行版本控制
來自 Weaveworks 的天才們創造了 GitOps 的概念,這一點我們非常認同。對環境的任何變更,無論是一個新的應用,版本升級,資源約束變更,還是簡單的應用配置,都應該在 Git 上提交一個 Pull Request ,並且採用類似環境的持續集成對這些變更進行驗證,並且經過團隊的審核,這個團隊負責所有相關環境的變更控制。於是針對一個環境的任何變更都可以被追溯並且達到受控狀態。
關聯的加速能力項:對所有生產構件進行版本控制
2、自動化部署過程
環境
Jenkins X 在安裝過程中會自動創建基於 Git 的環境,並且使用jx create environment命令來輕鬆地創建新的環境。此外,當通過quickstart(jx create quickstart)創建一個新的基於 Java 中 SpringBoot (jx create spring) 應用,或者導入已有應用(jx import)時,Jenkins X 都會自動幫你添加 CI/CD 流水線,並配置相關任務、git 程式碼倉庫、webhook 來啟用自動化部署流程。
Jenkins X 開箱即用地創建了永久的預發布和生產環境(這個是可配置的)以及一個 Pull Request 階段臨時使用的應用預覽環境。
預覽環境
在一個變更被合入主幹之前,我們希望儘可能的進行測試、安全、驗證和試驗工作。使用臨時動態創建的預覽環境,任何 Pull Request 都會生成有一個預覽版本被構建和部署,包括引用了公共庫的下游應用。這就意味著我們可以同任何關聯團隊進行程式碼評審,測試和更好的協作,來確認這次變更可以部署到生產環境。
Jenkins X 的終極目標是提供一種方式,幫助開發人員、測試人員、設計人員和產品經理來驗證將要合入主幹的變更完全符合預期。我們希望確信這次變更沒有對任何服務或特性帶來負面影響,並且按照預想的那樣來交付價值。
讓預覽環境變得真正有趣的是,當我們能夠在不同階段和成熟度的情況下進行 PR,也就是我們可以導入一定比例的真實生產環境流量,比如 beta 用戶。那麼我們可以分析此次變更的價值,並且使用假設驅動開發的方式運行多種自動化試驗。這會幫助我們更好的理解當變更推送給所有用戶時的效果。
關聯的加速能力項:培養和支援團隊試驗
使用預覽環境是導入自動化測試的絕佳方式。雖然 Jenkins X 支援這種方式,但是我們尚沒有針對預覽環境進行自動化測試的例子。一個最簡測試集合應該可以確保應用正常啟動,並且通過一段時間的 Kubernetes 的有效性(liveness)檢查。相關內容包括:
關聯的加速能力項:實施自動化測試
關聯的加速能力項:自動化部署過程
永久環境
在軟體開發中,我們習慣於在變更部署到生產環境之前在多套環境中驗證。儘管這看起來沒什麼問題,但是如果在真正合併到主幹之前,某些流程證明它並不合適,這就有可能導致其他變更的嚴重延遲。後續提交都會阻塞,並且緊急生產環境變更也同樣會被推遲。
Jenkins X 希望所有變更和試驗在合併主幹之前都經過驗證。變更在預發布環境中經過一段時間的驗證後在推送到生產環境,理想情況下使用自動化的方式。
Jenkins X 的默認流水線提供了環境間自動化部署的能力。它可以被訂製以適配你自己的 CI/CD 流水線要求。
Jenkins X 認為預發布環境應該儘可能的模擬生產環境,理想情況下使用服務網格技術導入真實生產數據來驗證真實行為。這同樣有助於預覽環境的變更部署,我們可以將其鏈接到預發布中的非生產服務。
關聯的加速能力項:自動化部署過程
3、使用主幹開發分支策略
《Accelerate》一書的研究發現那些使用短分支生命周期並基於主幹開發的團隊擁有更好的效能。這對於 Jenkins X 核心團隊成員而言再熟悉不過,所以 Jenkins X 通過配置 Git 倉庫和 CI/CD 任務即可輕鬆實現這個能力。
4、實施持續集成
Jenkins X 將 CI 視為一個變更經過 Pull Request 合入主幹前的驗證活動。自動化配置程式碼倉庫,Jenkins 和 Kubernetes 來提供開箱即用的持續集成功能。
5、實施持續交付
Jenkins X 將 CD 視為一個變更合入主幹後到線上環境運行的活動。Jenkins X 將發布流水線中的大部分環境自動化:
Jenkins X 建議使用語義化版本號。採用 Git 標籤來計算下一次發布版本,意味著無需在主幹分支中保存最新的版本號。當發布系統將最新的和下一次版本保存在 Git 倉庫中,這會讓 CD 變得困難,因為發布流水線中的變更會觸發一次新的發布,這會導致遞歸的發布觸發器。使用 Git 標籤可以避免這種情況來實現 Jenkins X 的完整自動化流程。
Jenkins X 會基於每一次針對主幹的變更自動創建一個發布版本,這個版本就是潛在部署到生產環境的版本。
6、使用松耦合的架構
Jenkins X 面向 Kubernetes 用戶,這讓它可以受益於多種雲的特性來設計和開發松耦合的解決方案。服務發現、容錯性、擴展性、健康檢查、滾動升級、容器編排和調度等僅僅是 Kubernetes 所帶來的部分能力。
7、賦能團隊的架構
Jenkins X 旨在幫助多語言的應用開發者。目前 Jenkins X 具備自動語言檢測能力的 quickstart 和自動化 CI/CD 配置,比如 Golang, Java, NodeJS, .Net, React, Angular, Rust, Swift 以及更多語言支援。這樣做也提供了一個持續性的工作方式來讓開發者更加專註於開發活動。
Jenkins X 同樣提供了很多插件,比如自動化度量數據收集和可視化工具:Grafana 和 Prometheus。集中化的度量可以幫助我們查看構建和部署在 Kubernetes 上的應用指標。
DevPods 是一個全新的特性,可以幫助開發人員在本地 IDE 中編輯程式碼,並自動化同步到雲環境上進行構建和重新部署。
Jenkins X 相信自動化可以幫助開發者在雲環境下進行試驗,使用不同的技術,並通過回饋讓他們更快的做出最佳決策。
參考:Jenkins X官網