Creating a reliable and efficient continuous testing pipeline is essential for maintaining high-quality software development. For NestJS applications, integrating GitHub Actions and Docker can streamline the testing process, ensuring consistent environments and rapid feedback. This guide walks you through setting up a continuous testing pipeline tailored for NestJS projects.

Prerequisites

  • Basic knowledge of NestJS framework
  • GitHub repository for your project
  • Docker installed on your development machine
  • GitHub Actions enabled in your repository

Creating the Docker Environment

Start by defining a Dockerfile that sets up the environment for your NestJS application. This ensures tests run in a consistent environment regardless of where they are executed.

FROM node:18-alpine

WORKDIR /app

COPY package*.json ./
RUN npm install

COPY . .

RUN npm run build

CMD ["npm", "run", "test"]

Setting Up GitHub Actions Workflow

Create a workflow file in your repository under .github/workflows/ci.yml. This file defines the steps to build the Docker image, run tests, and handle results.

name: CI Pipeline

on:
  push:
    branches:
      - main
  pull_request:
    branches:
      - main

jobs:
  build-and-test:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v3

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v2

      - name: Build Docker image
        run: |
          docker build -t nestjs-test .

      - name: Run tests inside Docker
        run: |
          docker run --rm nestjs-test

Enhancing the Pipeline

To improve your pipeline, consider adding steps for linting, code coverage, and deploying test reports. You can also cache dependencies to speed up builds.

Adding Caching

Implement caching of node_modules to reduce build times:

- name: Cache node modules
  uses: actions/cache@v3
  with:
    path: ~/.npm
    key: ${{ runner.os }}-node-${{ hashFiles('package-lock.json') }}
    restore-keys: |
      ${{ runner.os }}-node-

Conclusion

Integrating Docker with GitHub Actions provides a robust and repeatable testing environment for your NestJS applications. By automating tests in a continuous pipeline, developers can catch issues early and maintain high code quality. Customize and extend this setup to fit your project’s specific needs and workflows.