在詹金斯管道中创建硒后端

Posted

技术标签:

【中文标题】在詹金斯管道中创建硒后端【英文标题】:Create a selenium backend in a jenkins pipeline 【发布时间】:2020-09-01 09:15:48 【问题描述】:

我有一组在 jenkins 中运行的 webdriver.io 测试。它们运行在由外部公司在 k8s 中管理的 selenium 网格上。我想对我的 selenium 后端有更多的控制权,所以我试图找到一种在我的 jenkins 管道中设置 selenium 后端的方法。不过,我缺乏 docker/k8s 网络知识让我望而却步。

这大概是我的管道的样子:

  agent 
    kubernetes 
      defaultContainer 'jnlp'
      yaml """
        apiVersion: v1
        kind: Pod
        spec:
            containers:
              - name: node
                image: node:12.14.1
                command:
                - cat
                tty: true
      """
    
  
  stages 
    stage('Checkout codebase') 
      // do checkout
        
    
    stage('Build') 
      steps 
        container('node') 
            sh '''
                npm install --production
            '''
        
      
    
    stage('Test-Mocha') 
      steps 
        container('node') 
            sh "node_modules/.bin/wdio ./test/config/wdio.conf.js --spec ./test/helpers/sandBox/sandbox1.js"
        
      
    
  


我想要的是针对 chrome 运行我的测试。任何可以让我运行 chrome 浏览器的解决方案都很好。

我尝试使用 selenium/standalone-chrome 指定一个额外的容器,但我不知道如何针对该容器运行测试。我还阅读了有关使用 docker 容器设置 selenium 网格的内容,但我不知道如何在此管道中运行这些命令,即使这可行,我也不确定如何针对此网格运行。

谁能给我一个例子来说明我可以做些什么来完成这项工作?

【问题讨论】:

您有一个选择。您可以查看下面的链接,他们在其中展示了如何配置 zalenium 并将其用于 selenium 测试脚本执行。只需先使用 zalenium 进行练习,然后您就可以创建自己的 docker 镜像,并在其中配置 novnc 以查看 docker 容器中的执行情况。现在你不需要在 Jenkins 中进行任何额外的配置来使用 zalenium。您只需要公开所需的端口,就可以使用自动创建的 selenium 网格节点。 qautomation.blog/2019/08/28/zalenium-the-ultimate-tutorial 谢谢,zalenium 看起来很酷。这不是我想知道的。我知道也有 selenium docker 图像,我可以将它们添加到管道的容器部分。我正在努力的是如何从我的节点应用程序中接近硒服务器。我不想创建自己的 docker 图像。我只想提取我的代码,启动一个服务器,然后针对它运行我的测试。我认为我正在寻找的答案更多地在于网络角落 【参考方案1】:

有一种方法不是通过 Kubernetes。

使用下图安装了nodejs和chrome。

  agent 
    kubernetes 
      defaultContainer 'jnlp'
      yaml """
        apiVersion: v1
        kind: Pod
        spec:
            containers:
              - name: node-chrome
                image: larcado/nodejs-chrome
                command:
                - cat
                tty: true
      """
    
  
  stages 
    stage('Checkout codebase') 
      // do checkout
        
    
    stage('Build') 
      steps 
        container('node') 
            sh '''
                npm install --production
            '''
        
      
    
    stage('Test-Mocha') 
      steps 
        container('node') 
            sh "node_modules/.bin/wdio ./test/config/wdio.conf.js --spec ./test/helpers/sandBox/sandbox1.js"
        
      
    
  

确保作为 package.json 的一部分,selenium-webdriver 是其中的一部分。

【讨论】:

好的,这样图片就有了chrome。我将如何在那里启动 Selenium 服务器?只是将 Selenium webdriver 添加到我的 package.json 并不会这样做。 要启动它,您还需要安装 java。然后运行java -jar selenium.jar,它将在本地启动 selenium 服务器并在同一映像本身中,您需要nodejs 来运行您的测试用例和chrome 来运行您的测试用例 启动 Selenium 后,它是在 localhost 还是其他地方可用? 它将提供localhost:4444 感谢您的回答,我想我现在已经足够了。你碰巧知道我如何在这个节点 chrome 映像中安装 java 吗?【参考方案2】:

有几种方法可以做到这一点。

1.使用 Selenium Grid(理想方式)- 以下是步骤:

使用以下 docker-compose 文件托管单独的 selenium Grid。
version: '2'
services:
  firefox:
    image: selenium/node-firefox:3.14.0-gallium
    volumes:
      - /dev/shm:/dev/shm
    depends_on:
      - hub
    environment:
      HUB_HOST: hub

  chrome:
    image: selenium/node-chrome:3.14.0-gallium
    volumes:
      - /dev/shm:/dev/shm
    depends_on:
      - hub
    environment:
      HUB_HOST: hub

  hub:
    image: selenium/hub:3.14.0-gallium
    ports:
      - "4444:4444"

执行docker-compose up -d命令启动运行localhost:4444的Selenium Grid

一旦此网格运行,请生成用于针对网格运行的 wdio 配置。

参考:https://webdriver.io/docs/clioptions.html

生成配置后,使用您在问题中提到的管道运行您的管道,该管道将针对 Selenium Grid 运行

注意:- 使用您生成的新 wdio 配置,用于针对 selenium 网格。

希望这会有所帮助。

【讨论】:

感谢您的努力,但整个想法是我无法访问托管当前网格的 k8s 环境。我想知道如何从我的管道中启动一个 selenium 服务器/网格,以及如何处理它 请看另一个不是基于 Kubernetes 的答案。

以上是关于在詹金斯管道中创建硒后端的主要内容,如果未能解决你的问题,请参考以下文章

如何在詹金斯管道中创建一个以日期戳作为文件名的目录?

Selenium:无法在 Jenkins 管道中创建用于下载的文件夹和文件

如何相对于子目录运行詹金斯管道?

复制詹金斯管道项目

詹金斯:无法在管道阶段定义变量

如何在另一个詹金斯管道B中调用詹金斯管道A