如何通过Jenkins在虚拟机上运行Selenium Server(RC)并解决步骤冻结问题?
解决Jenkins Pipeline启动Selenium Server后卡住的问题
核心原因是你当前的ssh命令是前台运行Selenium Server,Jenkins会一直等待ssh会话结束才会执行后续步骤。要让命令后台运行、让ssh立即返回,有以下几种可行方案:
方案1:用nohup+&让进程后台运行
把命令用引号包裹,在末尾加&让进程后台执行,同时用nohup让进程脱离终端(避免ssh断开后进程被杀死):
sh '''ssh user@ip "nohup java -jar ~/selenium_driver/selenium-server-4.3.0.jar standalone -p 1234 > logs.log 2>&1 &"'''
- 必须加引号:不然
&会被解析成本地Shell的后台符号,ssh还是会前台执行命令。 - nohup的作用:即使ssh会话关闭,Selenium进程也能继续运行。
方案2:用ssh的-f选项后台执行命令
ssh的-f参数会让ssh在执行命令前转到后台,这样Jenkins的ssh进程会立即返回,无需等待命令结束:
sh '''ssh -f user@ip java -jar ~/selenium_driver/selenium-server-4.3.0.jar standalone -p 1234 > logs.log 2>&1'''
这个方案更简洁,适合不需要长期保留进程的场景(测试结束后可以手动杀掉进程)。
额外注意事项
- 确保日志路径有权限:虚拟机上的
logs.log所在目录要给user用户写入权限,不然Selenium启动会失败,还可能无日志排查问题。 - 等待Selenium启动完成:直接启动后就跑测试可能会因为Selenium未初始化完成而失败,建议加等待和检查步骤:
sh '''sleep 10''' // 等待时间可根据实际调整 sh '''ssh user@ip "telnet localhost 1234 || exit 1"''' // 检查端口是否监听 - 测试完成后清理进程:避免虚拟机上残留大量Selenium进程,在Pipeline最后加停止步骤:
sh '''ssh user@ip "pkill -f selenium-server-4.3.0.jar"'''
完整Pipeline示例
pipeline { agent any stages { stage('启动Selenium Server') { steps { sh '''ssh -f user@ip "nohup java -jar ~/selenium_driver/selenium-server-4.3.0.jar standalone -p 1234 > ~/selenium_driver/selenium.log 2>&1 &"''' sh '''sleep 15''' sh '''ssh user@ip "echo '检查Selenium端口' && telnet localhost 1234 || { echo 'Selenium启动失败' && exit 1; }"''' } } stage('运行Pytest测试') { steps { sh '''pytest test_cases/ -v --tb=short''' } } stage('停止Selenium Server') { steps { sh '''ssh user@ip "pkill -f selenium-server-4.3.0.jar || echo '无Selenium进程需要停止'"''' } } } }
内容的提问来源于stack exchange,提问作者Fedor March
相关产品推荐
相关产品推荐

