#selenium #jenkins #kubernetes #jenkins-pipeline #jenkins-plugins
#selenium #дженкинс #kubernetes #jenkins-конвейер #jenkins-плагины
Вопрос:
Я пытаюсь экспортировать порт из моего контейнера Kubernetes в мой конвейер Jenkins.
Я посмотрел онлайн, и я просто не могу понять, как заставить это работать.
Мне нужно экспортировать порт 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.
Я попробовал несколько примеров в Интернете, но, похоже, они не стали ближе.
Ответ №1:
Представьте модуль Kubernetes как абстракцию традиционного сервера. Если контейнер в модуле предоставляет доступ к службе, такой как mysql или, в данном случае, selenium, на определенном порту, то все остальные контейнеры в модуле могут получить доступ к этой службе на выбранном порту по умолчанию:
https://kubernetes.io/docs/concepts/workloads/pods/pod/#resource-sharing-and-communication
Вместо использования POD_IP просто попробуйте использовать localhost: 4444 (или любой другой порт, который вам нужен) для доступа к сервису.
Я использую один и тот же шаблон для доступа к mysql в контейнере sidecar во время модульных тестов в различных сборках.
Комментарии:
1. Итак, это работает для контейнеров «узла», попадающих в «сетку», но, поскольку наш сервер kubernetes является подчиненным для нашего сервера jenkins, ip отличается, поэтому я не могу использовать локальный хост, POD_IP получает ip подчиненного устройства, на котором запущены контейнеры, затем мне нужно предоставить 4444, чтобы он был открыт на подчиненном устройстве, чтобы главный дженкинс мог получить к нему доступ …. если это имеет смысл, спасибо
2. @Karl зачем вам нужен главный Jenkins, чтобы иметь доступ к ведомому устройству? В вашем примере похоже, что вы запускаете концентратор и браузер в одном модуле. Связь идет от браузера к концентратору, верно?
Ответ №2:
Сервис позволяет вашим приложениям получать трафик. Итак, вам нужен один из них, чтобы предоставить доступ к вашему развертыванию selenium:
apiVersion: v1
kind: Service
metadata:
name: selenium-hub
labels:
app: selenium-hub
spec:
ports:
- port: 4444
targetPort: 4444
name: port0
selector:
app: selenium-hub
type: NodePort
sessionAffinity: None
Для получения дополнительной информации https://github.com/kubernetes/examples/tree/master/staging/selenium