
Jenkins X 重新構(gòu)思了云原生時(shí)代下的 CI/CD 實(shí)現(xiàn),這些想法受到了 DevOps 狀態(tài)報(bào)告和近來大熱的《Accelerate》一書的深刻影響,這本書的三位合著者分別是:Nicole Forsgren、Jez Humble以及Gene Kim。
經(jīng)年累月基于真實(shí)世界中的團(tuán)隊(duì)和組織收集上來的數(shù)據(jù)被 DevOps 領(lǐng)域的思想領(lǐng)袖和數(shù)據(jù)科學(xué)家們進(jìn)行了深入的分析?!禔ccelerate》一書總結(jié)了一組有助于實(shí)施 DevOps 的能力,這些能力被 Jenkins X 實(shí)現(xiàn)以幫助用戶以開箱即用的方式獲取到科學(xué)證明過的收益。我們會(huì)從已經(jīng)實(shí)現(xiàn)的能力項(xiàng)入手,并不斷整合更多的能力進(jìn)來。

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