歡迎光臨
每天分享高質量文章

Docker Swarm 在持續整合測試中的應用

背景

敏捷(Agile)樣式被廣泛應用,測試顯得尤為重要。由於需要頻繁釋出新的版本,我們需要更加頻繁的執行測試用例,以確保沒有新的 bug 被引入到版本中。
一個完整的測試流程所需要佔用的時間和資源也不可忽視,包括對測試結果的分析都要佔用大量的資源。如何在更短時間內,提供完整、全面的測試以保證質量,是我們急於解決的問題,也是保證敏捷開發能順利進行的關鍵。
Jenkins 實現了無人值守的測試流程,開髮結束後,一旦在測試環境部署成功,下游的測試任務就會即刻執行。
Jenkins 的應用在一定程度上節省了人力資源,而 Docker 技術可以實現容器 (Container)快速的拓展,從而節省了大量的裝置資源和時間,快速的完成測試。這在 Jenkins Pipeline(程式碼流水線管理)中是非常重要的一個環節,如圖 1 所示:
圖 1. Jenkins Pipeline
本文主要介紹如何利用 Docker Swarm 叢集功能和 Selenium Grid 指令碼分發功能,來搭建一個可以動態擴容的 Selenium 自動化指令碼執行環境。相比於用真實的機器作為 Selenium 自動化指令碼執行環境,使用此套環境可以極大的減少對執行環境的維護工作,比如各種瀏覽器型別的管理和版本的管理。也能極大的減少對指令碼執行環境的物質投入,節省各類資源。
搭建 Docker Swarm 叢集

Swarm 簡介
Swarm 是 Docker 官方提供的一款叢集管理工具,用來管理 Docker 叢集,它將若干臺 Docker 主機抽象為一個整體,並且透過一個入口統一管理這些 Docker 主機上的各種 Docker 資源。
Swarm 只是一個排程器(Scheduler)加路由器(Router),Swarm 自己不執行容器,它只是接受 Docker 客戶端傳送過來的請求,排程適合的節點來執行容器,這意味著,即使 Swarm 由於某些原因掛掉了,叢集中的節點也會照常執行,當 Swarm 重新恢復執行之後,它會收集重建叢集資訊。
Swarm 和 Kubernetes 比較類似,但是更加輕,具有的功能也較 Kubernetes 更少一些。
環境準備
為了搭建 Docker Swarm 叢集環境,我在示例中準備了兩臺機器。一臺作為 manager 節點,同時也作為一個 worker 節點,另一臺只作為一個 worker 節點。
這裡假設我們的兩個機器 IP 資訊如下:
  • M1:10.13.181.1

  • M2:10.13.181.2

Docker Engine 從 V1.12.0 版本開始,原生集成了 Docker Swarm,所以只要在每臺機器上安裝 Docker,就可以直接使用 Docker Swarm。在這裡,關於 Docker 的安裝不再詳細介紹,請按照官方 Docker Swarm 檔案[1]進行安裝。安裝完成後,在每臺機器上將 Docker 服務啟動。
提示:
註意:最好關閉機器上的防火牆,否則可能會出現 Swarm 叢集網路連線問題。
關閉防火牆的命令:systemctl stop firewalld.service
禁止防火牆開機啟動命令:systemctl disable firewalld.service
步驟
1、建立管理節點。
我們將機器 M1 作為 manager 節點,在這臺機器上執行命令來初始化叢集環境。命令如下:
sudo docker swarm init --advertise-addr 10.13.181.1

執行此命令後,會傳回一個用於加入叢集的令牌(Token),以便其他 worker 加入此叢集。
清單 1. 加入叢集令牌示例:
docker swarm join --token SWMTKN-1-5p3kzxhsvlqonst5wr02hdo185kcpdajcu9omy4z5dpmlsyrzj-
3phtv1qkfdly2kchzxh0h1xft 10.13.181.1:2377

如果想再次獲取加入叢集的命令,可以透過執行以下命令獲取:
sudo docker swarm join-token worker

2、將機器 M1 也作為 worker 節點新增到叢集。
在 manager 節點機器上執行清單 1 的命令,即可將機器 M1 也作為 worker 加入 swarm 叢集當中。
3、將另一臺機器 M2 作為 worker 節點新增到叢集。
在機器 M2 上執行上述清單 1 中的命令,即可實現 M2 加入叢集的功能。
4、執行如下命令建立叢集網路:
sudo docker network create -d overlay seleniumnet

這裡,seleniumnet 即是我們所建立的叢集網路名稱。
5、在新建的叢集網路上建立 Selenium Grid 服務。
a. 建立 Selenium Grid Hub 服務。基於叢集網路 seleniumnet,將 4444 埠對映到叢集的 4444 埠,將 timeout 時間設定為 120 秒,可以增大或減少 timeout 時間,如清單 2 所示。
清單 2. 建立 Selenium Grid Hub 服務:
sudo docker service create --name selenium-hub --network seleniumnet -p 4444:4444 -e 
GRID_TIMEOUT=120 selenium/hub

