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

推薦する

Excel エクスポートは docker 環境では常に失敗する

Excel のエクスポートは、docker 環境では常に失敗します。最も直接的な原因は、中国語フォン...

CentOS7 での mysql 5.7.23 のバイナリ インストール

インターネット上のインストール情報は不均一で、落とし穴だらけです。インストールにはかなりの労力がかか...

Linux に MySQL をインストールする方法 (yum とソース コードのコンパイル)

Linux に MySQL をインストールするには、yum インストールとソース コード コンパイ...

CSS のフィルター属性とバックドロップフィルターの適用と違いの詳細な説明

フィルターとバックドロップフィルターにはいくつかの違いがあります。フィルターは現在の要素だけでなく、...

jsはテーブルの追加と削除の操作を動的に実装します

この記事の例では、jsでテーブルを動的に追加および削除するための具体的なコードを参考までに共有してい...

Docker+Jenkinsによる自動デプロイの実現方法

Code Cloud を使用して Git コード ストレージ ウェアハウスを構築するhttps://...

ウェブページ読み込み時に左右にジャンプする原因の分析と解決

最近、ウェブサイトを設計するときにこの問題に遭遇しています。メンバーセンターを設計し、コンテンツを ...

Vueはドラッグアンドドロップを使用して構造ツリーを作成します

この記事の例では、ドラッグアンドドロップを使用して構造ツリーを作成するVueの具体的なコードを共有し...

ウェブページの幅を携帯電話の画面(ビューポート)の幅に自動的に適応させる実装コード

一般的な書き方は次のとおりです。 XML/HTML コードコンテンツをクリップボードにコピー<...

WeChatアプレットはユーザーログインモジュールサーバーの構築を実装します

サーバーの構築には node.js を選択しました。まだインストールしていない方は、私の他の nod...

Docker を使用してフロントエンド アプリケーションをデプロイする方法

Dockerはますます普及しています。環境を軽量かつ柔軟に分離し、容量を拡張し、運用保守管理を容易に...

MySQLテーブルのフィールドと関連属性をエクスポートする手順

データベース内のテーブルのフィールドとプロパティをエクスポートし、テーブルを作成してWordに保存す...

Baidu Maps を Web ページに埋め込み、Baidu Maps API を使用してマップをカスタマイズする詳細な手順

ウェブページにBaiduマップを挿入するBaidu Maps を自分の Web ページに追加したい場...

Linux 型バージョン メモリ ディスク クエリ コマンド紹介

1. まず、Linux システムのバージョン内容について概要を説明します。 1. カーネルバージョン...

CentOS 7 で PHP 5.4 を 5.6 にアップグレードする方法の簡単な分析

1.ターミナルに入ったらPHPのバージョンを確認するphp -v出力は次のようになります。 PHP ...