CI/CD 十關

LV.1/10

第一條 Pipeline

寫出第一個 .gitlab-ci.yml,看懂 pipeline、job、runner 的關係

基礎約 10 分鐘job、script、image

學習目標

  • 知道 .gitlab-ci.yml 放在哪裡、什麼時候會被執行。
  • 分得清楚 pipeline、stage、job、runner 四個名詞。
  • 會在 GitLab 網頁上看 job 的執行紀錄。

觀念

名詞意思
pipeline一次 push(或手動、排程)觸發的整批工作
stagepipeline 裡的階段,同階段的 job 會平行跑
job最小的執行單位:在一個容器裡跑一串指令
runner真正執行 job 的機器。本課程 Lv.1~Lv.9 用 gitlab.com 的共享 runner

只要 repo 根目錄有 .gitlab-ci.yml,每次 push 都會產生一條 pipeline。

範例解說

yaml
hello:
  image: alpine:3.22
  script:
    - echo "哈囉,GitLab CI/CD!"
    - sh lv01-first-pipeline/hello.sh
  • hello 是 job 名稱,可以自己取。
  • image 指定容器映像。請固定版本(alpine:3.22),不要用 latest,不然哪天映像更新,pipeline 可能突然壞掉。
  • script 依序執行;任何一行回傳非 0,job 就失敗,後面的指令不會再跑。
  • $CI_PROJECT_NAME、$CI_COMMIT_SHORT_SHA 是 GitLab 內建的變數,Lv.4 會細講。

動手做

  1. 在 GitLab 建一個新專案,把本關的 .gitlab-ci.yml 與 hello.sh 放進去(路徑照舊)。
  2. push 之後打開「Build → Pipelines」,點進 hello 看紀錄。
  3. 故意把 hello.sh 改成 exit 1,觀察 job 變紅、pipeline 失敗。

常見錯誤

  • YAML 縮排用了 Tab:YAML 只能用空白。可以先用「Build → Pipeline editor」的驗證功能檢查。
  • 檔名打錯:一定是 .gitlab-ci.yml,前面有點。
  • pipeline 一直 pending:沒有可用的 runner。gitlab.com 新帳號要先完成身分驗證才能用共享 runner。

下一關

Lv.2 把一個 job 拆成多個階段,讓建置、測試、部署分開執行。

範例檔案

資料夾 lv01-first-pipeline/ 的全部檔案。.gitlab-ci.yml 可以直接複製到自己的專案根目錄執行。

lv01-first-pipeline/.gitlab-ci.yml
lv01-first-pipeline/.gitlab-ci.yml
# Lv.1 第一條 Pipeline
# 最小的 .gitlab-ci.yml:只有一個 job。沒有寫 stages 時,job 預設放在 test 階段。
# 單獨使用:把這個檔案複製到自己專案的根目錄,命名為 .gitlab-ci.yml 即可。

hello:
  # image:job 在哪個容器裡執行。固定版本,不要用 latest
  image: alpine:3.22
  # script:依序執行的 shell 指令,任何一行回傳非 0 就算失敗
  script:
    - echo "哈囉,GitLab CI/CD!"
    - echo "專案:$CI_PROJECT_NAME,分支:$CI_COMMIT_REF_NAME,commit:$CI_COMMIT_SHORT_SHA"
    - head -2 /etc/os-release
    - sh lv01-first-pipeline/hello.sh
lv01-first-pipeline/hello.sh
lv01-first-pipeline/hello.sh
#!/bin/sh
# Lv.1 的小腳本:把指令寫在檔案裡,比塞在 YAML 裡好讀、好測
set -eu
echo "執行者:$(whoami),工作目錄:$(pwd)"
echo "這台 runner 的核心數:$(nproc)"
echo "第一關完成!"