1. 構(gòu)建緩存
cache 用于緩存流水線中的目錄內(nèi)容(常見如依賴安裝目錄),可跨 Pipeline、跨 Job、跨分支共享(當(dāng) key 相同時,如 main 與 dev 可共享同一緩存)。
-
key:當(dāng)前緩存的唯一標(biāo)識,類似 Vue 中
v-for的 key;key 不變則復(fù)用緩存,key 變化則丟棄舊緩存。 -
分支/Job 緩存隔離:用
files指定參與 key 計算的文件,根據(jù)文件 hash 判斷是否變更,hash 變化則緩存失效;可用prefix拼在 file hash 前,避免同一files在不同分支/Job 下長期不更新導(dǎo)致緩存一直不失效。 -
緩存內(nèi)容指定:
paths指定要緩存的目錄,配合key控制何時更新緩存。 -
未跟蹤緩存:
untracked: true表示緩存非 Git 跟蹤的內(nèi)容(如構(gòu)建產(chǎn)物);可配合paths限定只緩存哪些路徑。 - 緩存有效期:GitLab 有緩存清理策略,緩存不保證永久存在;Runner 更換也可能導(dǎo)致緩存失效。代碼中應(yīng)能處理緩存缺失(例如始終保留依賴安裝步驟)。
下面示例演示通過 key、paths 以及 key.files + prefix 的用法。
# 示例 1:按提交信息作為 key,paths 指定緩存目錄
cache:
key: ${GITLAB_COMMIT_MESSAGE}
# 可選 key 策略示例:
# ${CI_COMMIT_REF_SLUG} # 不同分支使用不同緩存
# ${CI_COMMIT_REF_SLUG}-${CI_JOB_NAME} # 不同分支、不同 job 使用不同緩存
# ${CI_JOB_NAME} # 不同分支的同一 job 共用一套緩存
paths:
- xxx/xxx
- node_modules
# 示例 2:緩存未跟蹤文件,僅緩存指定路徑
cache:
untracked: true
paths:
- xxx/xxx
# 示例 3:基于文件 hash 的 key,配合 prefix 做分支/Job 隔離
cache:
key:
files:
- package-lock.json # 以該文件 hash 參與 key 計算,文件變更則緩存失效
prefix: ${CI_JOB_NAME} # key 形式為 prefix-hash
paths:
- vendor/
2. 產(chǎn)物緩存
artifacts 用于保存 Job 的構(gòu)建產(chǎn)物(如編譯結(jié)果、配置文件、node_modules 等),供后續(xù) Job 下載使用。產(chǎn)物會占用 GitLab 服務(wù)端存儲,需注意設(shè)置過期時間。
build-web:
stage: build
script:
- 運(yùn)行腳本
artifacts:
path: dist/* # 構(gòu)建產(chǎn)物所在路徑
expire_in: 1 week # 產(chǎn)物保留時長,過期后清除;默認(rèn)約 30 天
3. 使用專用 Runner
通過 tags 指定 Job 只在帶對應(yīng)標(biāo)簽的 Runner 上執(zhí)行,實(shí)現(xiàn)精確調(diào)度,將資源密集型任務(wù)(如鏡像構(gòu)建、大體積編譯)放到專用 Runner,避免與共享 Runner 上的其他任務(wù)爭搶資源??勺远x標(biāo)簽(如 docker-build、gpu、node)并在部署 Runner 時配置。
build_job:
tags:
- docker-build # 僅在有此標(biāo)簽的 runner 上運(yùn)行
script: docker build ..
4. 并行任務(wù)
通過 parallel 的 matrix 將同一 Job 按維度拆成多個子 Job 并行運(yùn)行,常用于測試(如 unit、integration、e2e)或多環(huán)境組合,從而縮短總構(gòu)建時間。
# 單維度:按 TEST_SUITE 拆成 3 個并行 job
test:
script: ./run-tests.sh $TEST_SUITE
parallel:
matrix:
- TEST_SUITE: ["unit", "integration", "e2e"]
# 等價于:test:unit、test:integration、test:e2e 三個 job,繼承 test 的其余配置
# 多維度:TEST_SUITE × OS 共 4 種組合,并行執(zhí)行
test:
script: ./run-tests.sh $TEST_SUITE on $OS
parallel:
matrix:
- TEST_SUITE: ["unit", "e2e"]
OS: ["linux", "windows"]
# 組合為:unit+linux、unit+windows、e2e+linux、e2e+windows
5. 模板抽離復(fù)用
對重復(fù)出現(xiàn)的配置(如相同構(gòu)建命令、cache、artifacts),可抽成獨(dú)立模板文件,通過 include 引入、extends 繼承,使根目錄 .gitlab-ci.yml 更簡潔,并實(shí)現(xiàn)標(biāo)準(zhǔn)流程復(fù)用、降低維護(hù)成本。
- 以
.開頭的 job 名(如.build_template)不會單獨(dú)執(zhí)行,僅作為模板被其他 job 通過extends繼承;若不以.開頭,被include后該文件中的 job 會直接參與流水線執(zhí)行。 -
include 支持四種來源:
- local:項(xiàng)目內(nèi)路徑,相對當(dāng)前項(xiàng)目根目錄。
- file:其他項(xiàng)目的 YAML 路徑,實(shí)現(xiàn)跨項(xiàng)目配置共享。
- template:GitLab 內(nèi)置模板名稱。
- remote:通過 HTTP/HTTPS 拉取遠(yuǎn)程 YAML(需可公開訪問)。
- extends:在 job 下聲明要繼承的模板 job 名,合并后得到最終 job 配置。
下面示例:模板中定義腳本與 cache,主配置通過 include + extends 復(fù)用。
# .gitlab/ci-templates.yml
.build_template:
script: mvn clean package
cache:
key: maven-${CI_COMMIT_REF_SLUG}
paths: [.m2/]
# .gitlab-ci.yml
include:
- local: .gitlab/ci-templates.yml
# 或簡寫:include: .gitlab/ci-templates.yml
build-java:
extends: .build_template
# 展開后等價于:
# build-java:
# script: mvn clean package
# cache:
# key: maven-${CI_COMMIT_REF_SLUG}
# paths: [.m2/]