You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 07:49:56