6-setting-up-cicd-pipelines-for-a-nestjs-backend-with-docker.html

Setting Up CI/CD Pipelines for a NestJS Backend with Docker

In modern software development, Continuous Integration (CI) and Continuous Deployment (CD) have become essential practices for delivering high-quality applications efficiently. When combined with powerful tools like Docker, they enable developers to streamline their workflow, automate testing, and facilitate deployment. In this article, we will explore how to set up CI/CD pipelines for a NestJS backend using Docker, complete with actionable insights, code examples, and troubleshooting tips.

Understanding CI/CD and Its Importance

What is CI/CD?

Continuous Integration (CI) is a development practice where developers frequently integrate their code changes into a shared repository. Each integration is automatically tested, allowing teams to detect issues early.

Continuous Deployment (CD) takes this a step further by automatically deploying the integrated code to production environments after passing predefined tests. This practice ensures that software is always in a deployable state, reducing the time to market and enhancing product quality.

Benefits of CI/CD

  • Faster Release Cycle: Automates the testing and deployment process, reducing manual intervention.
  • Improved Collaboration: Encourages team members to work on smaller, incremental changes.
  • Higher Quality Code: Early detection of bugs through automated testing.
  • Consistent Environments: Docker ensures that code runs the same way in development, testing, and production.

Prerequisites

Before we dive into setting up our CI/CD pipeline, ensure you have the following:

  • Node.js and NestJS installed on your machine.
  • Docker installed to containerize our application.
  • A version control system (like Git) and a repository hosted on platforms like GitHub or GitLab.
  • A CI/CD service (such as GitHub Actions, GitLab CI, or CircleCI).

Step-by-Step Guide to Setting Up CI/CD for a NestJS Backend with Docker

Step 1: Setting Up Your NestJS Application

Start by creating a new NestJS application if you don't have one already.

npm i -g @nestjs/cli
nestjs new nestjs-docker-ci-cd
cd nestjs-docker-ci-cd

Step 2: Create a Dockerfile

Create a Dockerfile in the root of your NestJS application to define how to build your Docker image.

# Use the official Node.js image as a base
FROM node:14

# Set the working directory
WORKDIR /usr/src/app

# Copy package.json and package-lock.json
COPY package*.json ./

# Install dependencies
RUN npm install

# Copy the rest of your application
COPY . .

# Expose the port your app runs on
EXPOSE 3000

# Command to run your app
CMD ["npm", "run", "start:prod"]

Step 3: Create a .dockerignore File

Create a .dockerignore file to exclude unnecessary files from your Docker image.

node_modules
dist
*.log

Step 4: Build and Run Your Docker Container Locally

To build and run your container locally, use the following commands:

docker build -t nestjs-docker-ci-cd .
docker run -p 3000:3000 nestjs-docker-ci-cd

Visit http://localhost:3000 to verify that your application is running as expected.

Step 5: Setting Up CI/CD with GitHub Actions

Create a directory named .github/workflows in your project root and add a file named ci-cd.yml:

name: CI/CD Pipeline

on:
  push:
    branches:
      - main

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - name: Checkout code
      uses: actions/checkout@v2

    - name: Set up Node.js
      uses: actions/setup-node@v2
      with:
        node-version: '14'

    - name: Install dependencies
      run: npm install

    - name: Run tests
      run: npm run test

    - name: Build Docker image
      run: docker build -t nestjs-docker-ci-cd .

    - name: Push Docker image to Docker Hub
      run: |
        echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin
        docker tag nestjs-docker-ci-cd ${{ secrets.DOCKER_USERNAME }}/nestjs-docker-ci-cd:latest
        docker push ${{ secrets.DOCKER_USERNAME }}/nestjs-docker-ci-cd:latest

Step 6: Configure Secrets in GitHub

To enable Docker Hub authentication in your GitHub Actions workflow, navigate to your GitHub repository, go to Settings > Secrets, and add the following secrets:

  • DOCKER_USERNAME: Your Docker Hub username.
  • DOCKER_PASSWORD: Your Docker Hub password.

Step 7: Deploying to Production

You can extend your CI/CD pipeline to include deployment steps. For instance, if you're deploying to a cloud service like AWS or DigitalOcean, you would add deployment steps after the Docker image is pushed.

Troubleshooting Common Issues

  • Docker Build Errors: Check your Dockerfile syntax and ensure all dependencies are correctly specified.
  • CI/CD Fails on Tests: Investigate test failures by checking logs in the CI/CD platform.
  • Deployment Issues: Confirm that your server is running and accessible, and validate your deployment credentials.

Conclusion

Setting up CI/CD pipelines for a NestJS backend with Docker significantly enhances your development workflow. By automating testing and deployment, you not only improve code quality but also accelerate your release cycles. As you implement these steps, remember to iterate and adapt your pipeline to fit your team's needs.

With this guide, you are now equipped to harness the power of CI/CD and Docker, paving the way for more efficient and reliable software development. Happy coding!

SR
Syed
Rizwan

About the Author

Syed Rizwan is a Machine Learning Engineer with 5 years of experience in AI, IoT, and Industrial Automation.