● 前言
在 Day 17~18,我們已經完成了兩大基礎:
- 🔸 Terraform:自動化建立基礎架構(VPC / K8s Cluster / Namespace)
- 🔸 Helm:將應用程式打包成 Chart,讓部署可參數化、可重複
今天,我們要把這些元件拉進 CI/CD 管線,實現完整的 DevOps 範例:
- 🔸 PR → Plan(預覽部署)
- 🔸 Merge → Apply(部署)
- 🔸 自動 Smoke Test(服務可用性檢查)
- 🔸 出包可一鍵 Rollback(Helm / Git)
● 核心觀念
-
IaC 一條龍:Terraform 與 Helm 都要走流水線,避免「手動 apply」的落差
-
環境隔離:dev/staging/prod 使用不同 tfvars/values.yaml,避免污染
-
狀態與密鑰管理:Remote State(S3/GCS/Blob 或 Terraform Cloud)+ Secrets / OIDC 取代硬寫金鑰
● 實作步驟
1. 啟動 Minikube
minikube start
kubectl config current-context # 確認是 minikube
2. 準備所需檔案
專案結構:

3. Helm 檢查語法與預渲染
helm lint charts/app
helm template hello charts/app \
-f charts/app/values.yaml \
-f charts/app/values.dev.yaml
👉 確保 Chart 本身能正確渲染,不會生成壞掉的 YAML。
4. Terraform 初始化 & 部署
terraform -chdir=deploy/terraform init
terraform -chdir=deploy/terraform plan -var-file=envs/dev.tfvars
terraform -chdir=deploy/terraform apply -auto-approve -var-file=envs/dev.tfvars
5. 驗證部署結果
kubectl -n demo get pods,svc
kubectl -n demo port-forward svc/hello-app-app 8080:80

👉 瀏覽 http://localhost:8080

6. CI/CD 串接
-
CI(Pull Request 驗證)
- 🔸 helm lint/template:擋掉語法錯誤
- 🔸 terraform fmt/validate/plan:確保 IaC 健康
- 🔸 PR 階段僅「預演」,不會真的部署
-
CD(主線自動部署)
- 🔸 push 到 main → Actions 啟動
- 🔸 在 pipeline 裡起一個 kind cluster → terraform apply
- 🔸 自動佈署 Helm Release
- 🔸 部署後跑 Smoke Test(等 Pod ready)
-
回滾
- 🔸 Helm rollback:快速回到上個版本
- 🔸 Git revert + terraform apply:IaC 保證狀態一致
7. Smoke Test
部署後立即檢查:
kubectl -n demo rollout status deploy/hello-app-app --timeout=120s
kubectl -n demo get svc hello-app-app
✅ 確保服務可用,CI/CD pipeline 才算通過。
● 總結
今天我們把 Terraform + Helm 拉進 CI/CD,形成完整閉環:
- 🔸 IaC 一條龍 → 基礎建設與應用都版本控
- 🔸 自動化驗證 → Lint、Template、Plan、Smoke Test
- 🔸 環境隔離 → dev/staging/prod 配置檔分離
- 🔸 快速回滾 → Helm rollback 或 Git revert
這就是從 基礎設施層(Terraform) 到 應用部署層(Helm) 的「無縫串接」。
👉 下一篇
Day 20|Observability 全面監控:Prometheus × Grafana × ELK