隨着k8s成爲容器編排系統的事實標準,軟件構建/交付發生了很大的變化。也許你尚未體驗到歷史車輪前進的痕跡,但它確悄無聲息的一直前行。對於開發、運維人員 這也是一次小小的技術革命,既然是
革命
總有人(保守派)要爲此丟掉原有的奶酪,另一批人(激進的人士)或多或少出現一些彎道超車的機會,對於行業從業者來講既是機遇也是挑戰。傳統的運維、dba崗位需求將會越收越緊,開發再也不只侷限於產品邏輯開發,會不一樣程度的參與ci部分的建設。即ci會慢慢向研發端下沉,由運維提供構建規範。解放ci構建項目工程的自由度。
k8s以及(service mesh)服務網格的出現打破了互聯網構建、交付技術按部就班的腳步,從而實現不一樣以往的跨越(也能夠稱之爲技術進步)
本文ci/cd理念即是在這種行業背景下產生的(我的感悟)。git
現下的ci工具
在當今以用戶體驗爲主的互聯網生存環境下,先後端服務頻繁迭代將是常態,隨之而來的代碼頻繁併發性的構建將是常態。隨之而來的將是頻繁性、瞬時大併發量的構建工程任務。
常見的ci工具備jenkins、githubci、gitlabci、輕輕量級drone等。他們都是很好的開源工具,用各自的理念,高效處理以上狀態下的構建任務,其中jenkins是出現時間最先,插件最多的ci工具。githubci是github最近發佈 還處於beta狀態。gitlabci是在gitlab在8.0版本開始加入的功能。github
Drone:drone是一種基於容器技術交付的持續構建、交付系統,採用聲明式,其構建過程均可以是docker容器,採用yaml配置文件管理。 docker
對比發現 drone雖是雲原生的,可是不少功能並不完善,大量任務構建時效率差,而且是以git push 來觸發任務構建,這在大多數狀況下是合適的,可是極端狀況下,這種理念並不適合。須要有完善、規範的發佈體系來支撐
gitlab ci功能與gitlab深度耦合,而且不適合k8s環境下的構建交付後端
jenkins如今只是跟上了雲原生、k8s環境下構建、交付的腳步。並非真正意義上的聲明式構建工具
但其高效的master/agent方式,完善的文檔、pipeline的引入,讓它尚未落後他人。在其它ci工具沒有成熟、完善以前,jenkins仍是比較穩健的ci構建工具。安全
cd是什麼架構
cd即持續交付,是在ci的生產物上進行的通過ci流程的一系列操做後產生了最終的交付物,可是咱們怎麼交付給最終用戶使用呢,
交付過程當中如何作到對用戶無感知
交付過程如何作到發佈失敗對用戶沒有影響(或者說影響接近於0)
交付過程當中若是新版本有錯誤如何作到安全的版本回滾呢
cd便是在這一複雜狀況下誕生的。
在以用戶體驗爲中心的互聯網產品頻繁迭代, 開發時期咱們必需要接受失敗是一種常態、失敗是安全的、低影響的。
在此理念下咱們就知道了CD要作什麼,而不是關注於cd工具自己。
業界關於cd(持續交付)有如下實踐理念併發
自動化:這種理念下的交付對團隊的技術能力要求很強,須要完善的制度來輔助處理自動化下各類複雜狀況的出現。其流程上將ci部分的交付產物經過自動化測試用例檢測經過後,發佈到預發佈環境,而後再次進行預發佈環境的測試用例檢測、經過後進行生產環境灰度發佈、或者金絲雀發佈,第三次調用測試用例進行檢測。這3個環境的測試用例是否相同取決於項目工程的複雜性。若是生產環境的灰度發佈檢測經過,而且經受了小部分用戶的使用檢測沒有異常,那麼cd流程會繼續向前推動、逐步加量直至全量發佈完成新版本。在此期間各個環境若是測試失敗應該由cd根據測試用例返回的結果來進行項目工程回滾,返回上一穩健版本。
大中型公司、以及產品活躍用戶少的初創公司採用此模式,初創公司並非也具有完整的技術來支持,只是用戶數量少,發佈過程出現問題也不會對公司產品產生太大的影響。它們基本採用mini版本自動化發佈流程。運維
半自動化:這是在自動化cd基礎上爲了更加穩固、安全的發佈而作了一些妥協,放棄必定的敏捷性,提升發佈質量。與自動化不一樣的地方在於每一個環境的發佈完成以後,再由研發人員、測試人員對功能再次驗證後,再由發佈人員進行下一環境的發佈操做。以自動化測試爲主,人工測試爲輔。吸取了自動化的敏捷性、捨去人工重度參與的繁瑣性。這裏的發佈人員有多是開發,也多是該項目的測試人員。運維人員在此環境下的參與度弱化,主要負責基礎環境的優化、完善,敏捷性開發。ide