継続的インテグレーションテストにおけるDocker Swarmの適用の詳細な説明

継続的インテグレーションテストにおけるDocker Swarmの適用の詳細な説明

背景

アジャイル モデルは広く使用されており、テストは特に重要です。新しいバージョンは頻繁にリリースする必要があるため、そのバージョンに新しいバグが導入されないように、テストケースをより頻繁に実行する必要があります。

多くのリソースを消費するテスト結果の分析を含め、完全なテストプロセスに必要な時間とリソースは無視できません。品質を確保するために、いかにしてより短時間で完全かつ包括的なテストを提供するかは、私たちが解決したい問題であり、アジャイル開発をスムーズに進めるための鍵でもあります。

Jenkins は無人テスト プロセスを実装します。開発が完了し、テスト環境が正常に展開されると、下流のテスト タスクがすぐに実行されます。

Jenkins の適用により、ある程度の人的資源を節約でき、Docker テクノロジによりコンテナの急速な拡張を実現できるため、多くの設備リソースと時間を節約し、テストを迅速に完了できます。これは、図 1 に示すように、Jenkins パイプライン (コード パイプライン管理) の非常に重要な部分です。

図 1. Jenkins パイプライン

本記事では主にDocker Swarmのクラスタ機能とSelenium Gridのスクリプト配信機能を利用して、動的に拡張可能なSelenium自動化スクリプト実行環境を構築する方法を紹介します。 Selenium 自動化スクリプト実行環境として実機を使用する場合と比較して、この環境を使用すると、さまざまなブラウザの種類やバージョンの管理など、実行環境のメンテナンス作業を大幅に削減できます。また、スクリプト実行環境への材料投資を大幅に削減し、さまざまなリソースを節約することもできます。

Docker Swarm クラスターの構築

Swarmの紹介

Swarm は、Docker クラスターを管理するために Docker によって公式に提供されているクラスター管理ツールです。複数の Docker ホストを 1 つに抽象化し、これらの Docker ホスト上のさまざまな Docker リソースを統一されたエントリを通じて管理します。

Swarm は単なるスケジューラとルーターです。Swarm 自体はコンテナを実行しません。Swarm は Docker クライアントから送信されたリクエストを受け入れ、コンテナを実行する適切なノードをスケジュールするだけです。つまり、Swarm が何らかの理由でクラッシュした場合でも、クラスター内のノードは通常どおり実行され続けます。Swarm が実行を再開すると、クラスター情報を収集して再構築します。

Swarm は Kubernetes に似ていますが、Kubernetes よりも軽量で機能も少ないです。

環境の準備

Docker Swarm クラスター環境を構築するために、例では 2 台のマシンを用意しました。 1 つのノードはマネージャー ノードとしてもワーカー ノードとしても機能し、もう 1 つのノードはワーカー ノードとしてのみ機能します。

ここでは、2 台のマシンの IP 情報が次のとおりであると想定します。

  • M1: 10.13.181.1
  • M2: 10.13.181.2

バージョン 1.12.0 以降、Docker Engine には Docker Swarm がネイティブに統合されているため、各マシンに Docker がインストールされていれば、Docker Swarm を直接使用できます。ここでは、Docker のインストールについては詳しく説明しません。インストールについては、公式の Docker Swarm ドキュメントに従ってください。インストールが完了したら、各マシンで Docker サービスを開始します。

ヒント:

注: マシンのファイアウォールをオフにすることをお勧めします。そうしないと、Swarm クラスターのネットワーク接続に問題が発生する可能性があります。

ファイアウォールをシャットダウンするコマンド: systemctl stop firewalld.service

ファイアウォールの起動コマンドを無効にする: systemctl enable firewalld.service

ステップ

1. 管理ノードを作成します。

マシン M1 をマネージャー ノードとして使用し、このマシン上でコマンドを実行してクラスター環境を初期化します。コマンドは次のとおりです。

sudo docker swarm init --advertise-addr 10.13.181.1

このコマンドを実行すると、他のワーカーがこのクラスターに参加できるように、クラスターに参加するためのトークンが返されます。

リスト 1. クラスター参加トークンの例:

次のようにコードをコピーします
docker swarm に参加 --token SWMTKN-1-5p3kzxhsvlqonst5wr02hdo185kcpdajcu9omy4z5dpmlsyrzj-
3phtv1qkfdly2kchzxh0h1xft 10.13.181.1:2377

