cover

CI 管品質,CD 管交付 — 自動化不是奢侈品,是生存必需品。

先講結論

CI(持續整合)確保每次提交的程式碼品質過關;CD(持續交付/部署)確保品質過關的程式碼能順利上線。自動化會不會有問題?肯定會,但跟手動出錯比起來,真的是長痛不如短痛。

CI 在做什麼?

CI 就是在程式碼合併之前建立的檢查流程。你的程式碼要通過以下關卡才能進入下一階段:

  • Commit 訊息格式檢查
  • 程式碼風格檢查(Linter)
  • 程式碼品質檢測(SonarQube 之類的)
  • 編譯打包(Java 等需要 compile 的語言)
  • 自動化測試
  • 容器映像檔建立和推送

這些事情如果每次都手動做,累死不說,遲早會漏掉。所以用自動化工具:GitLab 用 .gitlab-ci.yml,GitHub 用 GitHub Actions。

CI 的核心目標其實不是「讓部署變快」,而是萬一要 rollback 的時候,盡可能避免失誤造成災害擴大

CD 分兩種

  • Continuous Delivery(持續交付):自動跑完 CI 後,產出可部署的版本,但上線需要人手動觸發
  • Continuous Deployment(持續部署):CI 過了就自動上線,完全不用人介入

CI 的重點在「如何做出完整版本」,CD 的重點在「如何釋出這個版本」。

部署成熟度五級

你的團隊在哪一級?

Level 1 - 手動部署:直接 SSH 到機器上 git pull,需要 compile 就在機器上跑。Load Balancer 不能在部署時轉導到該機器。修不好就 git checkout 上一版。聽起來就很刺激對吧。

Level 2 - 容器化但沒分離:用 docker pull 指定版本部署。DB + file 都在 image 裡,拉版可能要 10 分鐘以上。多台機器要一台台拉。

Level 3 - 容器化 + 資料分離:因為資料分離,容器變小了,拉版 5 分鐘內搞定。這一步是全自動化的地基。

Level 4 - 加入 Pipeline:打包和運行分離,用 GitLab/GitHub 的 Pipeline 控制部署流程。雖然 env config 很多,但比手動進機器好管理太多了。

Level 5 - K8s + Runner:部署全靠 K8s YAML 控管,版本看 image tag。學習曲線比較陡,但到了這一級基本上就是全自動了。

我的建議

對整個系統的每個環節有所瞭解,才有辦法讓它轉為自動化。如果你連手動部署的步驟都搞不清楚,自動化只會讓事情更糟。先手動做一遍,搞懂每個步驟,再來想自動化。


「我覺得手動比較保險」— 這句話通常出自從來沒被手動部署搞過的人。自動化是條不歸路,但你不會想回頭。


延伸閱讀