🐙 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 又快又好維護
- 二、Artifacts:跨 Stage 傳遞成果(Build → Test → Deploy)
- 三、Cache:加速編譯、依賴下載與重複工作
- 四、Rules:避免不必要的 Pipeline 浪費資源
- 五、Parallel 與 Matrix:大幅提升執行速度
- 六、Runner 架構:K8s、VM、裸機的選擇
- 七、安全性策略:Secrets、Variables、權限控管
- 八、最佳 .gitlab-ci.yml 設計模式
- 九、FAQ(搭配 JSON-LD)
- 🔗 延伸閱讀
一、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 最大差異:
| 功能 | Artifacts | Cache |
|---|---|---|
| 跨 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。
🔗 延伸閱讀
- 🐙 更多 DevOps / GitLab CI/CD 系列文章
- 🌐 Nginx 反向代理進階:Multisite、Rewrite、Caching、Load Balancing 全攻略
- 🐧 Linux 安全架構深度解析:SELinux、AppArmor、auditd、Fail2Ban
- 🐧 Linux LVM 與硬碟擴容完整教學:PV / VG / LV 擴充、縮減、線上擴容
- 🐧 Linux 系列完整導覽索引
— WWFandy・GitLab CI/CD 實戰筆記
沒有留言: