熱門分類
載入中…
目錄0%

🐙 GitLab CI/CD 高階自動化:Pipeline Templates、Dynamic Environments 與 GitOps 佈署流程

    🐙 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 能力,讓任何專案都能快速、安全、自動地完成部署。

    🔗 分享這篇 LINE Facebook X

    沒有留言:

    字級