Docker での Jenkins と Docker を使用した継続的デリバリー

Docker での Jenkins と Docker を使用した継続的デリバリー

1. 継続的デリバリーとは何か

ソフトウェア製品の出力プロセスは、ソフトウェアがいつでもリリースできる状態で安定的かつ継続的に維持されるように、短期間で完了する必要があります。その目標は、ソフトウェアをより迅速かつ頻繁に構築、テスト、リリースすることです。このアプローチにより、ソフトウェア開発のコストと時間を削減し、リスクを軽減できます。

2. 継続的デリバリーと従来のデリバリーの比較

従来の配信のリリース サイクルは、次の図のように表すことができます。

従来の配送方法の欠点:

配送が遅い: この場合、顧客は要件を指定してからかなり経ってから製品を受け取ります。その結果、市場投入までの時間が不十分になり、顧客からのフィードバックが遅れるという事態が発生しました。

長いフィードバック サイクル: フィードバック サイクルは顧客だけでなく開発者にも関係します。誤ってバグを作成し、UAT フェーズでそのバグに気付いたとします。 2 か月前に修正したものを修正するにはどれくらい時間がかかりますか? 小さなミスでも数週間かかることがあります。

危険なホット フィックス: ホット フィックスは通常、完全な UAT フェーズを待つことができないため、異なる方法でテストされるか (UAT フェーズが短縮される)、まったくテストされないことがよくあります。

ストレス: 予測できないリリースは運用チームにとってストレスになります。さらに、リリース サイクルは厳密にスケジュールされることが多く、開発者とテスト担当者にさらなるプレッシャーがかかります。

24 時間 365 日稼働する運用チームに多額の費用をかけずに製品を継続的に提供するには、自動化が必要です。そのため、継続的デリバリーとは、従来のデリバリー プロセスの各段階を、自動デプロイメント パイプラインまたは継続的デリバリー パイプラインと呼ばれる一連のスクリプトに変更することです。

その後、コードを変更するたびにプロセスを実行し、手動の手順を必要とせずに製品を継続的にユーザーに提供できます。

継続的デリバリーの利点:

迅速な納品: 開発が完了するとすぐに顧客は製品を使用できるため、市場投入までの時間が大幅に短縮されます。覚えておいてください、ソフトウェアはユーザーの手に渡ったときにのみ収益を生み出します。

迅速なフィードバック サイクル: コードにバグが発生し、そのバグが同日に本番環境に導入されたとします。その日に作業していたものを修正するのにどれくらいの時間がかかりますか? おそらくそれほど長くはかからないでしょう。これは、高速ロールバック戦略と組み合わせることで、生産を安定させる最善の方法です。

低リスクのリリース: 毎日リリースすると、プロセスが繰り返し可能になり、より安全になります。

柔軟なリリース オプション: すぐにリリースする必要がある場合、すべてがすでに準備されているため、リリースの決定に関連する追加の時間やコストは発生しません。

言うまでもなく、すべての配信段階を排除し、本番環境で直接開発することで、すべてのメリットを実現できます。ただし、品質の低下につながります。実際、継続的デリバリーを導入する際の最大の難しさは、手動の手順が削除されると品質が低下するのではないかという懸念です。安全に処理する方法を示し、継続的にバグが少なくなり、顧客のニーズにより適した製品を提供します。

3. 継続的デリバリーを実現する方法

自動デプロイメント パイプラインは、次の図に示すように 3 つのステージで構成されます。

各ステップは、次のように従来の配信プロセスの段階に対応します。

継続的インテグレーション: 異なる開発者によって書かれたコードが統合されていることを確認するチェック

自動受け入れテスト: これは手動のQAフェーズに代わるもので、開発者が実装した機能が顧客の要件を満たしているかどうかを確認します。

構成管理: 環境の構成とソフトウェアの導入という手動フェーズを置き換えます。

1. 継続的インテグレーション

継続的インテグレーションフェーズでは、開発者に最初のフィードバックが提供されます。リポジトリ (git、svn) からコードをチェックアウトし、コードをコンパイルし、ユニット テストを実行し、コードの品質を検証します。いずれかのステップが失敗すると、パイプラインの実行が停止され、開発者が最初に行うべきことは継続的インテグレーション ビルドを修正することです。

2. 自動受け入れテスト

自動受け入れテスト フェーズは、手動の UAT フェーズに代わる、QA と連携して作成された一連のテストです。製品のリリース準備ができているかどうかを判断するための品質チェックゲートとして機能します。いずれかの受け入れテストが失敗した場合、パイプラインの実行は停止され、それ以上のステップは実行されません。構成管理フェーズへの移行を妨げ、リリースを妨げます。

