You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Jenkins多分支流水线中添加全程运行的Selenium Grid代理

正确实现Jenkins流水线全程伴随的Selenium Grid代理

问题分析

你之前的写法存在两个核心问题:

  1. 把Selenium Grid放在单独的SG阶段,要么该阶段会因前台运行run selenium-grid而阻塞,导致后续main阶段无法执行;要么后台启动后,若使用独立agent,Selenium进程会随agent销毁而终止,无法伴随整个流水线。
  2. 无法让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 21:35:16