GitLab Runner: Testcontainersでテストを実行する

このドキュメントはDockerイメージのビルドガイドの一部です。完全なガイドはこちらからご覧いただけます:StackheroランナーとDocker-in-Dockerを活用し、GitLab CI/CDパイプラインから効率的にDockerイメージをビルド&プッシュする方法

👋 Stackhero ドキュメントへようこそ!

Stackhero では、GitLab Runner cloud のシンプルなソリューションを提供しており、GitLab CI/CD ジョブの実行を効率的かつ手間なく行えます。主な特長は以下の通りです:

  • 無制限の CI/CD 分数:パイプラインを必要なだけ何度でも実行でき、分単位の課金や予期しない追加料金はありません。
  • 複数のジョブを同時実行:複数のジョブを並列で実行し、開発スピードを向上できます。
  • Docker executorDocker-in-Docker サポート:CI/CD プロセスの一部として、コンテナイメージのビルドやプッシュを簡単に行えます。
  • GitLab.com および セルフマネージド GitLab インスタンスの両方にシームレスに対応。
  • 高速な NVMe/SSD ストレージを備えたプライベートかつ専用のインフラストラクチャにより、安定した予測可能なビルドパフォーマンスを実現します。
  • 🇪🇺 ヨーロッパ および 🇺🇸 USA のリージョンでご利用いただけますので、チームのニーズに合わせて選択可能です。

時間を節約:最初の GitLab Runner を接続し、数分でパイプラインの実行を開始できます!

Testcontainersは、Java、Go、Node.js、Python、.NETなど複数言語で利用できるテスト用ライブラリです。テスト実行中に実際のサービスを一時的なDockerコンテナとして起動します。データベースやメッセージブローカーをモックする代わりに、統合テストが本物のPostgreSQL、MySQL、Redis、Kafkaインスタンスと通信できるようになり、テスト前に作成・終了後に削除されます。特にJavaやSpringプロジェクトで広く利用されています。

TestcontainersはDockerデーモンを必要とするため、上記と同じDocker-in-Docker構成で動作します。追加の変数は不要です。

test:
  stage: test
  # テストに必要なイメージ(ここではJDK)を指定してください。必ずしもdockerイメージである必要はありません。
  image: gradle:jdk21
  services:
    - name: docker:29-dind
      alias: docker
  variables:
    DOCKER_HOST: "tcp://docker:2375"
    DOCKER_TLS_CERTDIR: ""
  script:
    - gradle test

TestcontainersはDOCKER_HOSTを参照してデーモンを見つけ、起動したコンテナの公開ポートにも同じdockerホスト名でアクセスします。どちらもジョブのネットワーク上で解決されるため、問題なく動作します。

Testcontainersを使うジョブではDOCKER_HOSTを必ず設定してください。設定しない場合、TestcontainersはランナーがマウントしたDockerソケットを使おうとし、その後テストコンテナにホストIPアドレスで接続しようとしますが、ジョブからは接続できません。よくある症状は、RyukヘルパーコンテナがWait strategy failed. Container is removedTimed out waiting for log output matching '.*Started.*'で失敗することです。