3. 構成管理

構成管理フェーズは、ソフトウェアとその環境の変更を追跡および制御する役割を担います。これには、必要なツールの準備とインストール、サービス インスタンスの数とその配布のスケーリング、インフラストラクチャ インベントリ、およびアプリケーションの展開に関連するすべてのタスクが含まれます。

構成管理は、運用環境でアプリケーションを手動で展開および構成する際に発生する問題に対するソリューションです。 Ansible、Chef、Puppet などの構成管理ツールは、バージョン管理システムに構成ファイルを保存し、運用サーバー上で行われたすべての変更を追跡することをサポートしています。

運用チームの手動タスクに代わるもう 1 つの仕事は、アプリケーションの監視です。これは通常、実行中のシステムから開発者 (または次のセクションで説明する DevOps チーム) が監視する共通ダッシュボードにログとメトリックをストリーミングすることによって行われます。

4. ツール

1.Dockerエコシステム

Docker はコンテナ化のリーダーとして、近年ソフトウェア業界を支配してきました。これにより、環境に依存しないイメージでアプリケーションをパッケージ化できるため、サーバーを、アプリケーションごとに構成する必要があるマシンではなく、リソース ファームとして扱うことができます。

Docker は (マイクロ) サービスと継続的デリバリー プロセスの世界に完璧に適合するため、当然の選択でした。

2.ジェンキンス

Jenkins は市場で最も人気のある自動化サーバーです。これは、継続的インテグレーションと継続的デリバリーのパイプラインの作成に役立ち、一般的には他の自動化用のスクリプトの作成にも役立ちます。非常にプラグイン指向で、常に新しい機能で拡張する素晴らしいコミュニティがあります。

さらに重要なのは、パイプラインをコードとして記述でき、分散ビルド環境をサポートできることです。

3. アンシブル

Ansible は、ソフトウェアのプロビジョニング、構成管理、アプリケーションの展開を支援する自動化ツールです。エージェントレス アーキテクチャを採用しており、Docker と適切に統合されています。

4.gitハブ

GitHub は間違いなくナンバーワンのホスト型バージョン管理システムです。非常に安定したシステム、Web ベースの UI、パブリック リポジトリを備えた無料サービスを提供します。

それでも、クラウド内かセルフホストか、Git、SVN、Mercurial、その他のツールのいずれに基づいているかに関係なく、あらゆるソース コントロール管理サービスまたはツールで継続的デリバリーを使用できます。

5. Dockerの実践

1. Dockerの概要

Docker は、ソフトウェア コンテナーを使用してアプリケーションの展開を容易にするために設計されたオープン ソース プロジェクトです。以下は Docker の公式ページからの引用です。

Docker コンテナは、コード、ランタイム、システム ツール、システム ライブラリなど、サーバーにインストールできるあらゆるものなど、実行に必要なすべてのものを含む完全なファイル システムにソフトウェアをラップします。これにより、環境に関係なく、ソフトウェアが常に同じように実行されることが保証されます。

したがって、仮想化と同様に、Docker を使用すると、アプリケーションをイメージにパッケージ化して、どこでも実行できるようになります。

2. 仮想化とコンテナ化

Docker がなくても、ハードウェア仮想化 (一般に仮想マシンと呼ばれる) を使用して分離やその他の利点を実現できます。最も人気のあるソリューションは、VirtualBox、VMware、Parallels です。

仮想マシンはコンピュータ アーキテクチャをエミュレートし、物理コンピュータの機能を提供します。各アプリケーションを個別の仮想マシン イメージとして配信および実行すると、アプリケーションの完全な分離を実現できます。次の図は仮想化の概念を示しています。

各アプリケーションは、すべての依存関係とゲスト オペレーティング システムを含むスタンドアロン イメージとして起動されます。イメージは、物理的なコンピューター アーキテクチャをエミュレートするハイパーバイザーによって実行されます。

このデプロイメント方法は、Vagrant などの多くのツールで広くサポートされており、開発およびテスト環境専用です。ただし、仮想化には 3 つの重大な欠点があります。

パフォーマンスが低い: 仮想マシンは、ゲスト オペレーティング システムを実行するためにコンピューター アーキテクチャ全体をエミュレートするため、各操作に大きなオーバーヘッドが発生します。

