學習目標
- 知道
.gitlab-ci.yml放在哪裡、什麼時候會被執行。 - 分得清楚 pipeline、stage、job、runner 四個名詞。
- 會在 GitLab 網頁上看 job 的執行紀錄。
觀念
| 名詞 | 意思 |
|---|---|
| pipeline | 一次 push(或手動、排程)觸發的整批工作 |
| stage | pipeline 裡的階段,同階段的 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.shhello是 job 名稱,可以自己取。image指定容器映像。請固定版本(alpine:3.22),不要用latest,不然哪天映像更新,pipeline 可能突然壞掉。script依序執行;任何一行回傳非 0,job 就失敗,後面的指令不會再跑。$CI_PROJECT_NAME、$CI_COMMIT_SHORT_SHA是 GitLab 內建的變數,Lv.4 會細講。
動手做
- 在 GitLab 建一個新專案,把本關的
.gitlab-ci.yml與hello.sh放進去(路徑照舊)。 - push 之後打開「Build → Pipelines」,點進
hello看紀錄。 - 故意把
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.shlv01-first-pipeline/hello.sh
lv01-first-pipeline/hello.sh
#!/bin/sh
# Lv.1 的小腳本:把指令寫在檔案裡,比塞在 YAML 裡好讀、好測
set -eu
echo "執行者:$(whoami),工作目錄:$(pwd)"
echo "這台 runner 的核心數:$(nproc)"
echo "第一關完成!"