クラスターに再度参加するためのコマンドを取得する場合は、次のコマンドを実行します。

sudo docker swarm join-token ワーカー

2. マシン M1 をワーカー ノードとしてクラスターに追加します。

リスト 1 のコマンドをマネージャー ノード マシンで実行して、マシン M1 をワーカーとして Swarm クラスターに追加します。

3. 別のマシン M2 をワーカー ノードとしてクラスターに追加します。

上記のリスト 1 のコマンドをマシン M2 で実行して、M2 がクラスターに参加できるようにします。

4. 次のコマンドを実行してクラスター ネットワークを作成します。

sudo docker ネットワーク作成 -d オーバーレイ seleniumnet

ここで、seleniumnet は作成したクラスター ネットワークの名前です。

5. 新しく作成したクラスター ネットワーク上に Selenium Grid サービスを作成します。

a. Selenium Grid Hub サービスを作成します。クラスター ネットワーク seleniumnet に基づいて、ポート 4444 をクラスターのポート 4444 にマップし、タイムアウト時間を 120 秒に設定します。リスト 2 に示すように、タイムアウト時間を増減できます。

リスト 2. Selenium Grid Hub サービスの作成:

次のようにコードをコピーします
sudo docker サービス作成 --name selenium-hub --network seleniumnet -p 4444:4444 -e
GRID_TIMEOUT=120 セレン/ハブ

b. Selenium Grid Firefox ノード サービスを作成し、新しく作成したハブ サービスに接続します。リスト3に示すように。

リスト 3. Selenium Grid Firefox ノード サービスの作成:

sudo dockerサービス作成\
--name ノード-firefox \
--レプリカ 5 \
-p 7900:5900 \
--network セレンネット \
-e HUB_PORT_4444_TCP_ADDR=セレンハブ\
-e ハブポート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サービス作成\
--name ノード-chrome \
--レプリカ 3 \
-p 7901:5900 \
--network セレンネット \
-e HUB_PORT_4444_TCP_ADDR=セレンハブ\
-e ハブポート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 サービス ls

Selenium Hub、Firefox ノード、Chrome ノードがすべて正常に起動されていることがわかります。図 2 に示すように、Firefox のノード レプリカの数は 5 で、Chrome のノード レプリカの数は 3 です。

図2. Dockerサービスリスト

次に、任意のマシンの IP とポート 4444 を介して Selenium Hub URL を開き、起動した Firefox ノードと Chrome ノードが Hub ノードに正常にマウントされているかどうかを確認します (図 3 を参照)。

ハブ URL: 10.13.181.1:4444

図3. Selenium Hubインターフェース

図 3 からわかるように、5 つの Firefox ノードと 3 つの Chrome ノードがハブ ノードに正常にマウントされています。つまり、Selenium 自動テスト スクリプトを実行するために、Docker Swarm 環境で 5 つの Firefox ノードと 3 つの Chrome ノードが利用できるようになります。

拡張方法

ユーザーは、スクリプトの実行回数に応じていつでも動的にノードの数を拡張し、自動化されたスクリプトの実行効率を向上させることができます。たとえば、Firefox ブラウザを実行できるコンテナが 10 個必要な場合、対応するコマンドは次のようになります。

sudo docker サービススケール node-firefox=10

Docker Swarm で Jenkins ジョブを実行する

ユーザーが Docker Swarm で Jenkins ジョブを実行する場合、Jenkins で追加の構成を行う必要はありません。代わりに、対応する自動化スクリプトで Selenium Hub を呼び出して、WebDriver をリモートで呼び出す必要があります。これは、Docker コンテナで Selenium スクリプトを実行することを実装します。

この記事のシナリオを例にとると、以下に示すように、自動化スクリプトでリモート Selenium Hub を呼び出すだけで済みます。http://9.111.139.104:4444/wd/hub

Selenium Grid で自動化スクリプトを実行する

基本概念

Selenium Grid は分散自動テストに使用されます。つまり、Selenium コードのセットをさまざまな環境で実行できます。これにより、Docker によって提供されるさまざまなコンテナーでアプリケーションを簡単に実行できます。

Selenium Grid には 2 つの概念があります。

  • ハブ: 全体的なディスパッチ センターと考えることができるメイン ノード。
  • ノード: ブランチ ノード。実際にタスクを実行するワーカーと考えることができます。