リソースの消費量が多い: シミュレーションには多くのリソースが必要であり、アプリケーションごとに個別に実行する必要があります。そのため、標準のデスクトップでは、同時に実行できるアプリケーションの数は限られています。

大きな画像: 各アプリケーションは完全なオペレーティング システムとともに配信されるため、サーバーに展開すると大量のデータが送信および保存されることになります。

次の図は、Docker によってもたらされる違いを示しています。

3. dockerのインストール

Docker のインストール プロセスは迅速かつ簡単です。最近ではほとんどの Linux オペレーティング システムがこれをサポートしており、その多くが専用のバイナリを提供しています。 Mac と Windows もネイティブ アプリで十分にサポートされています。

ただし、Docker は内部的には Linux カーネルとその仕様に基づいていることを理解することが重要です。そのため、Mac と Windows では、Docker エンジン環境を実行するために仮想マシン (Mac の場合は xhyve、Windows の場合は hyv) が使用されます。

ここでは、Linux 上の Ubuntu 16.04 での操作 (公式コマンド) についてのみ説明します。

$ sudo apt-getアップデート
$ sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 9DC858229FC7DD38854AE2D88D81803C0EBFCD88
$ sudo apt-add-repository 'deb [arch=amd64] https://download.docker.com/linux/ubuntu xenial main stable'
$ sudo apt-getアップデート
$ sudo apt-get install -y docker-ce

エラーメッセージが表示された場合:

次のコマンドを再度実行できます。

$ cd /etc/apt/sources.list.d
$ sudo vi docker.list
  deb https://download.docker.com/linux/ubuntu ゼスティエッジ
$ sudo aptアップデート
$ sudo apt install docker-ce

今回はエラーはありませんでしたが、docker-ce のダウンロードが比較的大きく、海外の Web サイトからのダウンロードであるため、速度が遅すぎることがわかりました。ここで、国内のソースに変更できます。手順は次のとおりです。

sudo apt-getアップデート 
sudo apt-get install \ apt-transport-https \ ca-certificates \ curl \ software-properties-common
curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key を追加します
sudo add-apt-repository "deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-getアップデート 
sudo apt-get で docker-ce をインストールします

インストールが完了したかどうかをテストします。docker -v または docker info は、docker に関する基本的な情報を表示し、インストールが成功したことを示します。

4. Dockerを実行する

docker 環境がインストールされました。まずは、非常に典型的な例である hello world を実行します。

$ docker run hello-world

次のメッセージが表示されたら、正常に実行されていることを意味します。

内部で何が起こっているのかを段階的に見ていきましょう。

1. run コマンドを使用して Docker クライアントを実行します。

2. Docker クライアントは Docker デーモンに接続し、hello-world という名前のイメージからコンテナを作成するように要求します。

3. Docker デーモンは、hello-world イメージがローカルに含まれているかどうかを確認し、含まれていない場合は、リモート Docker Hub レジストリから hello-world イメージを要求します。

4. Docker Hub レジストリには hello-world イメージが含まれているので、それを Docker デーモンにドロップします。

5. Docker デーモンは hello-world イメージから新しいコンテナを作成し、出力を生成する実行可能ファイルを起動しました。

6. Docker デーモンはこの出力を Docker クライアントにストリーミングします。

7.Docker クライアントはそれをターミナルに送信します。

5. イメージを構築する

イメージを構築するには 2 つの方法があります。

Docker コミット コマンドと Dockerfile 自動ビルド。 Docker がイメージを構築する方法について説明します。

ここでは Dockerfile メソッドについてのみ説明します。

commit コマンドを使用して各 Docker イメージを手動で作成するのは、特にビルド自動化や継続的デリバリー プロセスの場合には面倒な作業になる可能性があります。幸いなことに、Docker イメージを構築するために実行する必要があるすべての命令を指定するための組み込み言語があります。

1. DockerFile ファイルを作成し、次の内容を入力します。

ubuntu:16.04より
apt-get update を実行 && \
 apt-get install -y python

2. イメージをビルドするコマンドを実行します。

Ubuntu 16.04 で Docker をビルドします。

3. 次のコマンドを使用できます。

docker images で作成したイメージを確認します。

6.Dockerコンテナ

実行中のコンテナを表示するには、docker ps コマンドを使用できます。すべてのコンテナを表示するには、docker ps -a コマンドを使用します。コンテナはステートフルです。

イメージを介してコンテナを起動し、コンテナのステータスを表示します。

dockerコンテナを停止するには、次のコマンドを使用します: docker stop container id

7. tomcatを実行して外部アクセスを使用する

