分享一个issue,终于在不懈的努力下,解决了(耽误了好长时间)...
现象
target:将老的jenkins上的job迁移到新的机器上,并采用pipeline的方式进行改写。该job涉及在windows平台install exe程序,需要搭建一个windows slave。通过将生成打包的程序安装到windows上并启动服务,为接下来automation case提供agent服务。
process:在搭建windows slave 的时候,发现无法通过pipeline方式调用windows上的exe程序,一直处于卡顿状态。远程登录到windows机器上发现程序的process已经在处理,但是一直处于running阶段,结束不了。
排查
1. windows slave如何搭建(不在本文讨论的范围内),我们采用的是cygwin的方式(https://docs.oracle.com/cd/E24628_01/install.121/e22624/preinstall_req_cygwin_ssh.htm#EMBSC340),这种方式的好处是我们可以在windows上跑shell命令,jenkins可以通过ssh的方式连接到windows上。排查下来,cygwin的service在新的windows上正常启动,jenkins也能正常的访问,并可以执行script,但是对于exe程序这种有gui的,出现了上述的情况。
网上资料比较少,只找到两篇:https://blog.csdn.net/Anlegor/article/details/24329237和https://blog.csdn.net/lb445720337/article/details/78969175,对一般问题的排查还是有用的。
2.查看任务管理器中安装该exe程序的process session,发现都是0,而远程登录进来同样的用户session 是2,进入误区,认为是因为session不一致导致没有权限执行。
3.参照网上经验指定windows slave上启动sshd服务的user,如下:
并将其设置为管理员,restart。服务正常开启,但是还是执行不了。并发现jenkins 认证出现问题,连不上该机器了,出现:
/bin/bash: Operation not permitted 这样的错误,网上查下:需要重新指定下user:
editrights -a SeAssignPrimaryTokenPrivilege -u cy_user (cy_user为服务启动用户)
editrights -a SeCreateTokenPrivilege -ucy_user
editrights -a SeTcbPrivilege -ucy_user
editrights -a SeServiceLogonRight -ucy_user
重新指定好后,jenkins可以正常连接了,然后发现pipeline可以正常的执行了!!!带着疑惑,我又去翻看了下cygwin的安装文档:
文档中并没有强调一定要和jenkins连接用户区分开来,我这也算是第一个吃螃蟹的人了。。。
结论:设置cygwin提供服务的user必须和jenkins连接到slave的user分开,不能是同一个。否则在处理类似于GUI程序的时候会出现长时间的卡顿。不是同一个的话这样它会以系统管理员的方式去启动service然后执行exe,而不是以jenkin的角色(某个session)来进行。
网友评论