Jenkins声明式流水线构建执行git pull时出现挂起问题如何解决?
解决方案
- 禁用Git交互提示避免无响应
Jenkins为非交互运行环境,Git遇到需要输入凭据、确认主机密钥等场景时默认会等待终端输入,直接导致进程挂起。在_UPDATE_ALL.sh开头添加以下配置,让Git遇到交互需求时直接报错退出而非挂起:
export GIT_TERMINAL_PROMPT=0 export GIT_SSH_COMMAND="ssh -o BatchMode=yes" git config --global core.askPass ""
修正Jenkins运行用户的Git凭据配置
手动执行脚本时使用的是当前登录用户的凭据(SSH密钥、HTTPS缓存凭据等),而Jenkins服务默认使用Local System账号运行,没有访问Git仓库的合法权限。需先进入Windows服务管理页,将Jenkins服务的运行账号修改为你手动测试时使用的用户,或单独给Jenkins服务账号配置对应Git仓库的访问凭据。调整MSYS2调用参数禁用伪终端
通过PowerShell调用MSYS2执行脚本时,默认会尝试分配伪终端,在非交互的Jenkins环境下容易引发挂起问题。修改_RUN_STAGE.ps1中调用MSYS2的命令,添加-T参数禁用伪终端分配,示例如下:
# 原调用逻辑添加-T参数 c:\msys64\msys2_shell.cmd -defterm -no-start -T -c "./_UPDATE_ALL.sh"
- 优化脚本执行逻辑避免输出缓冲挂起
你当前脚本中使用echo $(git xxx)的写法会先捕获命令全部输出再统一打印,容易因输出缓冲满导致进程挂起,同时也看不到实时执行日志。将_UPDATE_ALL.sh修改为直接执行命令,并打开调试输出方便定位问题:
#!/bin/sh set -ex git stash git pull git submodule update --force --init --recursive git fetch --all git tag -l | xargs git tag -d git fetch --tags
- 规避系统目录权限限制
你的Jenkins工作目录放在C:/Program Files (x86)下,该目录默认有严格的权限控制,非管理员账号没有写入权限,会导致Git拉取代码时写入文件失败引发挂起。建议将Jenkins工作目录迁移到C:/JenkinsWorkspace这类自定义的非系统目录,降低权限冲突概率。
内容的提问来源于stack exchange,提问作者martorad
相关产品推荐
相关产品推荐