1. Tomcat イメージを実行します。

docker run -d tomcat

ただし、仮想マシンがネットワーク接続をブロックしているため、外部ブラウザは Tomcat ポート 8080 にアクセスできません。

コンテナを起動するときに、-pコマンドを使用して仮想ホストとDockerコンテナのネットワークポートマッピングを接続する必要があります。

2.-p スタート

docker run -d -p 8080:8080 tomcat

アクセスするには、次のように Web ページに仮想マシンの IP + ポートを入力します。

6. ジェンキンスの実践

1. Jenkinsの紹介

Jenkins は、Java で書かれたオープンソースの自動化サーバーです。非常に活発なコミュニティベースのサポートと多数のプラグインにより、継続的インテグレーションおよび継続的デリバリー プロセスを実装するための最も人気のあるツールです。

Jenkins は他の継続的インテグレーション ツールよりも優れており、同種のソフトウェアの中で最も広く使用されています。これはすべて、その特徴と機能性により可能になります。

2. Jenkinsをインストールする

Jenkins のインストール プロセスは迅速かつ簡単です。これを行うにはさまざまな方法がありますが、Docker ツールとその利点についてはすでに理解しているので、Docker ベースのソリューションから始めます。これは最も簡単で、予測可能で、賢いアプローチでもあります。

Jenkins をインストールするには、いくつかの環境要件があります。

Java 8 256MB の空きメモリ 1GB 以上の空きディスク容量

ただし、要件は Jenkins で何を行う予定かによって厳密に異なることを理解することが重要です。 Jenkins をチーム全体の継続的インテグレーション サーバーとして使用する場合は、小規模なチームであっても 1 GB 以上の空きメモリと 50 GB 以上の空きディスク領域が推奨されます。言うまでもなく、Jenkins は計算も実行し、ネットワーク経由で大量のデータを転送するため、CPU と帯域幅が重要になります。

Jenkins をインストールするには 2 つの方法があります。

1. Dockerイメージを使用する

2. Dockerイメージを使用しない

1. Dockerイメージを使用してJenkinsをインストールする

コマンドを使用します:

docker run -p <ホストポート>:8080 -v <ホストボリューム>:/var/jenkins_home jenkins:2.60.1

Web ページに URL を入力します。以下の画像はインストールが成功したことを示しています。

パスワードを入力すると、ログに初期パスワードが表示されます。

2. Dockerイメージを使わずにJenkinsをインストールする

インストールも非常に簡単で、次のコマンドを実行するだけです。

$ wget -q -O - https://pkg.jenkins.io/debian/jenkins.io.key | sudo apt-key を追加 -
$ sudo sh -c 'echo deb http://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'
$ sudo apt-getアップデート
$ sudo apt-get ジェンキンスをインストール

3.jenkins シンプルアプリケーション (hello world)

このルールに従って、最初の Jenkins パイプラインを作成する手順を見てみましょう。

[新しいアイテム]をクリックします。

プロジェクト名として hello world と入力し、パイプラインを選択して、OK をクリックします。

選択肢はたくさんあります。ここではそれらをスキップして、パイプライン部分に直接進みます。

[スクリプト] テキスト ボックスに、パイプライン スクリプトを入力できます。

パイプライン
   エージェント
   ステージ {
    ステージ("こんにちは") {
      手順 {
       「こんにちは世界」をエコーし​​ます
      }
    }
   }
  }

「保存して今すぐビルド」をクリックします。出力ログに次の図が表示されます。

7. 継続的インテグレーションパイプライン

1. パイプラインの紹介

パイプラインは、一連の自動化された操作として理解でき、単純なスクリプト チェーンとして考えることができます。

アクションのグループ化: アクションをステージ (ゲートまたは品質ゲートとも呼ばれる) にグループ化し、明確に定義されたルールでプロセスに構造を導入します。1 つのステージが失敗した場合、他のステージは実行されません。

可視性: プロセスのあらゆる側面が視覚化され、迅速な障害分析とチームのコラボレーションを促進します。

フィードバック: 問題が発生した場合はチームメンバーに通知され、迅速に対応できます。

2. パイプライン構造

Jenkins パイプラインは、ステージとステップという 2 つの要素で構成されます。次の図は、それらの使用方法を示しています。

3. パイプラインのHello World

パイプライン
  エージェント
  ステージ {
   ステージ('第1ステージ') {
    手順 {
     echo 'ステップ 1. Hello World'
    }
   }
   ステージ('第2ステージ') {
    手順 {
     echo 'ステップ 2. 2 回目の Hello'
     echo 'ステップ 3. 3 回目の Hello'
    }
   }
  }
}

