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

🐙 GitLab CI/CD 最佳實務(進階篇):Artifacts、Cache、Stages、與安全性策略

    🐙 GitLab CI/CD 最佳實務(進階篇):Artifacts、Cache、Stages、與安全性策略

    GitLab CI/CD 是 DevOps 流程中的核心,「寫 .gitlab-ci.yml」只是起點。 要讓 CI/CD 跑得快、跑得穩、跑得安全,必須掌握 Artifacts、Cache、Stages、Runner、Variable、Rules、Deployment 等策略。

    本篇為 GitLab CI/CD 的「進階實務」,聚焦在團隊真正會用到的高階能力,包括:

    • 如何正確使用 Cache / Artifacts
    • 最佳的 Stages + Job 並行設計
    • 如何降低 Pipeline 時間(實際可減 40% 以上)
    • Runner 處理策略(Kubernetes / 裸機 / VM)
    • 部署 Secrets 與安全性管理
    • 更乾淨的 .gitlab-ci.yml 設計模式
    • 支援 GitOps、預設環境建立與青/藍部署

    📑 目錄


    一、Stages 設計:讓 Pipeline 又快又好維護

    建議最常用且通用的 Stage 分層如下:

    stages:
      - prepare
      - build
      - test
      - scan
      - package
      - deploy
    

    設計原則:

    • Stage 要抽象(功能層級),Job 要細緻(操作層級)
    • 同 Stage 內的 Job 全部並行,提高速度
    • Job 之間若有依賴,就應拆成不同 Stage
    • Deploy 只在必要分支執行(Rules 控制)

    二、Artifacts:跨 Stage 傳遞成果

    Artifacts 是 CI/CD 中「最重要的概念之一」: 用來在 Stage 與 Stage 之間傳遞「輸出檔案」。

    例如:

    • Build 產出的二進位檔給 Test 使用
    • Test 產出的測試報告給後續 Stage 使用
    • Build package 給 Deployment 使用

    ✔ 基本範例

    build:
      stage: build
      script:
        - npm run build
      artifacts:
        paths:
          - dist/
        expire_in: 1 week
    

    ✔ Artifacts 原則

    • 不要儲存巨量檔案(超過 1GB)
    • 只存 Deployment 真正需要的成果
    • expire_in 設定不要太久

    三、Cache:加速依賴與 Download

    Cache 與 Artifacts 最大差異:

    功能ArtifactsCache
    跨 Stage 傳檔
    加速 Pipeline
    會被 GitLab 儲存部分(視設定)

    常見 Cache 使用情境:

    • Node.js:node_modules/
    • Python:pip cache
    • Go:module cache
    • Maven、Gradle build cache

    ✔ Cache 範例

    cache:
      key: "$CI_COMMIT_REF_SLUG"
      paths:
        - node_modules/
    

    ✔ 最佳實務

    • 不要 Cache 太多檔案(空間爆炸)
    • Cache 要用 branch 為 key,避免互相覆蓋
    • 搭配 rules:changes,只在依賴變動時重新安裝

    四、Rules:避免 Pipeline 亂跑、節省成本

    很多人的 .gitlab-ci.yml 最大問題: 改一個 README.md,整個 CI/CD 全跑。

    建議透過 rules 控制:

    ✔ 例:只在 app/ 變動才執行 Build

    build:
      stage: build
      script: npm run build
      rules:
        - changes:
            - app/**/* 
    

    ✔ 例:Deploy 只在 main 分支執行

    deploy:
      stage: deploy
      script: ./deploy.sh
      rules:
        - if: "$CI_COMMIT_BRANCH == 'main'"
    

    ✔ CI/CD 成本省下 40% 的關鍵:

    • changes
    • if 分支條件
    • exists(檢查檔案存在才執行)

    五、Parallel / Matrix:提升速度(大量測試最佳解)

    支援許多語言的平行測試,例如:

    • Python pytest
    • Node jest
    • Go test
    • Java Maven / Gradle

    ✔ 用 parallel 平行跑測試

    test:
      stage: test
      script:
        - pytest -n $CI_NODE_TOTAL --dist=loadscope
      parallel: 4
    

    ✔ 用 matrix 做多環境建置

    build:
      stage: build
      parallel:
        matrix:
          - NODE_VERSION: ["18", "20"]
    

    六、GitLab Runner 架構:選 Kubernetes?VM?還是裸機?

    建議架構比較:

    類型優點缺點適用情境
    Kubernetes Runner 彈性最高、自動建立 Pod、可水平擴充 啟動速度較慢 雲環境、多團隊共享、動態資源需求
    VM Runner 穩定好管理、速度佳 需自行擴容 企業自建環境、固定規模
    裸機 Runner 速度最快、無虛擬化 overhead 維運成本高 高性能需求、AI/ML、大量編譯

    七、安全性策略:Variables、Protected、Secret

    ✔ 1. 永遠不要把密碼寫在 .gitlab-ci.yml

    ✔ 2. 使用 protected variables

    CI_REGISTRY_TOKEN=xxxx
    CI_DEPLOY_USER=xxxx
    

    ✔ 3. .gitlab-ci.yml 要避免明碼

    • Secrets 存 GitLab Variables
    • 所有 Deploy 只能在 protected branch 執行
    • 測試環境與正式環境分開 Variable Scope

    八、最佳 .gitlab-ci.yml 設計模式(可直接複用)

    ✔ 完整模板(建置 → 測試 → 掃描 → 部署)

    stages:
      - build
      - test
      - scan
      - deploy
    
    variables:
      NODE_ENV: production
    
    cache:
      key: "$CI_COMMIT_REF_SLUG"
      paths:
        - node_modules/
    
    build:
      stage: build
      script:
        - npm ci
        - npm run build
      artifacts:
        paths:
          - dist/
    
    test:
      stage: test
      needs: ["build"]
      script:
        - npm test -- --ci
    
    scan:
      stage: scan
      script:
        - npm audit --production
    
    deploy:
      stage: deploy
      rules:
        - if: "$CI_COMMIT_BRANCH == 'main'"
      script:
        - ./deploy.sh
    

    九、常見問題 FAQ

    ✔ Artifacts 與 Cache 差在哪?

    Artifacts 用於跨 Stage;Cache 用於加速 Pipeline。

    ✔ 什麼時候會想拆 Stage?

    當流程包含建置、測試、掃描、部署時必拆。

    ✔ 如何讓 CI 跑更快?

    用 Cache、平行執行、Rules 減少不必要的 Pipeline。


    — WWFandy・GitLab CI/CD 實戰筆記

    🔗 分享這篇 LINE Facebook X

    沒有留言:

    字級