継続的インテグレーションテストにおける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 で中国語の文字化けが発生する問題に対する完璧な解決策

推薦する

CSSを使用してファイルアップロードパターンを描画する

以下に示すように、あなたならどのようにそれを達成しますか: 通常、フォントアイコンを使用して中央にプ...

Navicat を使用して MySQL データベースをエクスポートおよびインポートする方法

MySql は、私たちが頻繁に使用するデータ ソースです。開発者が練習、小規模なプライベート ゲーム...

Navicat for MySQL 15 登録とアクティベーションの詳細なチュートリアル

1. Navicat for MySQL 15をダウンロードするhttps://www.navica...

MySQL における datetime と timestamp の違いと使い方

1. MySQL で現在の時刻を表現するにはどうすればよいでしょうか?実際、表現方法はいろいろありま...

MySQLテクノロジーにおけるInnoDBロックの詳細な説明

目次序文1. ロックとは何ですか? 2. InnoDBストレージエンジンのロック2.1 ロックの種類...

Tomcat と WebLogic で純粋な HTML ファイルを展開するプロセスの分析

1. まず、純粋なHTMLファイルにはindex.htmlというエントリが必要です。 2. Tomc...

Nginx 1つのドメイン名で複数のプロジェクトにアクセスする方法の例

背景最近、複数のプロジェクトを展開する際に、1 つのドメイン名で複数のプロジェクトにアクセスする方法...

今日と昨日の 0:00 タイムスタンプを取得する MySQL の例

以下のように表示されます。昨日: UNIX_TIMESTAMP(CAST(SYSDATE() AS ...

フォーム要素とプロンプトテキストが揃っていない問題

最近のプロジェクトでは、多くのフォーム、特にチェックボックスとラジオボタンの作成が含まれます。しかし...

MySQL 8.0 の非表示列に対する基本操作

目次01 非表示の列を作成する02 非表示の列に対する基本操作03 非表示の列メタデータ04 主キー...

Vueルーティングナビゲーションガードの簡単な理解

目次1. グローバルガード1. グローバル前線警備2. グローバル解像度ガード3. グローバルポスト...

Win10 MySQLでCSVをエクスポートする2つの方法

Win10 で csv をエクスポートする方法は 2 つあります。1 つ目はツールを使用することです...

js はマウスインとマウスアウトによるカード切り替えコンテンツを実装します

この記事では、マウスでカード内外のコンテンツを切り替えるためのjsの具体的なコードを紹介します。具体...

MySQL マスタースレーブレプリケーションの実践の詳細説明 - ログポイントに基づくレプリケーション

ログポイントベースのレプリケーション1. マスターデータベースとスレーブデータベースに専用のレプリケ...

設定ファイルを変更した後、操作を再開します

余計なことは言わないで、コードだけ見てみましょう〜 # docker-compose をダウン # ...