我在 Gitlab CI 中運行 selenium 測驗,但是在使用 gitlab runner 而不是我的電腦時正確設定遠程 URL 有問題。
跑步者的IP地址是192.168.xxx.xxx。當我運行管道時,我得到了 selenium hub 的 IP 地址是172.19.0.2/16. 我兩個都試過,都失敗了。我也嘗試使用 selenium hub container 的名稱http://selenium__hub,但它也失敗了。
docker-compose.yml 是:
version: "3"
services:
chrome:
image: selenium/node-chrome:4.0.0-20211013
container_name: chrome
shm_size: 2gb
depends_on:
- selenium-hub
volumes:
- ./target:/home/seluser/Downloads
environment:
- SE_EVENT_BUS_HOST=selenium-hub
- SE_EVENT_BUS_PUBLISH_PORT=4442
- SE_EVENT_BUS_SUBSCRIBE_PORT=4443
- SE_NODE_GRID_URL=http://localhost:4444
ports:
- "6900:5900"
edge:
image: selenium/node-edge:4.0.0-20211013
container_name: edge
shm_size: 2gb
depends_on:
- selenium-hub
volumes:
- ./target:/home/seluser/Downloads
environment:
- SE_EVENT_BUS_HOST=selenium-hub
- SE_EVENT_BUS_PUBLISH_PORT=4442
- SE_EVENT_BUS_SUBSCRIBE_PORT=4443
- SE_NODE_GRID_URL=http://localhost:4444
ports:
- "6901:5900"
firefox:
image: selenium/node-firefox:4.0.0-20211013
container_name: firefox
shm_size: 2gb
depends_on:
- selenium-hub
volumes:
- ./target:/home/seluser/Downloads
environment:
- SE_EVENT_BUS_HOST=selenium-hub
- SE_EVENT_BUS_PUBLISH_PORT=4442
- SE_EVENT_BUS_SUBSCRIBE_PORT=4443
- SE_NODE_GRID_URL=http://localhost:4444
ports:
- "6902:5900"
selenium-hub:
image: selenium/hub:4.0.0-20211013
container_name: selenium-hub
ports:
- "4444:4444"
gitlab runner 的組態檔如下所示:
[[runners]]
name = "selenium"
url = "https://gitlab.myhost.at"
token = "xxxxxxxx"
executor = "docker"
privileged = true
links = ["selenium__hub:hub"]
[runners.docker]
image = "docker:stable"
privileged = true
我試過的遠程網址是:
WebDriver driver = new RemoteWebDriver(new URL("http://192.168.xxx.xxx:4444/wd/hub"), cap);
WebDriver driver = new RemoteWebDriver(new URL("http://172.19.0.2:4444/wd/hub"), cap);
WebDriver driver = new RemoteWebDriver(new URL("http://selenium__hub:4444/wd/hub"), cap);
我怎樣才能讓它與 GitLab 跑步者一起作業?
uj5u.com熱心網友回復:
這里的問題是當您的作業使用 啟動容器時,您的作業容器docker-compose不知道 docker 網路中的主機名。
假設您docker:dind在作業中使用該服務docker-compose并嘗試連接到docker-cmpose從您的作業開始的服務,您將需要使用主機名docker通過其映射埠訪問您的服務。
所以你更正的代碼如下:
WebDriver driver = new RemoteWebDriver(new URL("http://docker:4444/wd/hub"), cap);
為什么是“碼頭工人”?
之所以需要這樣做,是因為您的容器“在”遠程 docker 守護行程服務——docker:dind容器上運行。當您呼叫docker-compose您的作業容器時,docker:dind容器會與容器對話,后者會啟動一個新的 docker 網路并在該網路上的撰寫檔案中創建 docker 容器。
您的作業容器不知道(或路由到)該網路,也不知道服務的主機名。服務守護行程本身也在與您的運行程式不同的網路上運行——因為它是由 docker 執行程式創建的另一個 docker 容器;所以你的跑步者 IP 也不起作用。
但是,docker executor確實會創建指向您的services:IEdocker:dind服務的鏈接。因此,您可以通過主機名訪問該容器docker。此外,您的撰寫檔案表明集線器服務應該4444:4444從主機 -> 容器進行埠映射。在這種情況下,主機意味著docker:dind服務。因此,http://docker:4444來自您的作業的呼叫會到達集線器服務。
為什么“鏈接”不起作用?
最后,為了覆寫最后一個細節,在您的運行器配置中,您希望links允許您通過主機名與集線器容器進行通信:
links = ["selenium__hub:hub"]
在運行器配置中,該links配置通常允許您的作業通過主機名與容器進行通信。但是,由于兩個原因,此配置是錯誤的:
- 此配置僅適用于運行器容器旁邊的容器。那是在主機守護行程上注冊的其他容器——不是由其他 docker 守護行程創建的容器,就像
docker-compose在你的作業中通過與docker:dind服務守護行程對話創建的容器一樣。 - 即使您可以訪問由其他守護程式創建的容器,或者您的集線器容器是由主機守護程式創建的,根據您嘗試的 URL,引數也是錯誤的。此配置基本上是說“將
selenium__hub容器公開為 FQDNhub”——但您從未嘗試過主機名hub。
這里沒有什么可修復的,因為 (1) 在使用 docker-in-docker 時不是可修復的錯誤。
備擇方案
或者,您可以利用 GitLab 的services:功能來運行集線器和/或瀏覽器容器。
my_job:
services:
- docker:dind
- name: selenium/hub:4.0.0-20211013
alias: hub # this is the hostname
您甚至可以將其作為運行器配置來執行并為其提供特殊標簽,并且需要遠程瀏覽器的作業只需添加必要的tags:鍵即可減少所需的作業配置量。
You may also be interested to see one of my other answers on how FF_NETWORK_PER_BUILD feature flag can affect how networking works between docker containers and jobs/services.
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/355804.html
