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

GitLab Runner执行Windows GUI MFC应用集成测试异常问题问询

GitLab CI/CD 运行Windows MFC GUI应用异常解决方案

你遇到的问题根源是Windows Vista及之后版本引入的Session 0隔离机制:服务模式运行的GitLab Runner默认运行在Session 0中,该环境没有图形会话上下文,禁止GUI程序创建可见窗口、正常执行消息循环,就会出现随机崩溃、卡住的问题,这也是手动执行Powershell命令正常、服务执行异常的核心原因。

方案1:用户会话模式运行GitLab Runner(最稳定,优先推荐)

完全避开Session 0隔离,用普通用户身份前台运行Runner,操作步骤:

  • 先卸载已安装的服务版Runner,执行命令:gitlab-runner.exe stop && gitlab-runner.exe uninstall
  • 切换到手动运行Powershell命令正常的目标用户登录系统
  • 打开普通权限的Powershell窗口,若之前已经注册过Runner无需重复注册,直接执行启动命令:gitlab-runner.exe run
  • 如需开机自动运行,将上述启动命令写入bat脚本,放到对应用户的开机启动目录 C:\Users\你的用户名\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup,同时设置系统开机自动登录该用户即可
    注意:若使用远程桌面管理该机器,不要直接点击断开按钮退出,执行命令 tscon rdp-tcp#0 /dest:console 断开远程连接,保持用户会话处于激活状态,否则GUI程序仍会出现异常。

方案2:psexec指定会话启动程序(适合必须保留服务模式Runner的场景)

借助Sysinternals工具集的psexec工具,强制将GUI程序启动到已登录用户的图形会话中,操作步骤:

  • 下载psexec工具并放到系统PATH路径下
  • 修改CI执行脚本,替换原启动逻辑:
foreach ($test in $TestDirectories) 
{ 
  Write-Host "Running test $test.";
  # 数字1为已登录用户的会话ID,可执行query user命令查看替换为实际ID
  $proc = Start-Process "psexec.exe" -argumentList "-i 1 -w $PWD ./Release/MyApp.exe -TESTMODE $test" -PassThru -NoNewWindow;
  Wait-Process -Id $proc.Id;
  if ($proc.ExitCode -ne 0) 
  {
    $ESC = [char]27;
    $ExitCode = $proc.ExitCode;
    Write-Host "$ESC[31mTest $test failed with code $ExitCode $ESC[0m";
    exit 1;
  }
}

注意:该方案同样需要目标用户保持登录状态,且会话ID没有发生变化。

方案3:虚拟显示适配(适合无头服务器场景)

如果Runner部署在无显示器的无头服务器上,没有用户登录环境,可以安装开源虚拟显示驱动虚拟出显示设备,再配合自动登录+用户会话模式Runner运行,即可完全模拟带图形环境的运行状态,消除GUI相关异常。


内容的提问来源于stack exchange,提问作者Christian Sattlecker

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 22:48:00