Support    Resources    Contact    |    Call Us: 602.808.9552

AIM Logo
Hey there! If you're looking to streamline your development and deployment process using some cool tools like GitHub Actions, DigitalOcean's Container Registry (DOCR), and Kubernetes, you've come to the right place. This blog post will guide you through setting up a CI/CD pipeline that leverages these technologies to boost your workflow efficiency and deployment reliability. Let’s dive in!
Setting the Stage

First off, let’s clarify what we’re dealing with:

  • GitHub Actions: Automates your workflow by letting you define jobs, including testing and deploying your code directly from GitHub repos.
  • DigitalOcean Container Registry (DOCR): A private storage and distribution service for your Docker images, tightly integrated into DigitalOcean’s ecosystem.
  • Kubernetes: A powerful system for automating deployment, scaling, and management of containerized applications.
 

The synergy of these tools provides a robust platform for automating your software deployment, making your entire process smoother and more efficient.

Prerequisites

Before we start, make sure you have:

  1. A GitHub account and basic knowledge of GitHub repositories.
  2. A DigitalOcean account with access to the container registry and Kubernetes services.
  3. Docker installed on your local machine for building container images.
  4. kubectl installed and configured to communicate with your Kubernetes cluster.
 
 

Step 1: Setting Up the DigitalOcean Container Registry

First, you need to create your DOCR. Log into your DigitalOcean dashboard:

  1. Navigate to Container Registry.
  2. Click Create Registry and follow the prompts to name your registry.
  3. Once created, make sure to configure your local Docker to authenticate with DOCR using:
				
					doctl registry login

				
			

This command logs in Docker to your DOCR for image pushing.

 

Step 2: Preparing Your Application

Let’s assume you have a simple Node.js application. Ensure your app has a Dockerfile at the root which looks something like this:

				
					# Use an official Node runtime as the parent image
FROM node:14

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

# Copy package.json and install dependencies
COPY package.json ./
RUN npm install

# Bundle app source inside the Docker image
COPY . .

# Make your app available on the specified port
EXPOSE 8080

# Define the command to run your app
CMD [ "node", "app.js" ]

				
			
Step 3: Configuring GitHub Actions

Create a .github/workflows/main.yml file in your repo. This file will define your CI/CD pipeline. Here’s a simple workflow:

				
					name: CI/CD Pipeline

on:
  push:
    branches:
      - main

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: Build Docker image
      run: docker build . --tag docreg.digitalocean.com/myregistry/myapp:${{ github.sha }}
    - name: Push Docker image to DOCR
      run: |
        echo ${{ secrets.DIGITALOCEAN_ACCESS_TOKEN }} | docker login docreg.digitalocean.com -u _ --password-stdin
        docker push docreg.digitalocean.com/myregistry/myapp:${{ github.sha }}

  deploy:
    needs: build
    runs-on: ubuntu-latest
    steps:
    - name: Set up Kubeconfig
      run: echo '${{ secrets.KUBECONFIG }}' | base64 --decode > $HOME/.kube/config
    - name: Deploy to Kubernetes
      run: kubectl set image deployment/myapp-deployment myapp=docreg.digitalocean.com/myregistry/myapp:${{ github.sha }} --record

				
			
  • Build job: Checks out the code, builds a Docker image, and pushes it to DOCR.
  • Deploy job: Configures kubectl and updates the Kubernetes deployment with the new image.

 

Step 4: Updating Kubernetes Deployment

Ensure your Kubernetes deployment YAML references the DOCR image. Here’s an example snippet:

				
					apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: docreg.digitalocean.com/myregistry/myapp
        ports:
        - containerPort: 8080

				
			

Wrapping Up

With this setup, every push to the main branch triggers the pipeline, builds your application’s Docker image, pushes it to DOCR, and updates your Kubernetes deployment. This automation not only ensures a streamlined deployment process but also minimizes human error, making your application deployments consistent and predictable.

Feel free to tweak the configurations according to your project’s requirements. Happy coding and deploying!

Leave a Reply

Your email address will not be published. Required fields are marked *