You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GitLab CI多Runner环境下重试测试阶段缓存为空问题求助

GitLab CI 重试单个阶段时缓存失效的解决方案

嗨,这个问题我太熟悉了!我之前在多Runner环境下也踩过同样的坑——单独重试Test阶段时,明明Build阶段已经生成过缓存,结果Test阶段还是找不到,根本原因是GitLab CI的缓存默认不会自动跨阶段/跨作业实例共享,得手动配置规则才行。

问题根源

GitLab CI的缓存本质上是和作业运行实例绑定的,默认情况下:

  • 如果你只重试Test阶段,它会启动一个全新的作业实例,不会自动关联之前Build阶段在另一个Runner上生成的缓存
  • 如果没指定统一的缓存key,缓存只会在同一个作业的多次重试间生效,跨阶段就直接失效了

解决办法:配置统一的共享缓存

你只需要给Build和Test阶段的作业设置相同的缓存key,并明确缓存的文件路径,就能让它们共享同一套缓存空间。这里给你修改后的配置示例:

stages:
  - build
  - test

# 全局缓存配置,让所有阶段的作业共享同一缓存
cache:
  key: "$CI_PROJECT_ID-$CI_COMMIT_REF_SLUG"  # 用项目ID+分支名作为缓存键,确保同分支的作业共用缓存
  paths:
    - node_modules/  # 替换成你实际需要缓存的依赖目录
    - dist/          # 替换成Build阶段生成的产物目录

build_step:
  stage: build
  tags:
    - docker
  script:
    - # 你的Build脚本,比如npm install、npm run build等

test_step:
  stage: test
  tags:
    - docker
  script:
    - # 你的Test脚本,比如npm run test等

进阶优化:缓存读写策略

如果你的缓存体积比较大,可以给不同阶段设置读写策略,提升效率:

  • Build阶段只负责推送缓存(生成后上传)
  • Test阶段只负责拉取缓存(避免意外覆盖)

修改后的配置如下:

stages:
  - build
  - test

build_step:
  stage: build
  tags:
    - docker
  cache:
    key: "$CI_PROJECT_ID-$CI_COMMIT_REF_SLUG"
    paths:
      - node_modules/
      - dist/
    policy: push  # 仅推送缓存,不读取(Build阶段本身不需要拉取之前的缓存)
  script:
    - # 你的Build脚本

test_step:
  stage: test
  tags:
    - docker
  cache:
    key: "$CI_PROJECT_ID-$CI_COMMIT_REF_SLUG"
    paths:
      - node_modules/
      - dist/
    policy: pull  # 仅拉取缓存,不推送(Test阶段不需要修改缓存)
  script:
    - # 你的Test脚本

额外注意事项

  • 确保所有Runner的缓存存储配置一致:如果用本地缓存,要保证所有Runner的缓存目录路径相同;如果用分布式缓存(比如S3、Redis),要确保所有Runner都能访问到同一存储源
  • Docker Runner要注意缓存的挂载路径,避免容器内路径和主机路径不匹配导致缓存无法读取
  • 缓存key可以根据你的需求调整,比如加上环境变量区分不同环境(测试/生产)

这样配置后,下次再重试Test阶段时,就能正常拉取到Build阶段生成的缓存了!

内容的提问来源于stack exchange,提问作者novak Li

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:21:36