由于项目比较偏前端,我们的 UI 自动化采用了 cypress
在选型好了工具以后,所有的自动化也需要集成到 jenkins 流水线中集成,达到持续集成的目的
一开始跑 UI 自动化所使用的 salve,我们选择主流方案,使用跟编译打包同样的 slave。
占用生产的 slave 问题比较好解决,先尝试用 jenkins label 分割 slave 群,独占一个台 slave 执行 UI 自动化。
Cypress 卡 case 的问题,因为怀疑是环境问题,于是首选尝试使用官方提供的 docker 镜像来运行测试。同时将测试场景分成多个 spec,每个 spec 文件中只有一个 describe(调研发现卡 case 通常发生在初始化 describe,即 scenario 的时候)
我厂大部分测试同学使用的是 windows 机器开发脚本。在碰到卡 case 啊,chrome 崩溃等问题的时候,windows 机器均无法复现跑得飞起。那是不是使用 windows 机器作为 slave 就可以解决上面碰到的所有问题了呢。
shell
apt-get install xvfb libgtk2.0-0 libnotify-dev libgconf-2-4 libnss3 libxss1 libasound2
确定了必要性和可行性,就开始准备做 windows slave。
公司的 jenkins 等基础设施建在云主机上。需要增加 slave 的时候,必须要走财务流程申请新的云主机,流程冗长复杂,而且还不便宜。
然后我突然想到办公室里面有好几台空闲的的 PC 机器 (win10),用作显示 CI monitor,略显浪费。那是不是可以把这几台 windows pc 做成 jenkins slave 集群,当土生云使用呢。
为了达到把本地机器装载到 jenkins slave 集群中的目的,host 和 slave 之间的通信问题得先解决。
找运维同学配合,绕过各种 IP、访问限制,确保两点即可
需要在 slave 上安装执行 jenkins 以及 UI 自动化的环境
按照这个教程,做到第四步。后面,我们采用直接在 slave 上用 bat 文件启动 agent.jar 的方案。
其中-Dfile.encoding=UTF8
可以解决在 console 中的乱码问题
然后依次把其他 slave 机器设置好,执行 bat 文件后,java 进程以 cmd 窗口的形式存在在 slave 上。
成功后,jenkins 上查看结果。
做到这一步,只需要把 UI 测试配置上这个 slave 集群的 label,然后就可以正常在流水线中跑 UI 自动化了。
按理来说现在自动化也可以独立跑了,cypress 也不挂了,完美了啊。
结果在实践中发现承载 jenkins 的命令行窗口,经常因为不同的原因挂掉
所以又得想个办法把这些窗口隐藏起来。
两种方式可以达到目的
nssm.exe install [服务名] [bat文件路径]
sc
命令。比较麻烦)做成 windows 服务以后,再也不同担心被误关窗口了。而且重启后也会自动启动。
jenkins agent 做成服务以后,跑 UI 自动化的时候,发现 cypress 的 viewport 设置失效,始终会以手机的 viewport 来执行测试。
经过调查和多次验证,发现问题还真出在 jenkins agent 被.net 框架包装成服务时。同样的 bat 文件,直接执行就不会有 viewport 的问题。
所以必须要放弃服务化,用另外一种方式使 agent 以命令行方式执行。
虽然start \min
命令,可以使 bat 文件在一开始就以最小化的方式执行。这种方式下我们还是能在任务栏看到这个命令行窗口。
所以最终还是直接选择使用 vbs 来包装这个 bat 文件。
Set objShell = WScript.CreateObject("WScript.Shell")
objShell.Run("cmd.exe /c jenkins_slave_start.bat"), 0
双击启动这个进程后,windows slave 成功上线。服务器的界面上也看不到任何窗口了。而且服务器重启的时候,也会通过启动项把这个服务启动起来。
同样的方式,我们也用来启动了 selenium grid 等其他可以用 bat 启动的服务。
至此,windows slave 算搭建完成了。vbs 隐藏界面的方式看上去很美好,但是也会有问题, 比如
所以后面还可以改进的地方还挺多。
顺带提一下因为重新引入 windows slave 的关系,最近又重新捡起了 vbs,开心 -v-