環境、CI/CD 與部署
讓一份程式變成可重現的 artifact,並安全地送到正式環境
讓一份程式變成可重現的 artifact,並安全地送到正式環境
一份 Code 會經過哪些環境?
Local Development
→ CI Runner
→ Test / Integration
→ Staging / Pre-production
→ Production
每個環境的資料、權限、設定與容量可能不同。
Configuration 與 Secret
- Code 與環境設定分離
.env、environment variable、config file、secret manager- API key、password、certificate 不進 Git
- 不同環境使用不同 credential 與最小權限
- 設定變更也需要版本、審查與回復方式
Docker 解決什麼問題?
- 固定 runtime、system package 與啟動方式
- Image 是不可變的建置產物
- Container 是 image 的執行實例
- Volume 保存持久資料,network 連接服務
- Dockerfile、build context、layer 與 image registry
Build 與 Artifact
- Compile、bundle、package、containerize
- Lock dependency 與產生 SBOM
- Artifact 應不可變、可追溯、可重複部署
- Version、commit SHA、build number 與 checksum
- 同一份 artifact 從測試環境 promotion 到正式環境
Continuous Integration
push / PR
→ checkout
→ install dependencies
→ build、lint、test、scan
→ 產生 artifact 與報告
目標是盡快發現整合問題,而不是累積到發布前。
Pipeline、Job、Step 與 Runner
- Workflow/pipeline:完整自動化流程
- Job:可在不同 runner 平行或依序執行的單位
- Step:job 裡的單一操作
- Runner/agent:實際執行工作的機器或容器
- Artifact、cache、environment、approval、secret
Continuous Delivery 與 Deployment
| 名稱 | 差異 |
|---|---|
| Continuous Delivery | 每次變更都準備好發布,但正式上線可人工核准 |
| Continuous Deployment | 通過護欄後自動部署到 production |
自動化程度取決於風險、法規與復原能力。
Database Migration 的部署順序
- Forward-only migration 與 rollback script
- Expand:先加入新 schema,保持舊 Code 可用
- Migrate:搬移或 backfill 資料
- Contract:確認舊版本離開後再刪除舊 schema
- 部署前評估 lock、容量、時間與備份
常見 Deployment Strategy
| 策略 | 特性 |
|---|---|
| Recreate | 先停舊版再上新版,簡單但有中斷 |
| Rolling | 分批替換 instance |
| Blue-green | 新舊兩套環境切換流量 |
| Canary | 先讓少量流量使用新版 |
| Feature flag | 部署 Code 與開放功能分開 |
部署前後的檢查
- Pre-deploy checklist、approval 與 change window
- Health check、readiness、liveness
- Smoke test 與關鍵使用者流程
- 版本、設定、migration 與依賴確認
- 部署後 metrics、log、error rate 與 business KPI
Rollback 與 Roll Forward
- Rollback:切回上一個可用版本
- Roll forward:快速部署修正版
- Feature flag:關閉有問題的功能
- Database 與外部副作用不一定能單純倒退
- 事前定義 trigger、owner、步驟與驗證方式
Infrastructure as Code
- 用 Terraform、CloudFormation、Ansible 等描述環境
- Plan/diff 後再 apply
- Module、state、provider 與 drift
- 基礎設施變更進入 Git、PR、review 與 pipeline
- 高風險操作仍需權限隔離與人工核准
一次 Release 要能追溯
需求/issue
→ PR/commit
→ CI run/artifact
→ tag/release note
→ deployment
→ production verification
出問題時才能知道哪一份內容跑在哪個環境。
看到 Agent 部署時
要知道它正在 build、publish artifact、run migration、
promote release、deploy、smoke test,還是 rollback。