Gitlab Runner CI/CD缓存异常:部分Job无法读取node_modules
解决GitLab Runner缓存部分Job失效问题
排查方向及解决方案
1. 核对缓存键一致性
- 检查CDK Job是否存在自定义缓存配置,覆盖了全局基于
pnpm-lock.yaml生成缓存键的规则。比如个别Job可能额外引入了CI_JOB_NAME、NODE_VERSION这类变量到缓存键中,导致和Lint Job的缓存键不匹配。 - 对比CDK Job与Lint Job日志中的缓存键字段,确认两者完全一致。
2. 验证缓存内容完整性
- 在
.pre阶段的安装Job末尾添加命令,确认缓存目录内容:ls -la node_modules/ ls -la .pnpm-store/ - 在CDK Job拉取缓存后立即执行同样的目录查看命令,排查是缓存未拉取到,还是后续步骤误删了依赖文件。
3. 解决并发缓存竞争问题
- 由于Runner并发数设为4,可能出现
.pre阶段缓存未完成推送,CDK Job就提前拉取到不完整缓存的情况。临时将并发数改为1测试,若问题消失:- 给CDK Job添加依赖,确保其在
.pre阶段安装Job完成后再执行,示例:cdk-job: stage: deploy needs: [.pre] # 其他配置
- 给CDK Job添加依赖,确保其在
4. 调整pnpm缓存策略
- pnpm的
node_modules依赖于.pnpm-store的硬链接/符号链接,直接缓存node_modules可能导致恢复时链接失效。改用以下流程:.pre阶段:执行pnpm install后,运行pnpm store prune清理冗余缓存,仅缓存.pnpm-store- 其他Job:执行
pnpm install --offline,通过本地缓存的.pnpm-store恢复依赖
5. 检查缓存存储权限与访问性
- 若使用本地缓存,检查Runner节点上缓存目录的读写权限,确保CDK Job的运行用户拥有访问权限。
- 若使用远程缓存(如对象存储),确认CDK Job所在Runner节点能正常访问缓存服务,无网络或权限限制。
内容的提问来源于stack exchange,提问作者Matt Gallik
相关产品推荐
相关产品推荐