b. 建立 Selenium Grid Firefox 節點服務並連線到剛建立 Hub 服務。如清單 3 所示。
清單 3. 建立 Selenium Grid Firefox 節點服務:
sudo docker service create \
  --name node-firefox \
  --replicas 5 \
  -p 7900:5900 \
  --network seleniumnet \
  -e HUB_PORT_4444_TCP_ADDR=selenium-hub \
  -e HUB_PORT_4444_TCP_PORT=4444 \
  selenium/node-firefox-debug bash -c 'SE_OPTS="-host $HOSTNAME" /opt/bin/entry_point.sh'

引數說明:
-p: 7900:5900 將 Docker 內部 VNC5900 暴露到宿主機的 7900 埠,使得使用者可以透過 VNC 從外面監控 Docker 內部的執行情況。
c. 建立 Selenium Grid Chrome Node 服務並連線到剛建立 Hub 服務。如清單 4 所示。
清單 4. 建立節點服務:
sudo docker service create \
  --name node-chrome \
  --replicas 3 \
  -p 7901:5900 \
  --network seleniumnet \
  -e HUB_PORT_4444_TCP_ADDR=selenium-hub \
  -e HUB_PORT_4444_TCP_PORT=4444 \
  selenium/node-chrome-debug bash -c 'SE_OPTS="-host $HOSTNAME" 
  /opt/bin/entry_point.sh'


引數說明:
-p: 7901:5900 將 Docker 內部 VNC5900 暴露到宿主機的 7901 埠,使得使用者可以透過 VNC 從外面監控 Docker 內部的執行情況。
6、檢查環境搭建是否成功。在機器 M1 上執行以下命令,檢視每個服務是否啟動成功:
sudo docker service ls

可以看到 Selenium Hub 和 Firefox 節點、Chrome 節點都已經成功啟動。Firefox 的節點副本是 5,Chrome 的節點副本是 3,如圖 2 所示。
圖 2. Docker 服務清單
我們再透過任意一臺機器的 IP 加 4444 埠來開啟 Selenium Hub URL 來檢視已啟動的 Firefox 和 Chrome 節點是否已經成功掛載到 Hub 節點上,如圖 3 所示。
Hub url: 10.13.181.1:4444
圖 3. Selenium Hub 的介面圖
從圖 3 可以看出,5 個 Firefox 節點和 3 個 Chrome 節點都已經成功掛載到 Hub 節點上。說明此時 Docker Swarm 環境裡已經提供了 5 個 Firefox 節點和 3 個 Chrome 節點可以用來執行 Selenium 自動化測試指令碼。
擴容方法
使用者可以根據指令碼執行數量,隨時動態的擴容各個節點的數量,提高自動化指令碼的執行效率,例如我們需要 10 個可以執行 Firefox 瀏覽器的 Container,對應的命令如下:
sudo docker service scale node-firefox=10

在 Docker Swarm 執行 Jenkins Job

使用者在 Docker Swarm 中執行 Jenkins Job,並不需要在 Jenkins 做多餘的配置,而是需要在對應的自動化指令碼中呼叫 Selenium Hub,從而以遠端的方式呼叫 WebDriver。這樣就實現了在 Docker Container 中執行 Selenium 指令碼。
以本文中的場景為例,只需要在自動化指令碼中呼叫遠端 Selenium Hub 即可,如下所示:
http://9.111.139.104:4444/wd/hub

在 Selenium Grid 中執行自動化指令碼

基本概念
Selenium Grid,用於分散式自動化測試,也就是說一套 Selenium 程式碼可在不同的環境上執行,這樣做可以方便的將應用執行在 Docker 所提供的不同 Container 中。
Selenium Grid 有兩個概念:
  • Hub:主節點,你可以看作總排程中心。

  • Node:分支節點,你可以看作是真正執行任務的 worker。

也就是說在 Selenium Grid 中只能有一個主 Hub,但可以在本地或遠端建立 N 多個分支節點,測試指令碼指向主 Hub,由主 Hub 分配給本地/遠端節點執行測試用例。
實現方式
要實現在 Selenium Grid 中執行自動化指令碼,首先我們要建立一個 remote driver 的物件,可以透過圖 4 原始碼實現,截圖中所對應的輸入引數 selhub 是 Selenium hub 的 URL:
http://9.111.139.104:4444/wd/hub

圖 4. 自動化指令碼的程式碼截圖
透過呼叫上述的 driver,就可以實現將自動化指令碼執行在 Docker Container 中。
結束語

在持續整合測試中,將測試部署到 Docker Swarm 中,透過 Selenium Grid 自動分配執行測試的節點,可以提升測試效率,增大測試的範圍,在快速迭代中能夠更好的保證所交付的產品質量,節省測試資源。
相關連結:
  1. https://docs.docker.com/swarm/

原文連結:https://www.ibm.com/developerworks/cn/devops/d-docker-swarm-ci-test-application/index.html

Kubernetes應用實戰培訓

Kubernetes應用實戰培訓將於2018年11月9日在北京開課,3天時間帶你係統學習Kubernetes本次培訓包括:容器特性、映象、網路;Docker特性、架構、元件、概念、Runtime;Docker安全;Docker實踐;Kubernetes架構、核心元件、基本功能;Kubernetes設計理念、架構設計、基本功能、常用物件、設計原則;Kubernetes的實踐、執行時、網路、外掛已經落地經驗;微服務架構、DevOps等,點選下方圖片檢視詳情。

贊(0)

分享創造快樂