本章是全書最實戰的部分,透過一個完整的範例情境,從無到有建構出一條 CI/CD Pipeline,並逐步微調與重構。
Pipeline 的三個核心 Stage#
Build:建構#
- 編譯程式碼、打包產物
- Artifacts 是關鍵概念:Job 產出的檔案(如編譯後的 binary、測試報告)可透過 Artifacts 傳遞給下游 Stage
build:
stage: build
script:
- npm install
- npm run build
artifacts:
paths:
- dist/
expire_in: 1 hour設定
expire_in控制 Artifacts 的保留時間,避免佔用過多儲存空間。
短期的建構產物建議設為 1 小時或 1 天。
Deploy:部署#
- 將 Build Stage 產出的 Artifacts 部署到目標環境
- 支援多種部署方式:SCP 檔案傳輸、Docker 部署、Kubernetes 部署
- 一個 Stage 中可以包含多個 Job 並行執行,例如同時部署到多個環境
Test:自動化測試#
- 在部署後執行驗收測試,確認部署成功
- 可整合單元測試、整合測試、E2E 測試
Pipeline 的 Stage 順序(build ➡️ deploy ➡️ test 或 build ➡️ test ➡️ deploy)取決於你的策略。
書中先 deploy 再 test 的做法適合部署到 staging 環境後跑驗收測試的場景。
Pipeline 微調與重構#
多條 Pipeline#
當專案複雜度增加,你可能需要:
- Merge Request Pipeline:只在 MR 時觸發,跑快速的 lint + unit test
- Branch Pipeline:推送到特定分支時觸發完整的 build + deploy
- Scheduled Pipeline:排程執行的完整測試或安全掃描
條件觸發#
使用 rules 精確控制 Job 何時執行:
deploy-production:
stage: deploy
script:
- deploy.sh
rules:
- if: $CI_COMMIT_BRANCH == "main"
when: manual
- when: never
rules取代了舊版的only/except,提供更靈活的條件判斷。新專案建議直接使用rules。
Protected Variables#
敏感資訊(如部署金鑰、API Token)應使用 CI/CD Variables 存放,並標記為 Protected:
- Protected Variable 只會在 Protected Branch 或 Protected Tag 的 Pipeline 中被注入
- 確保 feature branch 的 Pipeline 無法存取正式環境的機密
永遠不要將密鑰寫在
.gitlab-ci.yml中。
即使你之後刪除了該行,Git 歷史紀錄仍然保留。
使用 CI/CD Variables 搭配 Protected + Masked 設定。
開發者的行動指南#
- 從最小可行的 Pipeline 開始:一個 Stage、一個 Job,確認能跑再逐步擴充
- 善用 Artifacts 傳遞建構產物:避免在每個 Stage 重複建構
- MR Pipeline 要快:開發者的 feedback loop 越短越好,MR Pipeline 應在 5 分鐘內完成
- 正式環境部署設為 manual:避免意外部署,由人工確認後再觸發
- 機密管理是第一優先:設定好 Protected Variables 後再寫部署腳本