Gitlab CI 優(yōu)化實(shí)踐筆記

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ù)

通過 parallelmatrix 將同一 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/]

參考內(nèi)容

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容