ビルドが成功すると、次の画像が表示されます。

4. パイプラインのルール

エージェント: 実行が行われる場所を指定し、同じラベルを持つエージェントを一致させるためのラベルを定義したり、パイプライン実行の環境を提供するために動的に準備されたコンテナを指定するための docker を定義したりできます。

トリガー: これは、パイプラインが自動的にトリガーされる方法を定義し、リポジトリの変更を確認するために cron または pollScm を使用して時間ベースのスケジュールを設定するために使用できます (これについては、トリガーと通知のセクションで詳しく説明します)。

オプション: 特定のパイプラインのオプションを指定します。たとえば、タイムアウト (パイプラインが実行される最大時間) や再試行 (失敗後にパイプラインが再実行される回数) などです。

環境: ビルドプロセス中に環境変数として使用されるキー値のセットを定義します。

パラメータ: ユーザー入力パラメータのリストを定義します

ステージ: ステップを論理的にグループ化できます

いつ: 指定された条件に基づいてステージを実行するかどうかを決定します

これは最も基本的な知識であり、より高度な機能は後でリリースされる予定です。

要約する

以上が、Jenkins と Docker を使用して Docker で継続的デリバリーを実現する方法についてご紹介した内容です。お役に立てれば幸いです。ご質問がございましたら、メッセージを残していただければ、すぐに返信いたします。

以下もご興味があるかもしれません:
  • Docker+K8S+GitLab/SVN+Jenkins+Harbor をベースにした継続的インテグレーション配信環境の構築に関する詳細なチュートリアル
  • Docker に基づく持続可能な配信の問題

<<:  MySQL 5.7.21 winx64 のインストールと設定方法のグラフィックチュートリアル

>>:  シンプルな画像切り替えを実現するJavaScript

推薦する

background-positionプロパティでのパーセンテージ値の使用法の検討

背景位置が背景画像の表示に与える影響この2日間のプロジェクトでホームページの写真を入れ替えていたとこ...

CSS の position 属性の値に関する研究 (概要)

CSS の位​​置属性は要素の配置タイプを指定し、上、下、左、右を使用して要素を具体的に配置します...

HTML ではスペースはどのように表現されますか (どのような意味ですか)?

Web 開発では、次のような文字によく遭遇します: &nbsp;これは実際には HTML が...

nginx ip ブラックリストの動的禁止の例

ウェブサイトが悪意を持ってリクエストされた場合、IP アドレスをブラックリストに登録することは重要な...

MySQL PHP 構文の簡単な分析

まずcharAt関数の基本的な構文を見てみましょう文字 = str.charAt(インデックス) c...

Ubuntu 20.04 IPアドレスを変更する方法の例

例:本日、前回のオフィスコラボレーションプラットフォーム実験の続きをしていたところ、仮想マシンは以前...

MySQL の遅いクエリ操作の例の分析 [有効化、テスト、確認など]

この記事では、MySQL のスロー クエリ操作について例を挙げて説明します。ご参考までに、詳細は以下...

Linux の sudo 脆弱性により不正な特権アクセスが発生する可能性がある

Linux で新たに発見された sudo の脆弱性を悪用すると、特定のユーザーが root としてコ...

MySQL と接続関連のタイムアウトの詳細な概要

MySQL と接続関連のタイムアウト序文:今日、同僚から、データ量が多いときに MySQL データベ...

Ubuntu Server のターミナルのウェルカム メッセージで広告を無効にする方法

最新の Ubuntu Server バージョンを使用している場合、ようこそメッセージに、Ubuntu...

Python Django アプリケーションを Docker 化する方法

Docker は、開発者やシステム管理者がアプリケーションを軽量コンテナとして構築およびパッケージ化...

Vue は無限ロードウォーターフォールフローを実装します

この記事では、参考までに、無限ロードウォーターフォールフローを実現するためのVueの具体的なコードを...

Vueの計算プロパティの詳細な説明

1. 計算属性とは何ですか? 簡単に言えば、計算された結果が属性に保存されるもので、キャッシュとして...

Vue+element ui はアンカーの配置を実現します

この記事では、アンカー配置を実現するためのVue +要素UIの具体的なコードを例として紹介します。具...

誰もが知っておくべきウェブサイトのユーザビリティに関する 10 のヒント

これ以上時間を無駄にせず、早速本題に入りましょう。 1. ロゴに代替テキストを追加するこれには 2 ...