Chapter 07

Docker Compose で E2E テスト環境を構築する

nikaera
nikaera
2020.10.27に更新

まずは Docker Compose に NestJS アプリケーションを乗せるため、Dockerfile を書いていきます。また、不要なファイルを Docker イメージに含めたくないため .dockerignore も書いていきます。

Dockerfile
# Azure Functions で利用している Docker イメージを使用する
FROM mcr.microsoft.com/azure-functions/node:2.0-node10

# Docker イメージのビルドキャッシュに node_modules を含めるための記述
WORKDIR /azure-sample
COPY package*.json /azure-sample/
RUN npm install

# NestJS アプリケーションのコード群を Docker イメージに追加する
ADD ./ /azure-sample

# Docker コンテナ起動時にデフォで E2E テストを実行する
CMD npm run test:e2e
.dockerignore
# Ref: https://www.toptal.com/developers/gitignore?templates=node
# Logs
logs
*.log

# Runtime data
pids
*.pid
*.seed

# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov

# Coverage directory used by tools like istanbul
coverage

# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
.grunt

# node-waf configuration
.lock-wscript

# Compiled binary addons (http://nodejs.org/api/addons.html)
build/Release

# Dependency directory
# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git
node_modules

README.md
.env*

local.settings.json
coverage
dist

次に devenv/docker-compose.yml を改修して、NestJS アプリケーションを定義します。

devenv/docker-compose.yml
version: '3.8'
services:
    # NestJS アプリケーションの定義を追加
    app:
        build: ../.
        env_file:
            - ../.env.test
        links:
            - mongodb
    mongodb:
        image: mongo:latest
        ports:
            - "27017:27017"
        environment:
            MONGO_INITDB_ROOT_USERNAME: azure-sample
            MONGO_INITDB_ROOT_PASSWORD: azure-sample
            MONGO_INITDB_DATABASE: azure-sample
            TZ: Asia/Tokyo

また E2E テストはこれから Docker Compose で回したいので、.env.test は Docker Compose で回す前提で改修します。

.env.test
# localhost の部分を docker-compose.yml で定義した mongodb に変更する
# Docker Compose 上でしか E2E テストの実行が出来なくなるので注意する
MONGODB_URI=mongodb://azure-sample:azure-sample@mongodb:27017/azure-sample?authSource=admin

この状態で Docker Compose を起動すると、MongoDB の起動後、NestJS アプリケーションの E2E テストが走るようになっているはずです。

それでは、試しに Docker Compose を起動してみましょう。

今回起動時に --abort-on-container-exit オプションを追加したのは、NestJS アプリケーションのテストが終了した時点で Docker Compose を落としたいからです。

# NestJS アプリケーションで E2E テストが完了してコンテナが終了したら MongoDB コンテナも含めて Docker 停止させたいので --abort-on-container-exit オプションを指定する
# そうしないと明示的に停止しない限り docker-compose コマンドが終了しなくなる (テストが終了したと同時にコマンドも終了してほしい)
cd devenv
docker-compose up --abort-on-container-exit

実行した際に下記の標準出力が確認できたら OK です。

Docker Compose での E2E テストの実行結果
Docker Compose での E2E テストの実行結果 (成功)

次に Docker Compose の E2E テストを CI で回せるようにしていきます。