單元 6 · GitLab CI/CD

內建 pipeline 自動化 — GitLab CI/CD

GitLab 的招牌:CI/CD 是內建的,不必另找服務—— 寫一個 .gitlab-ci.yml,push 就自動跑測試、建置、部署。

核心概念 · Core Concepts

名詞意義
Pipeline一次完整的 CI/CD 流程(由 stages 組成)
Stage流程階段(build → test → deploy),依序執行
Job實際執行的任務,屬於某個 stage
Runner執行 job 的機器(可自架/共享)
Artifactjob 產出物(可傳給下一 stage)
Variable環境變數(含 CI/CD variables,類似 secrets)

第一個 .gitlab-ci.yml

放在專案根目錄:

.gitlab-ci.yml
stages:
  - test
  - deploy

test-job:
  stage: test
  image: node:20
  script:
    - npm ci
    - npm test

deploy-job:
  stage: deploy
  script:
    - echo "deploying"
  only:
    - main
解讀:push 後 GitLab 建一個 pipeline → test 階段先跑(node 映像環境執行 npm ci / npm test)→ 只有 main 分支才跑 deploy 階段。任一 job 失敗,pipeline 變紅。

Runners · 執行機器

GitLab CI 需要 Runner 執行 job。GitLab.com 提供共享 runner(免費額度), 自架 GitLab 則要自己裝 runner(在公司的機器上跑,程式碼不出公司)。

Runner 類型 · RUNNERS
Shared runners   # GitLab.com 提供,免費額度有限
Specific runners # 專屬機器,可指定標籤
Group runners    # 整個群組共用

gitlab-runner register   # 註冊一台 runner

Variables 與 Secrets

機密值用 CI/CD variables(Settings → CI/CD → Variables),不寫進 YAML。

使用變數 · VARIABLES
# 設定:Settings → CI/CD → Variables → 新增
# 名稱:DEPLOY_TOKEN

deploy-job:
  script:
    - echo "using $DEPLOY_TOKEN"  # 不要 echo 機密!
  rules:
    - if: '$CI_COMMIT_BRANCH == "main"'
內建變數:GitLab 提供大量 CI_* 內建變數(分支、commit、MR 資訊)。 rules: if 可用它們做條件控制。機密變數記得勾選「Masked」。

Job 的其他常用欄位

常用欄位 · KEYWORDS
image: python:3.12       # 執行環境
before_script: [pip install -r req.txt]   # job 前
artifacts:
  paths: [dist/]      # 產出物傳給下一 stage
cache:
  paths: [.npm/]       # 快取加速
when: on_success       # 失敗也跑:always
needs: [test-job]  # 跳過 stage 順序直接依賴

把 CI 接上 MR 門檻

在 MR 上,pipeline 結果會顯示(✔ / ✘)。結合保護分支設定「Pipelines must succeed」, CI 沒過就不能合併——品質第一道防線。

看完這頁你應該能說出:
  • Pipeline / Stage / Job / Runner 的關係。
  • 寫一份最小的 .gitlab-ci.yml。
  • Runner 的角色與自架 CI 的意義。
  • Variables 與內建 CI_* 變數的用法。
  • 如何用 pipeline 當合併門檻。

延伸閱讀