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
相关产品推荐
相关产品推荐

