首页 > 解决方案 > Jenkinsfile Kubernetes 暴露容器端口

问题描述

我正在尝试在我的 Jenkins 管道中导出我的 Kubernetes 容器上的端口。

我在网上看过,我就是不知道如何让它工作。

我需要将端口 4444 导出到 selenium-hub 容器。

def label = "selenium-hub-${UUID.randomUUID().toString()}"

podTemplate(label: label, yaml: """
apiVersion: v1
kind: Pod
spec:
  containers:
  - name: selenium-hub
    image: selenium/hub:3.4.0
    
  - name: selenium-chrome
    image: selenium/node-chrome:3.4.0
    env:
    - name: HUB_PORT_4444_TCP_ADDR
      value: localhost
    - name: HUB_PORT_4444_TCP_PORT
      value: 4444
    - name: DISPLAY
      value: :99.0
    - name: SE_OPTS
      value: -port 5556
  - name: selenium-firefox
    image: selenium/node-firefox:3.4.0
    env:
    - name: HUB_PORT_4444_TCP_ADDR
      value: localhost
    - name: HUB_PORT_4444_TCP_PORT
      value: 4444
    - name: DISPLAY
      value: :98.0
    - name: SE_OPTS
      value: -port 5557

我目前从集线器获取 ip,并将其传递给我的测试以通过网格运行

  node(label) {
        containerLog('selenium-hub')
        sh('hostname -i')
        POD_IP = sh(script: "hostname -i", returnStdout: true).toString().replaceAll('\\n', '');
        node() {
            sh("POD_IP='${POD_IP}' UI_URL=https://EEEEEE.net/ SERVICE_URL=https://WWWWWW.net/ ./node_modules/webdriverio/bin/wdio ./tests/UI/helpers/configs/wdio.GRID.conf.js --nolazy")
        }

我似乎在测试运行时无法访问网格,所以我相信这是由于端口 4444 没有被暴露,但我不知道如何在 Kubernetes 中做到这一点。

我在网上尝试了一些例子,但似乎没有更接近。

标签: seleniumjenkinskubernetesjenkins-pipelinejenkins-plugins

解决方案


将 Kubernetes pod 视为传统服务器的抽象。如果 pod 中的容器在特定端口上暴露了 mysql 或 selenium 之类的服务,则默认情况下,pod 中的所有其他容器都可以访问所选端口上的该服务:

https://kubernetes.io/docs/concepts/workloads/pods/pod/#resource-sharing-and-communication

与其使用 POD_IP,不如尝试使用 localhost:4444 (或您需要的任何端口)来访问该服务。

在各种构建中的单元测试期间,我使用相同的模式来访问 sidecar 容器中的 mysql。


推荐阅读