如何在Jenkins多分支流水线中添加全程运行的Selenium Grid代理
正确实现Jenkins流水线全程伴随的Selenium Grid代理
问题分析
你之前的写法存在两个核心问题:
- 把Selenium Grid放在单独的
SG阶段,要么该阶段会因前台运行run selenium-grid而阻塞,导致后续main阶段无法执行;要么后台启动后,若使用独立agent,Selenium进程会随agent销毁而终止,无法伴随整个流水线。 - 无法让Selenium Grid在所有流水线阶段中保持可用状态。
推荐实现方案
结合你使用Kubernetes agent的场景,优先推荐以下两种方案:
方案一:Kubernetes多容器Pod(最可靠)
利用Jenkins Kubernetes插件的多容器Pod特性,将主任务容器和Selenium Grid容器放在同一个Pod中,整个流水线生命周期内Pod持续存在,结束后自动销毁,完美实现Selenium Grid全程伴随。
pipeline { agent { kubernetes { label "k8s" // 自定义Pod模板,包含主容器和Selenium Grid容器 yaml """ apiVersion: v1 kind: Pod spec: containers: - name: main image: your-build-image:latest # 替换成你的流水线任务镜像 command: ['sleep'] args: ['99d'] # 保持容器存活,等待Jenkins执行命令 - name: selenium-grid image: selenium/standalone-chrome:latest # 可按需替换为hub+node组合镜像 ports: - containerPort: 4444 """ } } stages { stage('主任务') { steps { sh 'echo hello.' // 容器间通过名称访问Selenium Grid,地址为selenium-grid:4444 sh 'curl http://selenium-grid:4444/wd/hub/status' } } stage('Selenium测试') { steps { sh 'run-your-selenium-tests.sh' # 测试脚本直接使用selenium-grid:4444作为远程地址 } } } post { always { sh 'echo 流水线结束,Selenium Grid将随Pod一起销毁' } } }
说明:
- 两个容器共享同一Pod的网络空间,主容器可直接通过容器名
selenium-grid访问Selenium服务 - 流水线结束后,Jenkins会自动删除该Pod,无需手动清理Selenium Grid
方案二:后台启动+全局清理(单容器场景)
若无法使用多容器Pod,可在流水线启动阶段后台启动Selenium Grid,记录进程ID,最后在流水线结束时强制清理进程。
pipeline { agent { label "k8s" } environment { SELENIUM_PID = "/tmp/selenium.pid" SELENIUM_LOG = "/tmp/selenium.log" } stages { stage('启动Selenium Grid') { steps { // 后台启动Selenium Grid并记录进程ID sh 'nohup java -jar selenium-server-4.15.0.jar standalone > ${SELENIUM_LOG} 2>&1 & echo $! > ${SELENIUM_PID}' // 等待Selenium服务启动完成 sh 'until curl -s http://localhost:4444/wd/hub/status | grep -q "ready"; do sleep 3; done' } } stage('主任务') { steps { sh 'echo hello.' sh 'curl http://localhost:4444/wd/hub/status' } } stage('Selenium测试') { steps { sh 'run-your-selenium-tests.sh' } } } post { always { // 无论流水线成功/失败,都清理Selenium进程 sh 'if [ -f ${SELENIUM_PID} ]; then kill $(cat ${SELENIUM_PID}) || true; rm -f ${SELENIUM_PID}; fi' // 可选:查看Selenium运行日志 sh 'cat ${SELENIUM_LOG}' } } }
说明:
- 使用
nohup和后台运行符号&让Selenium在后台启动 post always块确保无论流水线结果如何,都会清理进程- 若你的Jenkins agent是动态创建的K8s Pod,流水线结束后Pod会自动销毁,进程也会终止,但手动清理更稳妥
内容的提问来源于stack exchange,提问作者Amro Massalha
相关产品推荐
相关产品推荐