つまり、Selenium Grid にはメイン ハブが 1 つしか存在できませんが、ローカルまたはリモートで複数のブランチ ノードを確立できます。テスト スクリプトはメイン ハブを指し、メイン ハブはテスト ケースをローカル/リモート ノードに割り当てます。

実装

Selenium Grid で自動化スクリプトを実行するには、まずリモート ドライバー オブジェクトを作成する必要があります。これは、図 4 のソース コードを使用して実現できます。スクリーンショットの対応する入力パラメーター selhub は、Selenium ハブの URL です: http://9.111.139.104:4444/wd/hub

図4. 自動化スクリプトコードのスクリーンショット

上記のドライバーを呼び出すことで、Docker コンテナ内で自動化スクリプトを実行できます。

結論

継続的インテグレーションテストでは、Docker Swarm にテストをデプロイし、Selenium Grid を通じてテストを実行するためのノードを自動的に割り当てることで、テストの効率を向上させ、テストの範囲を広げ、迅速な反復で提供される製品の品質をより確実にし、テストリソースを節約できます。

オリジナルリンク: https://www.ibm.com/developerw ... .html

以下もご興味があるかもしれません:
  • docker-swarm をベースにした継続的インテグレーション クラスタ サービスの構築の詳細な説明
  • Docker Swarm を使用して分散クローラー クラスターを構築する例
  • docker swarm は指定されたノード上で指定されたコンテナをどのように実行しますか?
  • Docker Swarm のサービス検出と負荷分散の原則の詳細な説明
  • docker swarm クラスターの障害と例外の詳細な説明
  • Docker Swarmを使用してクラスターを構築する方法
  • Docker Swarm 入門例
  • Docker 1.12 を使用してマルチホスト Docker Swarm クラスターを構築する詳細な説明
  • Dockerを簡単にインストールし、Docker Swarmモードを実行する
  • Docker をインストールして Docker Swarm モードで使用する方法

<<:  mysql order by in の文字順序の詳細な説明 (推奨)

>>:  Windows 7 の mysql6.x で中国語の文字化けが発生する問題に対する完璧な解決策

推薦する

nginx をシャットダウン/再起動/起動する方法

閉鎖サービス nginx 停止systemctl 停止 nginx起動するサービス nginx 開始...

IDEA で mysql8.0.3 と mybatis-generator を使用する際に発生するバグ

1. プラグインを追加し、pomファイルの下に次の設定を追加します。 <!-- mybatis...

CentOS の MySQL に MariaDB をインストールするときに発生する方法と問題

以前にインストールしたmariadbを削除する1. rpm -qa | grep mariadb を...

プレフィックスケースを削除する Nginx リバース プロキシ構成のチュートリアル

nginx をリバース プロキシとして使用する場合、リクエストをそのまま次のサービスに転送するだけで...

Flash が HTML div 要素を覆わないようにする方法

今日、フラッシュ広告のコードを書いていたとき、フラッシュに付属するリンクはポップアップ広告と間違われ...

アカウントとパスワードを記憶する機能を実現するVueの考え方とプロセス

目次実装のアイデアアカウント パスワードを保存する方法は 3 つあります。機能インターフェースアカウ...

MySQLが間違ったインデックスを選択する理由と解決策

MySQL では、テーブルに複数のインデックスを指定できますが、ステートメントの実行時に、使用するイ...

React 国際化 react-i18next の詳細な説明

導入react-i18next は、 i18nextをベースにした強力な国際化フレームワークです。 ...

ViteでReactプロジェクトを構築する方法

目次序文Viteプロジェクトを作成する改修プロジェクトディレクトリの規則その他の構成序文毎日鳩、火ば...

CMD で MySQL データベースを操作するときに中国語の文字化けが発生する問題の解決方法

Baiduで検索しました。 。 chcp コマンドを使用して、cmd の文字エンコーディングを 65...

CSS を使用して要素のスクロールバーを非表示にするサンプルコード

どの要素でもスクロールできるようにしながら、スクロールバーを非表示にするにはどうすればよいでしょうか...

h1、h2、h3タグを適切に使用する

Web ページを作成する過程では、<h1>、<h2>、<h3> ...

Centos 7.4 でリモート アクセス制御を実装する方法

1. SSHリモート管理SSH はセキュア チャネル プロトコルであり、主にリモート ログイン、リモ...

Ubuntu 18.04 Server に静的 IP を設定する方法

1. 背景Netplan は、Ubuntu システムのネットワーク設定を簡単に管理および構成できるよ...