切换HTTPS后Jenkins中bitbake调用git rev-parse HEAD失败
问题概述
通过HTTPS拉取仓库后,仅在**Jenkins服务器中由bitbake调用git rev-parse HEAD**时触发报错,其他场景(单独执行git命令、Jenkins内单独执行git、Jenkins外运行bitbake)均正常。曾切换仓库地址为https://git.multitech.net/cgit/mlinux.git/和git://git.multitech.net/mlinux.git,问题未缓解。
排查细节
- strace追踪显示:成功执行时git会调用
geteuid();失败场景下git未调用该函数,但同一次bitbake执行中其他命令返回的UID均一致。 - 目录权限验证:git对目标目录
/home/jenkins/workspace/mlinux/nightly执行8次lstat,每次返回st_uid=1001,且校验结果为0;执行find nightly ! -user 1001无输出,确认目录所有内容归属UID 1001用户。 - 报错信息:
fatal: detected dubious ownership in repository at '/home/jenkins/workspace/mlinux/nightly'
To add an exception for this directory ...
- 已尝试无效操作:用
env -i清除git执行环境,问题未解决。
原因分析
git的可疑所有权检测逻辑并非仅依赖geteuid(),可能存在以下触发场景:
- 用户命名空间差异:Jenkins代理或bitbake可能运行在用户命名空间内,导致git检测到的实际UID与文件UID存在映射差异,且未触发
geteuid()调用路径。 - git版本逻辑分支:部分旧版本git的
safe.directory检测逻辑中,存在不调用geteuid()的分支(比如当环境中存在GIT_TEST_SAFE_DIRECTORY变量或特殊文件系统属性时)。 - bitbake执行上下文:bitbake在Jenkins中执行时,可能通过非标准方式切换用户上下文,导致有效UID与实际UID不一致,而git在该场景下优先校验实际UID。
解决方案
添加目录安全例外
在Jenkins构建步骤中执行以下命令,将目标仓库目录加入git的安全列表:# 全局生效(对所有仓库) git config --global --add safe.directory /home/jenkins/workspace/mlinux/nightly # 仅当前仓库生效 git config --add safe.directory /home/jenkins/workspace/mlinux/nightly校验bitbake执行的用户上下文
在bitbake调用git的前后,添加打印用户信息的命令,确认执行git时的实际UID/GID:echo "Current user: $(whoami), UID: $(id -u), GID: $(id -g)" git rev-parse HEAD若发现UID与预期不符,检查Jenkins代理的运行用户、bitbake的执行脚本是否包含
su/sudo切换逻辑。升级或调整git版本
尝试升级git到最新稳定版,新版git优化了所有权检测逻辑;若无法升级,可临时设置环境变量跳过检测(不推荐生产环境):export GIT_TEST_SAFE_DIRECTORY=/home/jenkins/workspace/mlinux/nightly检查Jenkins代理的权限配置
确认Jenkins代理是否以UID 1001用户运行,是否存在权限继承问题,比如构建过程中加载了其他用户的shell配置文件。
内容的提问来源于stack exchange,提问作者John Klug

