CI/CD
What?
CI/CD 是指 Continuous Integration 和 Continuous Deployment 的縮寫,是一種軟體工程的流程或方法。簡單地說,CI/CD 是用來自動化軟體的整合、測試和部署過程,目的是提高開發效率和產品品質。它不僅減少了人為錯誤,也讓程式碼從撰寫到上線變得更快、更穩定。
舉個例子,假設你是一個開發者,你每天都在修改程式碼。如果沒有 CI/CD,每次修改後你都得手動測試每個功能,確認沒有出問題,再自己部署到伺服器。這不僅耗時,還很容易因為疏忽導致錯誤。而透過 CI/CD,你可以自動化這些重複工作,讓系統幫你執行所有繁瑣的流程。
Who?
CI/CD 的主要使用者是開發者、測試工程師,以及 DevOps 團隊。此外,它也會影響企業的 IT 部門及最終使用者。以下是角色分類:
- 開發者:負責撰寫程式碼並提交至版本控制系統(如 Git),CI/CD 會接著執行整合與測試。
- 測試工程師:設計自動化測試案例以確保品質。
- DevOps 團隊:設定 CI/CD pipeline 並維護相關工具。
- IT 部門:負責管理基礎架構或伺服器環境。
- 使用者:最終受益於更穩定且快速交付的產品。
實際情境中,例如在一個大型電商平台上,如果有新的功能要推出,就需要多方協同透過 CI/CD 確保更新能夠順利進行,而不影響現有功能。
When?
CI/CD 最常被使用在以下時間點:
- 程式碼提交後:當開發者將新程式碼 push 到版本控制系統時,CI 會立即開始進行編譯與測試。
- 功能完成後:當某項功能完成並準備交付時,CD 會負責將其部署到 staging 或 production 環境。
- 持續交付需求高時:例如敏捷開發團隊,每天都有新功能或修正需要上線。
換句話說,只要你的專案需要頻繁更新,都可以依賴 CI/CD 來提高效率。例如,一個手機 App 每週都要更新新版本,就非常適合導入 CI/CD 流程。
Where?
CI/CD 通常出現在以下架構或工具鏈中:
- 版本控制系統(如 GitHub, GitLab):管理原始碼變更。
- CI 工具(如 Jenkins, CircleCI):執行自動化編譯與測試流程。
- CD 工具(如 ArgoCD, Spinnaker):負責部署到不同環境。
- 雲端基礎架構(如 AWS, GCP, Azure):作為應用程式運行的平台。
例如,在一個微服務架構中,每個服務可能有獨立的 CI/CD pipeline,用於確保獨立部署和更新。
Why?
CI/CD 最主要解決的是「重複性工作」和「交付速度」問題,同時提升軟體品質。以下是它解決的問題:
-
減少人為錯誤
自動化流程避免了手動操作可能產生的疏漏,例如忘記執行某些步驟。 -
加速交付週期
每次提交的新版本都能快速整合、測試並準備好部署,提高交付效率。 -
提升穩定性
所有變更都經過標準化管道處理,可以迅速回溯問題來源。例如,如果某次更新造成應用崩潰,可以立即找到是哪段程式碼出了問題。 -
增強協作性
開發與運維團隊之間藉由共享 pipeline 和標準化流程避免溝通障礙。例如,「我的代碼已經通過所有測試,你可以放心部署」。
How?
🛠️ 建立階段
建立 CI/CD pipeline 的一般步驟如下:
-
設定版本控制
- 使用 Git 等工具管理原始碼變更,例如建立分支策略(Branch Strategy)。
-
定義 Pipeline
- 編寫 YAML 或其他格式的配置檔案,用於描述整合、測試和部署步驟。例如:
steps:- name: Buildrun: mvn compile- name: Testrun: mvn test- name: Deployrun: kubectl apply -f deployment.yaml
- 編寫 YAML 或其他格式的配置檔案,用於描述整合、測試和部署步驟。例如:
-
整合工具
- 選擇適合的 CI 工具,如 Jenkins 或 CircleCI,自動觸發 pipeline 執行。
-
配置 CD 環境
- 使用 Kubernetes 或 Docker 等技術設定 staging 和 production 環境,以便自動部署應用程式。
🔍 查詢階段
查詢階段通常用於監控 pipeline 執行情況以及排除故障。以下是查詢流程:
-
檢視 Pipeline 狀態
- 在 Jenkins UI 或 GitLab 中查看各階段是否成功完成,例如「編譯失敗」或「單元測試未通過」。
-
分析 Log 資料
- 查看詳細日誌找出錯誤原因,例如:
[ERROR] Test case failed at line 42...
- 查看詳細日誌找出錯誤原因,例如:
-
回溯版本歷史
- 利用 Git log 比對哪次提交引入了問題。例如:
git diff HEAD~1 HEAD src/main.java
- 利用 Git log 比對哪次提交引入了問題。例如:
-
修復並重新觸發 Pipeline
- 修正代碼後重新 push 至分支以觸發重新執行 pipeline。
補充說明
🔧 關鍵技術工具
| 功能 | 工具名稱 | 特點 |
|---|---|---|
| 版本控制 | GitHub, GitLab | 協作方便 |
| 持續整合 (CI) | Jenkins, CircleCI | 高度可擴展 |
| 持續部署 (CD) | ArgoCD, Spinnaker | 支援多種雲端平台 |
| 容器技術 | Docker, Kubernetes | 提供隔離環境 |
📌 範例比較
| 測試案例數量 | 平均 Pipeline 時間 |
|---|---|
| 小型專案 (10 個) | 約 5 分鐘 |
| 大型專案 (100 個) | 約 20 分鐘 |
🧠 延伸/常見誤解
誤解一:「只有大型專案才需要導入 CI/CD」
事實上,小型專案也能從中受益。例如,即使是一個簡單網站,也可透過自動化部署節省時間成本。
誤解二:「CD 就等於直接上線」
其實還包括 staging 環境的驗證,不一定每次都直接推送到 production 環境。有些公司甚至會手動審核部分關鍵步驟,例如重大功能上線前的人力確認。