CI/CD 管線——由提交到生產環境
一條 CI/CD 管線,畫在一張互動畫布上:提交、建置、測試、打包、部署到預備環境與生產環境,以及決定一次發布能否留下來的那些關卡。
CI/CD 把由一次程式碼提交走到生產環境的路徑自動化:持續整合會建置並測試每一次改動,持續交付則把它打包、部署,並以一道道關卡決定這次發布是否健康得足以留下來。
CI/CD 管線——由提交到生產環境
The interactive FlowJam canvas for this explanation — every lane, row and arrow above is a real QueryChart diagram you can open and edit.
How to read this visual
- 由左至右讀這五個直欄:提交、建置與測試、打包、部署、監控。
- 跟著這次改動橫過各條泳道:它離開開發者,由 CI 伺服器處理,停在產物倉庫,最後在部署目標上執行。
- 那兩個決策都是關卡——任何一處走「否」,都會把這次改動送去一個明確的失敗終點,而不是繼續向前。
建置與測試
「開發者提交程式碼」啟動整條流程,而「CI 伺服器建置這個應用程式」與「執行單元測試與整合測試」就是持續整合的工作:每一次提交都會獨立地編譯與測試一次。「所有檢查都通過了嗎?」正是令 CI 得名的那道關卡——一次失敗的提交會在「建置失敗——修正後重新提交」被攔下,還未有機會污染產物這條流。
打包與部署
「把產物打包並推送到產物倉庫」產生出那件不可變、有版本編號的建置成品——正正就是之後會執行的那一個。「部署到預備環境並執行冒煙測試」在一個貼近生產環境的地方驗證它,然後由「部署到生產環境」把它送出去。產物倉庫這條泳道就是交接之處:產物只建置一次,之後每一個階段都取用同一件,而這正是已部署的版本與已測試的版本完全相同的原因。
監控這道關卡
「部署之後健康嗎?」是最後一個決策:發布之後的指標、日誌與警報,決定結果是「發布已上線,並在監控之中」,還是「回滾到上一個正常的版本」。回滾被畫成一個真實的步驟,並回到那個健康的終點狀態,因為正是自動化的回滾令快速部署變得安全。
Key relationships and takeaways
- CI 是任何東西送出去之前的那道關卡:建置並測試每一次提交,在源頭就把失敗擋下來。
- 產物倉庫裡那件產物只建置一次,然後在所有地方執行——部署能否重現,就靠這一點。
- 預備環境在生產環境見到它之前,先在一個貼近生產的環境裡驗證這件產物。
- 部署之後是否健康才是真正的關卡——決定一次發布留不留下來的是監控,不是部署腳本。
- 一條沒有回滾的管線,並不適合自動化;這張畫布把回滾畫成一條頭等的路徑。
When to use this visual
- 在一支團隊動手建一條管線之前,先教會他們持續整合與持續交付的分別。
- 設計一條管線:那兩道關卡指出自動化應該在哪裡停下,而判斷(或者回滾)應該由哪裡開始。
- 覆核一條現有的管線——少了一道健康關卡,就等於一次發布在沒有任何決定之下執行。
運作方式
描出你實際的管線階段
把這些通用的階段換成你的 CI 真正會跑的那些——lint、容器建置、資料庫遷移、金絲雀發布——但要在任何東西送出去之前保留一道關卡。
寫上你的檢查項目
在測試那個方框上標註你實際執行的測試套件與保安掃描,以及「所有檢查都通過了嗎?」這道關卡除了單元測試之外還要求甚麼。
加上金絲雀那條分支
在預備環境與生產環境之間插入一個金絲雀步驟——把一小部分流量導向新版本,並在全面推出之前先看健康那道關卡。
把回滾寫清楚
在回滾那個方框上,註明它在你的系統裡實際做甚麼——重新部署上一個映像檔、還原一份資料庫備份——以及由誰或由甚麼觸發它。
常見問題
CI 與 CD 有甚麼分別?
持續整合(CI)是自動建置並測試每一次提交的做法,令問題在被引入的那一刻就浮現,而不是等到發布才發現。持續交付(CD)承接 CI 的輸出,把它通往部署的路徑自動化——打包、預備環境、發布——並由關卡決定甚麼時候才算安全。CI 是管線裡的第一道關卡,CD 則是它之後的一切。
關卡在一條 CI/CD 管線裡為甚麼重要?
因為自動化拿走了從前用來截住問題的那些人手檢查點。管線用一個個決策取代它們:測試那道關卡在一次失敗的建置送出去之前把它停下,健康那道關卡則在一次不良的發布送出去之後把它停下。圖解把兩者都畫成決策形狀,就是這個原因——一條管線可信到甚麼程度,取決於它的關卡。
回滾是甚麼?管線為甚麼需要它?
回滾就是當一次發布在部署之後失敗時,把系統退回上一個已知正常的版本。管線需要它,因為健康檢查並不完美,而生產環境出問題的方式往往是預備環境從未顯示過的。自動化的回滾正是令團隊可以頻繁部署的原因——一次不良發布的代價,變成一次還原,而不是一宗事故。
產物倉庫在當中扮演甚麼角色?
產物倉庫是管線建置出來的產物連同版本編號存放的地方。之後每一個階段——預備環境、生產環境、回滾——部署的都是倉庫裡那一件一模一樣的產物,而不是重新建置一次。這正是已部署的程式碼與已測試的程式碼完全相同的原因,也正是回滾安全的原因:上一個正常的版本仍然留在倉庫裡。
用 QueryChart(FlowJam)編輯這張圖解
把上面這張 CI/CD 畫布開啟為你自己的圖表——把各個階段改名為你自己的管線,並加上你真實的關卡。