DEV Community

Bhavik Gevariya
Bhavik Gevariya

Posted on

Automating CI/CD Pipelines with GitHub Actions and Docker for Smooth, Seamless Deployments

Why I Set Up CI/CD with GitHub Actions and Docker

If you’re like me, you probably want deployments to be as smooth and hands-off as possible. That’s where a good CI/CD pipeline comes in. In today’s fast-paced dev world, automating testing, building, and deployment not only cuts down manual effort but also reduces the risk of mistakes. I recently set up a CI/CD pipeline using GitHub Actions and Docker, which gave me a reliable and automated way to get code updates into production without the headache.

Here’s a quick walkthrough of how I did it and some tips I picked up along the way!

Step 1: Getting Started with GitHub Actions

GitHub Actions is a really powerful tool that integrates right into your repository and handles CI/CD workflows. You can create a .yml workflow file, which defines the steps your pipeline follows. Here’s a basic setup:

1. Create Your Workflow File
Start by creating a file called .github/workflows/ci-cd.yml in your repo. This file will tell GitHub Actions what to do each time you push code.

Here’s an example of what it might look like:

name: CI/CD Pipeline

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

jobs:
  build:
    runs-on: ubuntu-latest

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

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

      - name: Build Docker image
        run: docker build -t myapp:latest .

      - name: Log in to Docker Hub
        env:
          DOCKER_HUB_USERNAME: ${{ secrets.DOCKER_HUB_USERNAME }}
          DOCKER_HUB_PASSWORD: ${{ secrets.DOCKER_HUB_PASSWORD }}
        run: echo "${DOCKER_HUB_PASSWORD}" | docker login -u "${DOCKER_HUB_USERNAME}" --password-stdin

      - name: Push Docker image
        run: docker push myapp:latest

Enter fullscreen mode Exit fullscreen mode

This setup checks out the code, builds a Docker image, logs in to Docker Hub, and pushes the image—all automatically!

Step 2: Setting Up Docker for Containerized Deployments

Docker is my go-to for ensuring my apps run consistently across environments, from my laptop to production. Here’s a basic Dockerfile I created for one of my Node.js projects:

# Use Node as the base image
FROM node:16

# Set the working directory
WORKDIR /app

# Install dependencies
COPY package*.json ./
RUN npm install

# Copy app code
COPY . .

# Expose the app’s port
EXPOSE 3000

# Start the app
CMD ["npm", "start"]
Enter fullscreen mode Exit fullscreen mode

With this Dockerfile, every deployment gets the exact same environment, so no more "it works on my machine" issues!

Step 3: Deploying to AWS ECS with GitHub Actions

For deployment, I set things up to push my Docker container to AWS ECS (Elastic Container Service), where it runs smoothly. Here’s a rundown of how to add this step to your GitHub Actions workflow:

1. Add AWS Credentials

First, add your AWS credentials as secrets in your GitHub repo. This keeps your access keys safe.

2. Deploy to ECS from GitHub Actions

Update your .yml file with steps to configure AWS and deploy to ECS.

Here’s what those deployment steps look like:

      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: us-east-1

      - name: Deploy to ECS
        run: |
          aws ecs update-service --cluster my-cluster --service my-service --force-new-deployment
Enter fullscreen mode Exit fullscreen mode

This configuration forces ECS to pull in the latest Docker image, deploying it automatically.

Benefits and What I’ve Learned

Since setting up this pipeline, my deployment process is way faster and smoother. The automated testing and deployment have also helped me catch bugs earlier, saving me (and the team) from stressful late-night troubleshooting sessions. We even saw a 60% reduction in release issues—proof that automating the process really works.

A Few Gotchas and Solutions

1. Keeping Secrets Secure

GitHub Actions’ Secrets feature is super handy for safely storing things like API keys and passwords.

2. Scaling on AWS

If you’re scaling up, consider using ECS with Fargate so your containers can handle high traffic. AWS makes this relatively easy to set up.

Final Thoughts

Setting up CI/CD with GitHub Actions and Docker has completely changed the way I deploy apps. It saves time, keeps things consistent, and has taken a lot of the manual stress out of releases. If you’re looking to improve your deployment process, I highly recommend giving this setup a try!

Happy coding and deploying!

Top comments (0)