如何在没有远程桌面连接的 jenkins windows slave 上运行 GUI 测试?
Posted
技术标签:
【中文标题】如何在没有远程桌面连接的 jenkins windows slave 上运行 GUI 测试?【英文标题】:How to run GUI tests on a jenkins windows slave without remote desktop connection? 【发布时间】:2013-10-26 19:19:20 【问题描述】:我在窗口 7 上设置了 jenkins 代理,在 Linux 上设置了 jenkins 服务器。我正在 Windows 代理上运行 GUI 测试。如果我连接了远程桌面连接,它运行良好,否则失败。我找到了这个链接,Jenkins on Windows and GUI Tests without RDC
但是那里提供的解决方案非常模糊。似乎唯一的解决方案是以某种方式使 Jenkins 服务器始终打开远程桌面连接。但我找不到这样的选择。 谁能清楚地教我如何解决这个问题?
非常感谢!
【问题讨论】:
在这里看看我的回答:***.com/questions/10177708/… @AndyChen 除了自动登录,我还需要这个***.com/a/24820786/1184842 确实,每次我 RDP 到 VM 时,我都会重新启动它。也可以只通过VNC登录,不需要重启。 【参考方案1】:您的从机必须在桌面上才能运行测试 适当地。我们遇到了同样的问题。
解决方案是让测试机器启动并自动登录到 桌面。确保测试仅在桌面后开始 可用,我们添加了一个计划任务,设置为在用户登录时运行, 这将通过 Java Web Start 启动 Jenkins 从站。那样, 一旦桌面运行,詹金斯只会看到奴隶。后 一切正常。
这是您链接到的问题的最佳答案,并且非常清楚该怎么做。整个设置在 Jenkins 之外。 Jason Swager 描述了他如何自动化用户登录到 Windows 桌面计算机,然后在用户会话中启动 Jenkins 从站。
现在一步一步来:
1。确保你有一个可用的 GUI
解决方案是让测试机器启动并自动登录到桌面
配置标准 Windows 桌面以在 Windows 启动时自动登录特定用户。这样,没有人需要物理登录桌面。 (见How to turn on automatic logon in Windows 7)
2。启动 Jenkins slave
您需要在此用户设置中启动 Jenkins 从站。否则,Jenkins 从站将无法访问 Windows UI 组件(或者换句话说,无法与桌面交互)。
确保测试仅在桌面后开始 可用,我们添加了一个计划任务,设置为在用户登录时运行, 这将通过 Java Web Start 启动 Jenkins 从站。
所以你必须create a scheduled task 并配置它来启动你的Jenkins client using Java Web Start。
3。使用它
这样,Jenkins 只会在桌面运行后才能看到从站。后 一切正常。
当 slave 在线时,你可以使用它来运行你的 UI 测试。
【讨论】:
我相信我已经完成了所有这些 - 通过 java web start 启动它,自动登录用户(只有一个用户,即管理员)。但如果没有 RDC 连接,它仍然无法工作。 系统是否连接了显示器?您需要激活 UI 组件,并且只有当您的 jenkins 客户端在同一用户下运行时,才能在登录到 UI 的用户下运行。 不行,测试机是虚拟机。它没有连接物理监视器。 windows slave下只有一个用户,就是admin。所以应该没有多用户造成的问题,而且我已经启用了自动登录。 那么不设置物理机就没有办法了吗?我确信它可以与物理机器一起使用,因为如果我打开了 RDP 连接,它就可以正常工作。但这很昂贵。它不能像虚拟 linux 机器一样虚拟运行吗? 我可以按照 Peter 提到的步骤在 win7 虚拟机中进行设置。此外,为了确保它在没有 RDC 连接的情况下工作,我在批处理文件中添加了一个快捷方式,其中包含以下内容: for /f "skip=1 tokens=3" %%s in ('query user %USERNAME%') do (%windir %\System32\tscon.exe %%s /dest:console` ) 确保使用此快捷方式断开连接而不是关闭远程桌面窗口。【参考方案2】:要解决此问题,请按照我在此处的说明设置 Windows 自动登录: https://serverfault.com/questions/269832/windows-server-2008-automatic-user-logon-on-power-on/606130#606130
然后为 Jenkins slave 创建一个启动批处理(将它放在 Jenkins 目录中),它将在桌面上启动它的控制台,并允许 GUI 作业运行:
java -jar slave.jar -jnlpUrl http://Your Jenkins Server:8080/computer/Your Jenkins Node/slave-agent.jnlp
(slave.jar 可以从 http://Your Jenkins Server:8080/jnlpJars/slave.jar 下载)
编辑: 如果您收到黑色屏幕截图(例如,使用 Selenium 时),请创建一个断开远程桌面的批处理文件,而不是使用常规 X 按钮关闭 RDP 会话:
%windir%\system32\tscon.exe %SESSIONNAME% /dest:console
【讨论】:
【参考方案3】:以下事情对我有用:
在 Jenkins 中执行 windows shell 命令:
cmdkey /generic:TERMSRV/<servername> /user:<username> /pass:<password>
mstsc /v:<servername> /w:<width> /h:<height>
cd <path to your pom.xml>
<maven command>
(例如mvn test -Dfiles_to_run=groupLaunch.xml
cmdkey /delete:TERMSRV/<servername>
它在由 Jenkins 提供支持的虚拟 mstsc 会话 (Jenkins-to-Win) 中创建具有指定宽度和高度的真实 mstsc 会话 (Win-to-Win)。
【讨论】:
【参考方案4】:我尝试了此处提供的解决方案,但对我没有任何帮助。最后,我想出了一个解决方法。
我在不同的 VM (VM2) 中打开了与 VM 的 RDP 连接。 我在 VM2 中打开了第一个连接并断开了连接。
它有效,但这意味着有两个可用的虚拟机。
【讨论】:
【参考方案5】:您仍然需要使用 RDP,但在我的情况下,我们可以在同一 VM 中使用 RDP 的 loopback。
程序:
-
在 VM 中,创建两个不同的帐户,并为这两个帐户创建 Jenkins 从站。
现在您将在一个 VM 中为两个帐户拥有两个 Jenkins 从站
从属 1 - 帐户 1
从属 2 - 帐户 2
启用多个 RDP 跟随指南 https://www.serverwatch.com/server-tutorials/how-to-enable-concurrent-remote-desktop-sessions-in-windows.html
在slave 2(账号2)中,运行rdp命令连接slave 1(账号1),如下 启动 /b "" "C:\RDP\rdp.exe" /v:127.0.0.2 /domain:\ /u:admin /p:xxxx /fullscreen /w:1920 /h:1200
127.0.0.2很重要,是RDP的环回连接
将上面的命令放入 Jenkins 作业中,命名为“OpenRDP_ToVMXXX”,然后你可以在启用 GUI 的 slave 1 上运行任何测试,享受。
【讨论】:
【参考方案6】:由于上面的解决方案似乎有点矫枉过正,我使用了这种方法:
-
禁用
Jenkins
服务
使用java -jar C:\Program Files (x86)\Jenkins\jenkins.war
从命令行启动Jenkins
由于某种原因,我必须在以这种方式启动它时安装所有插件和所有东西,所以我建议创建一个备份,有一个插件可以做到这一点。祝你好运。 :)
【讨论】:
以上是关于如何在没有远程桌面连接的 jenkins windows slave 上运行 GUI 测试?的主要内容,如果未能解决你的问题,请参考以下文章