GitLab Runner UI卡顿,CI/CD任务超时失败问题求助
GitLab CI/CD Runner任务执行末尾卡住超时的排查方案
核心排查方向
1. 子进程残留未退出
这是这类问题最常见的原因:任务脚本执行完后,后台还有子进程在运行,Runner会一直等待所有子进程结束才会标记任务完成,最终导致超时。比如:
npm run test如果默认开启监听模式(如Angular的Karma测试),测试完成后不会自动退出,会持续等待新测试用例。bash bundle-runtime-cli.sh脚本里可能存在后台启动的进程(用&结尾的命令),未添加等待或关闭逻辑。
解决办法:
- 给
npm run test添加参数强制关闭监听:npm run test -- --watch=false - 检查
bundle-runtime-cli.sh,若有后台进程,在脚本末尾加wait命令等待所有子进程结束,或用pkill清理:# 在bundle-runtime-cli.sh末尾添加 wait # 或者清理当前脚本启动的进程 pkill -P $$ - 在
npm_test任务的最后一步添加子进程清理命令:pkill -P $$
2. 输出流未正常关闭
Runner会持续监听任务进程的stdout和stderr,如果这两个流未发送EOF,Runner会判定任务仍在运行。即便你在/var/[pid]/fd能看到结果,也可能存在进程持有流句柄未关闭的情况。
解决办法:
- 将关键命令的输出重定向到文件,避免缓冲区阻塞:
npm run test > test_result.log 2>&1 - 在
before_script中添加bash严格模式,确保命令出错时及时退出,同时规避管道导致的流问题:before_script: - export NVM_DIR="$HOME/.nvm" - '[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"' - set -eo pipefail
3. Runner与GitLab通信异常
偶发的网络波动可能导致Runner无法及时将任务完成状态上报给GitLab,表现为任务卡住直至超时。
解决办法:
- 查看Runner日志(通常路径为
/var/log/gitlab-runner/gitlab-runner.log),检查是否存在failed to send job result类错误:tail -f /var/log/gitlab-runner/gitlab-runner.log - 在Runner机器上持续测试与GitLab服务器的连通性:
ping gitlab.myproject.com -c 100
4. 文件描述符泄漏
任务执行过程中打开过多文件描述符,或部分fd未正确关闭,会导致Runner无法感知任务结束。
解决办法:
- 用
lsof查看卡住进程的文件描述符:lsof -p <任务进程ID> - 检查脚本中是否存在未关闭的文件句柄,比如用
exec打开文件后未执行关闭操作。
针对当前配置的快速调整
直接修改npm_test任务脚本,优先解决最可能的子进程问题:
npm_test: stage: npm_test tags: - npm only: - merge_requests script: - date - node --version - npm --version - rm -rf ../myproject-ui-variables ; git clone --depth 1 https://oauth2:$GITLAB_TOKEN@gitlab.myproject.com/my-grp-eng/myproject-ui-variables.git ../myproject-ui-variables - npm run build ; cd ../myproject-ng-runtime - npm install - npm i yalc -g - yalc add @myproject/variables - bash bundle-runtime-cli.sh - npm run test -- --watch=false # 强制测试完成后退出 - pkill -P $$ # 清理所有子进程 - date && echo "任务执行完成" retry: max: 2 when: stuck_or_timeout_failure
另外可移除before_script中的bash_completion加载,该配置对CI任务无实际作用,反而可能引入不必要的进程:
before_script: - export NVM_DIR="$HOME/.nvm" - '[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"'
内容的提问来源于stack exchange,提问作者Ganesh
相关产品推荐
相关产品推荐

