1. 序章

この記事では、 Jenkins Marathon Mesosを使用して単純な継続的デリバリーパイプラインを実装します。

最初に、テクノロジースタックとアーキテクチャの概要を示し、すべてがどのように組み合わされているかを説明します。 続いて、実用的なステップバイステップの例に移ります。

この結果、完全に自動化されたJenkinsパイプラインが作成され、Marathonを使用してアプリケーションがMesosクラスターにデプロイされます。

2. テクノロジースタックの概要

コンテナーとマイクロサービスアーキテクチャを使用する場合、従来のスタックでは実行できなかった新しい運用上の問題に直面します。

たとえば、クラスターにデプロイする場合、スケーリング、フェイルオーバー、ネットワーキングなどに対処する必要があります。 これらの困難な分散コンピューティングの問題は、ApacheMesosやMarathonなどの分散カーネルとスケジューラーで解決できます。

2.1. Mesos

Mesosは、簡単に言えば、アプリケーションが実行される単一のサーバーと見なすことができます。 実際には、クラスターがありますが、この抽象化が非常に便利です。

2.2. マラソン

Marathonは、アプリケーションをMesosにデプロイするために使用されるフレームワークであり、困難な問題(ヘルスチェック、自動スケーリング、フェイルオーバー、監視など)を解決します。

3. セットアップとインストール

この記事は、すでにJenkins、Mesos、Marathonが実行されていることを前提としています。 そうでない場合は、それぞれの公式ドキュメントを参照して、セットアップ方法を確認してください。 これがないと、ガイドのどの手順も実装できません。

4. 私たちの配達パイプライン

次のJenkinsパイプラインを作成します。

 

このアプローチについては特に複雑なことは何もありません。これは、最新のCDパイプラインのフローと同義です。 この場合、ビルドとはアプリケーションをコンテナー化することを意味し、デプロイとはMarathonを使用してMesosクラスターでアプリケーションをスケジュールすることを意味します。

5. アプリケーションのテストと構築

最初のステップは、アプリケーションをビルドしてテストすることです。 簡単にするために、使用するアプリケーションはSpringBootアプリケーションです。 このため、結果のアーティファクトは実行可能なjarになります。 JRE以外の外部依存関係がないため、実行が非常に簡単です。

5.1. 私たちの仕事を作成する

私たちが最初にやりたいことは、ジェンキンスの仕事を作ることです。 左側のナビゲーションバーで[新しいアイテム]を選択し、[フリースタイルプロジェクトの作成]を選択して、「 marathon-mesos-demo という名前を付けます。

5.2. Gitとの統合

次に、アプリケーションを含むGithubリポジトリのクローンを作成するように構成しましょう。

簡単にするために、リポジトリは公開されています。つまり、httpsを介してクローンを作成できます。これが当てはまらず、SSH経由でクローンを作成している場合は、この記事の範囲を超えて、SSHユーザーと秘密鍵を設定するための追加の手順があります。

5.3. ビルドトリガーの設定

次に、ビルドトリガーをいくつか設定して、ジョブが毎分新しいコミットについてgitをポーリングするようにします。

5.4. ビルドスクリプトの生成

これで、実行時にシェルスクリプトを実行するようにジョブに指示できます。 単純なSpringBootMavenプロジェクトで作業しているので、必要なのはコマンド「 mvncleaninstall」を実行することだけです。 これにより、すべてのテストが実行され、実行可能jar がビルドされます。

5.5. プロジェクトの構築

これでパイプラインの開始が設定されました。ジョブで[今すぐビルド]をクリックして手動でトリガーしてみましょう。 ジョブが終了すると、青色でマークされて合格したことを確認できます。

6. アプリケーションのコンテナ化

パイプラインの次の段階であるDockerを使用したアプリケーションのパッケージ化と公開に移りましょう。 コンテナは特にMarathonが管理するものであるため、Dockerを使用する必要があります。 事実上何でもコンテナ内で実行できるため、これは不合理ではありません。 Marathonのようなツールは、これらによって付与された抽象化を使用する方が簡単です。

6.1. Dockerfileの作成

まず、プロジェクトルートにDockerfileを作成しましょう。 基本的に、Dockerfileは、イメージの構築方法に関するDockerDeamonへの指示を含むファイルです。

FROM openjdk:8-jre-alpine
ADD target/mesos-marathon-0.0.1-SNAPSHOT.jar app.jar
EXPOSE 8082 
ENTRYPOINT ["java","-jar","/app.jar"]

作成しているイメージは単純です。含まれているのは、実行可能jarと、コンテナーの起動時に実行するシェルコマンドだけです。 また、アプリケーションがリッスンするポート(この場合は「8082」)を公開していることを確認する必要があります。

6.2. 画像の公開

イメージをビルドできるようになったので、イメージをビルドしてプライベート Docker Hub リポジトリに公開する簡単なbashスクリプトを作成し、プロジェクトルートに配置します。

#!/usr/bin/env bash
set -e
docker login -u baeldung -p $DOCKER_PASSWORD
docker build -t baeldung/mesos-marathon-demo:$BUILD_NUMBER .
docker push baeldung/mesos-marathon-demo:$BUILD_NUMBER

イメージをパブリックDockerレジストリまたはプライベートレジストリにプッシュする必要がある場合があります。

$ BUILD_NUMBER 環境変数は、Jenkinsによって入力され、ビルドごとに増分されます。 少しもろいですが、各ビルドのバージョン数を増やすための簡単な方法です。 $ DOCKER_PASSWORD にもJenkinsが入力されます。この場合、EnvInjectプラグインを使用して秘密を保持します。

このスクリプトをJenkinsに直接保存することもできますが、プロジェクトの他の部分と一緒にバージョン管理および監査できるため、バージョン管理を維持することをお勧めします。

6.3. Jenkinsでの構築と公開

次に、jarをビルドした後に「Dockerise.sh」を実行するようにJenkinsジョブを変更しましょう。

 

次に、ジョブを実行してもう一度確認し、青くなることですべてが機能していることを確認します。

7. イメージのデプロイ

パイプラインはほぼ完成しています。 あと1つだけステージがあります。それは、Marathonを使用してアプリケーションをMesosクラスターにデプロイすることです。

Jenkinsには、「 DeploywithMarathon」プラグインが付属しています。 これはMarathonAPIのラッパーとして機能し、従来のシェルスクリプトを使用する場合よりも簡単になります。 プラグインマネージャーを介してインストールできます。

7.1. Marathon.Jsonファイルの作成

Marathonプラグインを使用する前に、「marathon.json」ファイルを作成し、プロジェクトルートに保存する必要があります。 これは、プラグインがそれに依存しているためです。

このファイル:「marathon.json」には、Mesosアプリケーション定義が含まれています。 これは、実行したい長時間実行サービス(アプリケーション)の説明です。 最終的に、JenkinsMarathonプラグインはファイルの内容をMarathon / v2 /appsエンドポイントにPOSTします。 次に、Marathonは、定義されたアプリケーションをMesosで実行するようにスケジュールします。

{
  "id": "mesos-marathon-demo",
  "container": {
    "type": "DOCKER",
    "docker": {
      "image": "",
      "network": "BRIDGE",
      "portMappings": [
        { "containerPort": 8082, "hostPort": 0 }
      ]
    }
  }
}

これは、コンテナー化されたアプリケーションに提供できる最も単純な構成です。

Mesosスレーブからアプリケーションにアクセスできるようにするには、プロパティ「portMappings」を正しく設定する必要があります。 これは基本的に、コンテナポート 8082 をホスト(mesosスレーブ)のランダムポートにマップして、外部からアプリケーションと通信できるようにすることを意味します。 アプリケーションをデプロイした後、Marathonはそのポートが何を使用したかを教えてくれます。

7.2. MarathonDeploymentビルドステップの追加

MarathonDeploymentのビルド後のアクションをジョブに追加しましょう。

Marathonが実行されている場所(この場合は「localhost:8081」)をプラグインに通知していることに注意してください。 また、デプロイするイメージも伝えています。 これは、ファイルの空の「画像」フィールドが置き換えられるものです。

これでパイプラインの最終段階が作成されました。もう一度ジョブを実行して、それがまだ通過していることを確認しましょう。今回は、アプリケーションをMarathonに送信する追加の手順を実行します。

7.3. マラソンでの展開の検証

これでデプロイされました。MarathonUIを見てみましょう。

 

ご覧のとおり、アプリケーションがUIに表示されています。 アクセスするには、割り当てられているホストとポートを確認する必要があります。

この場合、ローカルホストのポート31143がランダムに割り当てられ、アプリケーション定義で構成されているように、コンテナーのポート8082に内部的にマップされます。 次に、ブラウザでこのURLにアクセスして、アプリケーションが正しく提供されていることを確認できます。

8. 結論

この記事では、Jenkins、Marathon、Mesosを使用して単純な継続的デリバリーパイプラインを作成しました。 コードに変更をプッシュするたびに、数分後の環境で実行されます。

このシリーズの後半の記事では、アプリケーションのヘルスチェック、スケーリング、フェイルオーバーなど、より高度なMarathonのトピックについて説明します。 バッチ処理など、Mesosの他のユースケースもカバーされる場合があります。

このアプリケーションのソースコードは、GitHubで入手できます。 これは、そのまま実行できるはずのMavenプロジェクトです。