jenkins调度无法获取执行机屏幕信息的解决方案

1. 解决的场景:

1. 通过jenkins向slave节点下发任务,由于jenkins服务无法获取到slave主机的屏幕信息,导致UI或者GUI自动化测试失败或者其他屏幕相关的代码异常。

2. 当slave节点的主机屏幕最小化或者没开启屏幕,可能导致UI或者GUI自动化失败。

3. 无法基于jenkin调度来开展UI或者GUI自动化测试。

2. 导致原因:

  

1.Windows 服务的Session 0 隔离机制

关于windows的session机制,我们先来看下官方文档中的描述:

In Windows® XP, Windows Server® 2003, and earlier versions of Windows, all services run in Session 0 along with applications. This situation poses a security risk. In Windows Vista®, Windows Server 2008, and later versions of Windows, the operating system isolates services in Session 0 and runs applications in other sessions, so services are protected from attacks that originate in application code.

从windows xp以及server 2003开始,在以后的windows版本中,session 0不再是一个用户session,系统中所有的系统进程和服务都运行在session 0上,同时session 0在系统中是没有UI的,session 0 不接收任何UI的输入输出。相对应登录用户启动的应用都运行在相对应登录用户的session ID上,用户登录所启用UI的session ID和启用应用的session ID是相同的。这样设计带来的好处官方文档中对此的描述是能够使应用的代码攻击不了系统的服务。但在实际应用中,却对远程操作系统带来了一定的麻烦。

由于在实际环境中,远程控制软件是以服务的形式安装在操作系统上的,因此该服务所启的进程一定是运行在session 0上的。但实际需要部署的应用却需要接受用户session所发来的消息队列。我们看下官方文档对此的描述:

A service tries to use window message functions such as SendMessage and PostMessage to communicate with an application. This does not work because the application is running in a different session and therefore has a different message queue.The messages never arrive at their destination. The same is true for applications that try to communicate with services through window messages.

也就是说用户程序调用SendMessage和服务进程进行通讯时,由于不同的session有不通的消息队列,因此消息是无法发送到服务进程的。同时,系统也不支持让用户在session 0上进行UI的操作。因此,必须把服务应用部署在非session 0上才能保证服务应用正常工作。那就意味着远程控制软件必定不能以服务的形式而必须以用户登录启动的形式安装在系统上。这样才能保证远程启动的应用的进程和用户发送的消息在同一个session中被消息队列进行处理。

2.由于测试机的用户未激活(未登录),或者屏幕未激活,系统获取不到当前屏幕信息,导致代码进行UI或者GUI操作失败。

3. 解决方案:

1. slave节点的jenkins启动方式:(以应用的形式,不以服务的形式启动)

  执行方式: 通过Java Web启动代理

2. 以java -jar agent.jar ****** 的形式去启动jenkins服务。(若之前已经将jenkins作为服务去启动,可通过管理员模式的命令行:sc delete jenkins....来删掉服务)

3. 申请两台跳板机(普通pc虚拟机)A和B。跳板机B只用于远程跳转机A(使跳转机A处于用户激活状态),跳转机A作为远程节点,远程需要开启屏幕的其他测试机。(可以通过jenkins下发命令去远程)

4. 关闭跳转机B的远程连接,and enjoy~(此时跳转机A和其下的远程主机都将处于用户登录和屏幕激活的状态,可以在jenkins上调度UI或者GUI操作)

5. (选做题)对windows的远程服务mstsc进行设置。

可参考http://www.xmxwl.net/help/member/20130729/13120.html 、

https://blog.csdn.net/pj386960300/article/details/42120985

4. 你可能会遇到的坑:

1.

2.通过jenkins直接下发远程命令在slave节点上,即使远程拉起屏幕后,job状态也将永远处于进行中。若强制终止job,以拉起的屏幕也将被关闭。

命令行打开无交互的mstsc远程的命令:

cmdkey /generic:termsrv/**ip** /user:sangfor /pass:sangfor

mstsc /v:**ip**

解决方法:

通过脚本B调用脚本A(包含远程命令),间接调用远程命令,使得job执行成功。(如果担心跳板机长时间运行,导致存在多个cmd命令进程,可以设置windows定时任务,定时杀死cmd进程)

脚本B.bat 内容: start cmd_A.bat

5. 简单图解:

原文地址:https://www.cnblogs.com/Delo/p/11141687.html