GitLab-runner CI任务偶发失败报错shallow file has changed如何解决
错误原因
这个fatal: shallow file has changed since we read it是Git浅克隆场景下的典型报错,触发逻辑如下:
- 你使用的GitLab Runner默认开启了浅克隆配置(日志中明确标注
git depth set to 50),浅克隆的仓库会在.git/shallow文件中存储截断的提交记录信息 - Git读取该文件时会先记录文件的元数据(修改时间、inode等),读取完内容后会再次校验元数据,如果元数据发生了变化就会抛出该错误
- 你的场景中,pre-clone脚本会递归修改整个工作目录(包含
.git目录下所有文件)的权限,修改权限的操作会更新文件元数据,刚好和Runner内部执行Git初始化、读取shallow文件的操作触发了校验冲突;同时你使用的GitLab Runner 13.12版本、NixOS 21.05自带的Git版本存在相关逻辑缺陷,会放大该偶现问题的发生概率。
解决方案
你可以根据自己的场景选择以下任意一种或多种配置规避该问题:
- 调整pre-clone脚本范围:修改脚本仅修改工作目录中非.git目录的权限,避免触碰Git仓库内部文件的元数据,参考修改后的脚本:
find . -path ./.git -prune -o -exec chmod u+rwX {} +
- 关闭浅克隆:在CI/CD变量中配置
GIT_DEPTH=0,执行完整克隆,不再生成shallow文件,从根源消除该报错 - 每次任务全新克隆:在CI/CD变量中配置
GIT_STRATEGY=clone,Runner每次执行任务都会删除旧的工作目录、重新克隆完整仓库,不会复用历史仓库的shallow文件 - 升级相关组件版本:升级GitLab Runner到14.x及以上版本,同时升级NixOS系统的Git版本,新版本已经修复了该场景下的Git校验逻辑缺陷
- 开启独立构建目录:在Shell执行器的配置段中开启自定义构建目录功能,每个任务使用独立的工作目录,不会复用历史仓库数据,配置示例:
[runners.custom_build_dir] enabled = true
内容的提问来源于stack exchange,提问作者Jean-Paul Calderone
相关产品推荐
相关产品推荐

