🐙 GitLab CI/CD 高階自動化:Pipeline Templates、Dynamic Environments 與 GitOps 佈署流程
GitLab CI/CD 是目前最完整、可擴充性最高的 DevOps 平台之一。
大多數人只會撰寫基本的 .gitlab-ci.yml,但在企業或大型專案中,必須善用:
- Pipeline Templates(可重複使用)
- Dynamic Environments(動態部署)
- GitOps + Auto Deploy(自動佈署)
- Multi-stage pipelines(多階段)
- Environment-specific configs(依環境切換設定)
本文將用完整示例與架構圖,帶你從基礎到實戰,打造企業級 GitLab 自動化模式。
📌 一、Pipeline Templates:打造可重複使用的 CI 樣板
當你有多個專案,需要相同的 CI 流程(例如 build、test、scan、deploy), 最好的方式就是將 Pipeline 設計成「模組化」並被專案引入。
✔ 建立 CI 樣板(ci-templates/build.yml)
# templates/build.yml
.build_template:
image: docker:latest
services:
- docker:dind
script:
- docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA .
- docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA
✔ 專案主 CI 引入 Template
include:
- project: 'devops/ci-templates'
file: '/build.yml'
build:
extends: .build_template
這樣所有專案就能共享相同流程,達成「基礎 CI 平台化」。
📌 二、Dynamic Environments:真正的 PR Preview / Feature Testing
Dynamic Environment 可以為每個 branch 或每個 Merge Request 建立自己的獨立環境:
- 自動部署
- 自動建立子網域
- PR 合併後自動刪除
範例:每個 branch 自動建立對應環境
stages:
- build
- deploy
deploy_preview:
stage: deploy
script:
- helm upgrade --install app-$CI_COMMIT_REF_SLUG ./chart \
--set env=$CI_COMMIT_REF_SLUG
environment:
name: review/$CI_COMMIT_REF_NAME
url: https://$CI_COMMIT_REF_SLUG.example.com
only:
- branches
上例會讓每個 branch 自動建立: review/branch-name 的部署環境。
📌 三、使用 includes 切分多階段 Pipeline(大型專案最佳解)
可將 CI 分成多個部分:
.gitlab-ci.yml ci/ ├── build.yml ├── test.yml ├── security.yml └── deploy.yml
主 CI(簡潔清楚)
include: - local: 'ci/build.yml' - local: 'ci/test.yml' - local: 'ci/security.yml' - local: 'ci/deploy.yml'
因此大型團隊可以清楚分工,也提升 CI 版本控制的可讀性。
📌 四、GitOps 自動化佈署(ArgoCD / FluxCD)
傳統 CI/CD 是: CI build → CD deploy 直接推送到 Kubernetes
GitOps 的工作流程是: CI build → CI 更新 manifest → Git Repo → ArgoCD/Flux 自動同步部署
架構圖(ASCII)
+--------------+ +---------------------+
| GitLab | push | GitOps Repo (K8s) |
| (CI Build) +-------->+ deployment.yaml |
+--------------+ +---------+-----------+
|
v (auto-sync)
+-----------+
| ArgoCD |
+-----+-----+
|
v
+-----------+
| Kubernetes|
+-----------+
這種架構的好處:
- 零信任:CI 不需要直接操作 Kubernetes
- 環境狀態完全以 Git 為準(即 Infrastructure as Code)
- 可追蹤所有部署的歷史記錄
📌 五、範例:CI 自動更新 deployment.yaml(GitOps Workflow)
CI 更新版本號
update_manifest:
stage: deploy
image: alpine
script:
- sed -i "s/tag:.*/tag: $CI_COMMIT_SHORT_SHA/" k8s/deployment.yaml
- git config --global user.email "ci@example.com"
- git config --global user.name "gitlab-ci"
- git add k8s/deployment.yaml
- git commit -m "Update image tag to $CI_COMMIT_SHORT_SHA"
- git push origin HEAD:main
only:
- main
ArgoCD / Flux 就會自動把新版 deployment 部署到叢集。
📌 六、Multi-Stage Pipeline(Build → Test → Scan → Deploy)
stages:
- build
- test
- security
- deploy
build:
stage: build
script:
- docker build -t app:$CI_COMMIT_SHA .
unit_test:
stage: test
script:
- pytest
security_scan:
stage: security
script:
- trivy fs .
deploy_prod:
stage: deploy
script:
- helm upgrade --install app ./chart
only:
- tags
這是企業最常見的 CI/CD 階段分佈設計。
📌 七、Environment-Specific Config(不同環境自動切換設定)
常見需求:
- dev 使用 dev DB
- stage 使用 stage DB
- prod 使用專用設定
CI 中動態注入 Config
script: - if [ "$CI_ENVIRONMENT_NAME" == "production" ]; then export APP_ENV=prod; fi - if [ "$CI_ENVIRONMENT_NAME" == "staging" ]; then export APP_ENV=stage; fi - echo "Using environment: $APP_ENV"
📌 八、最佳實務總結(建議你使用這些)
- ✔ 使用 Pipeline Templates 管理共用流程
- ✔ 使用 include 切分大型 CI 文件
- ✔ 使用 Dynamic Environments 做 preview
- ✔ 使用 GitOps 自動化佈署(ArgoCD/Flux)
- ✔ 使用 Multi-stage pipelines 控制 CI 結構
- ✔ 使用 Environment-specific configs 分流設定
當你把 GitLab CI/CD 以「平台化」、「模組化」的方式建置之後, 就能達到企業級的 DevOps 能力,讓任何專案都能快速、安全、自動地完成部署。
沒有留言: