buildkite での testcontainers テストの実行

Buildkite は、プラグインの豊富なエコシステムにより、現代の複雑なソフトウェア開発ニーズに対応する強力なCI/CDプラットフォームです。 Buildkite は、カスタマイズ可能なランナー、動的パイプライン、リアルタイム テスト分析、その他多くの機能をサポートする、非常にスケーラブルな CI/CD プラットフォームを提供します。

Testcontainers は、開発およびテストのユースケース向けに使い捨てのオンデマンドコンテナをプロビジョニングするためのオープンソースフレームワークです。 Testcontainersを使用すると、データベース、メッセージブローカー、Webブラウザー、またはDockerコンテナで実行できるほぼすべてのものを簡単に操作できます。

この記事では、Buildkite プラットフォームで Testcontainers ベースのテストを実行する方法について説明します。 ここでは、 GitHub で見つけられる Java/Spring Boot アプリケーションの例を使用します。

buildkite で testcontainers テストを実行しているバナー

Buildkite の使用を開始する

Buildkite Pipelines 機能では、次のもので構成されるハイブリッド アーキテクチャを使用します。

  • Buildkite ダッシュボード: CI/CD パイプラインを管理するための SaaS (Software-as-a-Service) コントロール パネル。 これにより、エージェントとの作業が調整され、結果が表示されます。
  • エージェント: 小さく、信頼性が高く、クロスプラットフォームのビルドランナー。 これらは、オンプレミスまたはクラウドでホストされます。 彼らは、Buildkiteダッシュボードから受け取った作業を実行します。

図 1 は、SaaS プラットフォームとインフラストラクチャで実行されているエージェントとの間の Buildkite の分割を示しています。

buildkite エージェント API を含む saas プラットフォーム要素を示す図と、インフラストラクチャで実行されているエージェントにつながる矢印。
図 1: インフラストラクチャ上の Buildkite エージェント。 (情報源: Buildkite)

Buildkiteを使用するには、まずアカウントに サインアップ する必要があります。 メールアドレスとパスワードを使用してサインアップするか、GitHubでサインアップできます。 アカウントを作成したら、パイプライン、テストスイート、チーム、ダッシュボードの中心的な場所である組織を作成できます。 次のステップは、エージェントを設定することです。

エージェントのセットアップ

Buildkiteエージェントは、小型で信頼性の高いクロスプラットフォームのビルドランナーであり、独自のインフラストラクチャで自動ビルドを簡単に実行できます。 エージェントの主な役割は、作業の buildkite.com ポーリング、ビルド ジョブの実行、ジョブのステータス コードと出力ログの報告、ジョブの成果物のアップロードです。

Buildkiteエージェントは、さまざまなオペレーティングシステムやクラウドプラットフォームにインストールできます。 組織の ダッシュボード (https://buildkite.com/<organization>) に移動したら、上部のナビゲーション バーで [エージェント ] をクリックします。 さまざまなプラットフォームについては、エージェント クイック スタート ガイドを参照してください。

このチュートリアルでは、エージェントとしてUbuntuVMを使用します。 Ubuntu VMをローカルに作成することも、AWS、Azure、GCPなどの任意のクラウドプラットフォーム上のUbuntuOSに基づいてVMを作成することもできます。

手記: 実際のビルドはエージェントで実行されます。 そのため、ワークロードを実行できるように十分なRAMとストレージスペースが割り当てられていることを確認してください。

エージェントのクイックスタートガイドで、Ubuntuをクリックし、指示に従ってBuildkiteエージェントをインストールします。エージェントを正常にインストールした場合は、図 2の例のように [エージェント] ページにエージェントが一覧表示されます。

buildkite-ubuntu-1 エージェントページにリストされているスクリーンショット。
図 2: [エージェント] ページにリストされている Buildkite エージェント。

実際のビルドはエージェントで実行されるため、ビルドパイプラインを実行するために必要なソフトウェアがインストールされている必要があります。 私たちのアプリケーションはテストにTestcontainersを使用するJava / Spring Boot 3 アプリケーションであるため、エージェントにはJava 17+とDockerがインストールされている必要があります。

Ubuntu VMで、次のコマンドを使用してJava 17 をインストールしましょう。

$ sudo apt install openjdk-17-jdk
$ java -version
openjdk version "17.0.8.1" 2023-08-24
OpenJDK Runtime Environment (build 17.0.8.1+1-Ubuntu-0ubuntu123.04)
OpenJDK 64-Bit Server VM (build 17.0.8.1+1-Ubuntu-0ubuntu123.04, mixed mode, sharing)

次に、 公式ドキュメントに従って、UbuntuVMにDockerをインストールします。 Buildkite エージェントは、ユーザー buildkite-agent でエージェントを実行します。 それでは、次のコマンドを使用して、ユーザー「buildkite-agent」をdockerグループに追加しましょう。

sudo usermod -aG docker buildkite-agent

グループの変更を有効にするには、Ubuntu VM を再起動し、エージェントでビルド パイプラインを実行しても問題ないはずです。

プロジェクトのセットアップ

次に、GitHub でプロジェクトを作成し、CI プラットフォームとして Buildkite Pipelines を使用するように構成します。 すでにアプリケーションがある場合は、そのアプリケーションを使用するか、新しいプロジェクトを作成できます。

テストに Testcontainers を使用する Spring Boot アプリケーションである testcontainers-showcase リポジトリを使用します。

プロジェクトのルート ディレクトリに次の内容のファイルを作成し .buildkite/pipelines.yml 変更をコミットしてプッシュします。

steps:
 - label: "Test"
   commands:
     - ./mvnw test
     # if you are using Gradle
     # - ./gradlew test

Buildkite パイプラインのセットアップ

次に、Buildkite ダッシュボードに移動し、[新しいパイプライン] ボタンを選択し、次の手順に従ってプロジェクトのパイプラインを構成します。

  1. 「Git リポジトリ URL」に「https://github.com/testcontainers/testcontainers-showcase.git と入力します。
  2. 「名前」に「testcontainers-showcase」と入力します。
  3. [ステップ] セクションで、[追加] ボタンを選択し、[リポジトリからステップを読み取る] オプションを選択します。これにより、リポジトリ内の .buildkite/pipeline.yml ファイルからパイプライン定義が読み取られます。
  4. [ パイプラインの作成] ボタンを選択します。
  5. 必要に応じて、次の手順で説明するように Webhook を構成して、リポジトリに変更をプッシュするたびにビルドがトリガーされるようにすることができます。

次に、[ 新しいビルド ] ボタンを選択してパイプラインを手動でトリガーし、 [メッセージ] を指定して、[ ビルドの作成 ] ボタンを選択します。 

Buildkite パイプラインは、図 3に示すように正常に実行されるはずです。

最初のビルドと成功したビルドを示す緑色のチェックマークを示す testcontainers-showcase ページのスクリーンショット。
図 3: ビルドの実行が成功しました。

Ubuntu VMを使用してBuildkiteエージェントを作成しましたが、Dockerコンテナをエージェントとして使用するなど、他のオプションもあります。 Dockerコンテナ内でDockerを設定するのは、特定の環境では難しいです。

そこで登場するのが Testcontainers Cloud で、Testcontainersベースのテストをよりシンプルかつ確実に実行しやすくします。

Testcontainers Cloudを使用すると、エージェントでDockerデーモンを実行する必要さえなく、コンテナはオンデマンドクラウド環境で実行されるため、ビルドに高CPU/メモリの強力なCIエージェントを使用する必要がなくなります。

最小限のセットアップでTestcontainers Cloudを使用し、Testcontainersベースのテストを実行する方法を見てみましょう。

Testcontainers Cloudのセットアップ

Testcontainers Cloud は、依存するサービスをクラウド上の Docker コンテナとしてスピンアップし、それらのサービスに接続してテストを実行することで、Testcontainers ベースのテストを大規模に実行するのに役立ちます。

Testcontainers Cloudアカウントをまだお持ちでない場合は、次のようにアカウントを作成し、サービスアカウントトークンを取得してください。

  1. https://app.testcontainers.cloud/signup でTestcontainers Cloudアカウントにサインアップします。
  2. ログインしたら、組織を作成します。
  3. Testcontainers Cloud ダッシュボードに移動し、サービスアカウントを生成します(図 4)。
新しいサービスアカウントを作成するためのページのスクリーンショットで、アクセストークンを再度表示できなくなるため、アクセストークンをコピーするようにリマインダーが表示されます。
図 4: 新しいサービス アカウントを作成します。

次に、 TC_CLOUD_TOKEN を環境変数として設定する必要があります。 パイプラインシークレットの管理で述べたように、AWS Secrets Manager、Hashicorp Vaultなどのさまざまなシークレットストレージサービスを使用して、機密情報を保存できます。また、Buildkiteエージェントの環境フックを使用して、シークレットをジョブにエクスポートすることもできます。

このチュートリアルでは簡単にするために、環境フックを使用して TC_CLOUD_TOKEN を環境変数として構成しましょう。 ディレクトリに environment という名前のファイルを作成し /etc/buildkite-agent/hooks/ 次の内容で作成します。

#!/bin/bash
export TC_CLOUD_TOKEN=<YOUR_TOKEN_VALUE>
set -e

次に、次のように .buildkite/pipelines.yml ファイルを更新します。

steps:
 - label: "Test"
   commands:
     - sh -c "$(curl -fsSL https://get.testcontainers.cloud/bash)"
     - ./mvnw test

テストを実行する前に、環境フックを使用して TC_CLOUD_TOKEN を環境変数として受け取るTestcontainers Cloudエージェントを起動するコマンドを含めました。

これで、更新された .buildkite/pipelines.yml ファイルをコミットしてプッシュすると、パイプラインは Testcontainers Cloud を使用してテストを実行します。 Testcontainers ベースのテストがデフォルトの Docker デーモンではなく Testcontainers Cloud を使用していることを示す次の logs ステートメントが表示されます。

Running global environment hook
$ /etc/buildkite-agent/hooks/environment
# TC_CLOUD_TOKEN added
...
...
...
04:19:19.600 [Test worker] INFO  org.testcontainers.DockerClientFactory - Connected to docker:
 Server Version: 78+testcontainerscloud (via Testcontainers Desktop 1.5.3)
 API Version: 1.43
 Operating System: Ubuntu 20.04 LTS
 Total Memory: 7407 MB

Testcontainers Cloudの有料会員のお客様は、Testcontainers Cloudのターボモードを、並列実行機能を備えたビルドツールと組み合わせて活用し、テストをさらに高速に実行することもできます。 Testcontainers Cloudの価格情報は、ウェブサイトで確認できます。

Maven の場合、 -DforkCount=N システムプロパティを使用して並列化の度合いを指定できます。 Gradle の場合、 maxParallelForks プロパティを使用して並列化の度合いを指定できます。

次のように、 .buildkite/pipelines.yml の 4 つのフォークを使用してテストの並列実行を有効にすることができます。

steps:
 - label: "Test"
   commands:
     - sh -c "$(curl -fsSL https://get.testcontainers.cloud/bash)"
     - ./mvnw test -DforkCount=4

ターボモードの使用の詳細については、 ドキュメントを参照してください。

結論

この記事では、デフォルトの Docker デーモンを使用して Buildkite Pipelines で Testcontainers ベースのテストを実行する方法について説明しました。 次に、Testcontainers Cloud アカウントを作成し、Testcontainers Cloud を使用してテストを実行するようにパイプラインを構成する方法を学びました。 また、Testcontainers Cloud TurboMode をビルドツールの並列実行機能と組み合わせて使用する方法も検討しました。 

ここでは、Java プロジェクトを例に挙げてセットアップを示しましたが、Testcontainers ライブラリは他の一般的な言語にも存在し、同じ構成パターンに従って、Golang、.NET、Python、Node.js などの Azure Pipelines で Testcontainers ベースのテストを実行できます。

さらに詳しく