GitLab CI shell执行器runner克隆Git仓库失败Docker执行器正常该如何排查
Shell执行器Git克隆鉴权失败排查方案
Shell与Docker执行器的Git克隆行为核心差异
- 环境纯净度差异:Docker执行器每次任务启动全新的干净容器,无任何预设Git配置、环境变量;Shell执行器复用宿主机
gitlab-runner用户的运行环境,会加载系统级/etc/gitconfig、用户级~/.gitconfig配置,以及全局环境变量,预设配置会覆盖Runner自动注入的CI令牌规则。 - 工作目录生命周期差异:Docker执行器的工作目录为容器内临时目录,任务结束后随容器销毁无残留;Shell执行器的工作目录
/home/gitlab-runner/builds/为持久化存储,之前任务残留的.git/config配置、缓存凭证会对后续任务产生影响。 - Git版本差异:Docker镜像内的Git版本由镜像决定,Shell执行器使用宿主机系统安装的Git版本,版本差异可能导致令牌解析、凭证处理逻辑不同。
排查方向
- 检查Git全局配置冲突
切换到gitlab-runner用户执行命令查看所有Git配置及来源:
重点排查是否存在sudo su - gitlab-runner git config --list --show-origincredential.helper配置(会缓存旧凭证覆盖Runner注入的CI令牌)、url.*.insteadOf规则(会自动替换CI生成的带令牌仓库地址),如有相关配置直接删除即可。 - 清理残留工作目录
持久化工作目录下残留的Git配置会导致鉴权冲突,直接清空所有历史构建目录测试:sudo rm -rf /home/gitlab-runner/builds/* - 手动验证克隆能力
切换到gitlab-runner用户,使用有效令牌手动执行克隆命令,排查是否为环境本身问题:
如手动克隆仍失败,进一步排查:git clone http://gitlab-ci-token:<可用的CI令牌/私人令牌>@gitlab-server/dev/repo.git- 执行
env | grep -i proxy检查是否存在全局代理配置,导致请求被转发到错误地址 - 检查
/etc/hosts中gitlab-server的解析是否和GitLab服务端真实IP一致
- 执行
- 升级Git版本
Ubuntu 18.04默认自带的Git 2.17版本存在已知的凭证处理兼容性问题,低于GitLab 13.10要求的最低Git版本,可通过官方PPA升级:sudo add-apt-repository ppa:git-core/ppa sudo apt update && sudo apt install -y git
需查看的日志文件
- GitLab Runner运行日志:路径为
/var/log/gitlab-runner/gitlab-runner.log,可在config.toml中添加log_level = "debug"后重启Runner服务,获取克隆阶段的详细入参日志。 - GitLab服务端Nginx访问日志:路径为
/var/log/gitlab/nginx/gitlab_access.log,可查看Shell Runner的克隆请求是否到达服务端、返回401状态码的具体请求特征。
内容的提问来源于stack exchange,提问作者KvR
相关产品推荐
相关产品推荐

