Skip to content

A fully automated CI/CD pipeline that builds, tests, and deploys a Node.js application on Amazon EKS using GitHub Actions, Terraform, and Kubernetes.

Notifications You must be signed in to change notification settings

NotHarshhaa/CI-CD_EKS-GitHub_Actions

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

11 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

πŸš€ End-to-End CI/CD Pipeline for Node.js App Deployment on EKS using GitHub Actions

eksbanner


CI/CD Pipeline

πŸ“Œ Table of Contents


πŸ“‚ Repository Structure

The repository is structured for modularity and maintainability:

πŸ“‚ root  
β”œβ”€β”€ πŸ“‚ .github/workflows/      # GitHub Actions CI/CD workflows
β”‚   β”œβ”€β”€ ci.yml                 # Continuous Integration pipeline
β”‚   └── cd.yml                 # Continuous Deployment pipeline
β”‚
β”œβ”€β”€ πŸ“‚ app                     # Application source code  
β”‚   β”œβ”€β”€ app.py                 # Python application logic (Flask)  
β”‚   β”œβ”€β”€ calculator.js          # Business logic for calculations  
β”‚   β”œβ”€β”€ calculator.test.js     # Unit tests for calculator functions  
β”‚   β”œβ”€β”€ Dockerfile             # Optimized Dockerfile for Node.js app  
β”‚   β”œβ”€β”€ Dockerfile-python      # Dockerfile for Python Flask version  
β”‚   β”œβ”€β”€ index.js               # Main entry point of the Node.js application  
β”‚   β”œβ”€β”€ package.json           # Project dependencies and scripts  
β”‚   └── requirements.txt       # Python dependencies  
β”‚  
β”œβ”€β”€ πŸ“‚ kustomize               # Kubernetes manifests managed with Kustomize  
β”‚   β”œβ”€β”€ πŸ“‚ base                # Base configurations common for all environments  
β”‚   β”‚   β”œβ”€β”€ deploy.yaml        # Enhanced deployment with health checks & security  
β”‚   β”‚   β”œβ”€β”€ ingress.yaml       # Ingress configuration for routing traffic  
β”‚   β”‚   β”œβ”€β”€ kustomization.yaml # Kustomize configuration file  
β”‚   β”‚   └── svc.yaml           # Kubernetes Service definition  
β”‚   β”‚  
β”‚   β”œβ”€β”€ πŸ“‚ overlays            # Environment-specific configurations  
β”‚   β”‚   β”œβ”€β”€ πŸ“‚ dev             # Dev environment-specific Kustomize configs  
β”‚   β”‚   β”‚   β”œβ”€β”€ deploy-dev.yaml        # Dev-specific deployment file  
β”‚   β”‚   β”‚   β”œβ”€β”€ ingress-dev.yaml       # Dev-specific ingress settings  
β”‚   β”‚   β”‚   β”œβ”€β”€ kustomization.yaml     # Kustomize configuration for Dev  
β”‚   β”‚   β”‚   └── svc-dev.yaml           # Dev-specific service settings  
β”‚   β”‚   β”‚  
β”‚   β”‚   β”œβ”€β”€ πŸ“‚ prod            # Production environment-specific Kustomize configs  
β”‚   β”‚   β”‚   β”œβ”€β”€ deploy-prod.yaml       # Production-specific deployment file  
β”‚   β”‚   β”‚   β”œβ”€β”€ ingress-prod.yaml      # Production-specific ingress settings  
β”‚   β”‚   β”‚   β”œβ”€β”€ kustomization.yaml     # Kustomize configuration for Prod  
β”‚   β”‚   β”‚   └── svc-prod.yaml          # Production-specific service settings  
β”‚   β”‚   β”‚  
β”‚   β”‚   β”œβ”€β”€ πŸ“‚ staging         # Staging environment-specific Kustomize configs  
β”‚   β”‚   β”‚   β”œβ”€β”€ deploy-staging.yaml    # Staging-specific deployment file  
β”‚   β”‚   β”‚   β”œβ”€β”€ ingress-staging.yaml   # Staging-specific ingress settings  
β”‚   β”‚   β”‚   β”œβ”€β”€ kustomization.yaml     # Kustomize configuration for Staging  
β”‚   β”‚   β”‚   └── svc-staging.yaml       # Staging-specific service settings  
β”‚  
β”œβ”€β”€ πŸ“‚ terraform               # Terraform configuration for infrastructure provisioning  
β”‚   β”œβ”€β”€ ingress-nginx.tf       # Terraform script for setting up NGINX Ingress  
β”‚   β”œβ”€β”€ main.tf                # Main Terraform file defining AWS infrastructure  
β”‚   β”œβ”€β”€ outputs.tf             # Defines Terraform outputs (e.g., cluster endpoints)  
β”‚   β”œβ”€β”€ terraform.tf           # Backend configuration for Terraform state management  
β”‚   └── variables.tf           # Input variables for Terraform modules  
β”‚  
β”œβ”€β”€ .eslintrc.js               # ESLint configuration for code quality  
β”œβ”€β”€ .gitignore                 # Comprehensive gitignore file  
β”œβ”€β”€ docker-compose.yml         # Local development environment  
β”œβ”€β”€ nginx.conf                 # Nginx configuration for local development  
β”œβ”€β”€ README.md                  # Project documentation and setup guide  
└── VERSION                    # Tracks application versioning (Semantic Versioning)  

πŸš€ Recent Improvements

This project has been enhanced with the following improvements:

πŸ”§ Application Enhancements

  • βœ… Enhanced Error Handling - Better error responses and graceful shutdown
  • βœ… Health Check Endpoints - /health endpoint for monitoring
  • βœ… API Endpoints - RESTful API at /api/calculate for programmatic access
  • βœ… CORS Support - Cross-origin resource sharing enabled
  • βœ… Improved UI - Better styling and user experience
  • βœ… Graceful Shutdown - Proper signal handling for container orchestration

🐳 Docker & Security Improvements

  • βœ… Multi-stage Docker Build - Optimized image size and security
  • βœ… Non-root User - Enhanced security with proper user permissions
  • βœ… Health Checks - Built-in container health monitoring
  • βœ… Signal Handling - Proper process management with dumb-init

☸️ Kubernetes Enhancements

  • βœ… Liveness & Readiness Probes - Better container health monitoring
  • βœ… Security Context - Enhanced security with non-root execution
  • βœ… Resource Management - Proper CPU and memory limits
  • βœ… Rolling Updates - Zero-downtime deployments

πŸ”„ CI/CD Pipeline

  • βœ… GitHub Actions Workflows - Automated CI/CD with security scanning
  • βœ… Multi-Node Testing - Testing across Node.js 18.x and 20.x
  • βœ… Security Scanning - Trivy vulnerability scanning
  • βœ… Code Quality - ESLint integration and coverage reporting

πŸ› οΈ Development Tools

  • βœ… Docker Compose - Local development environment
  • βœ… ESLint Configuration - Code quality and consistency
  • βœ… Comprehensive .gitignore - Proper version control
  • βœ… Nginx Configuration - Local reverse proxy setup

πŸ”§ Prerequisites

Before you proceed, ensure you have the following installed:

  • πŸ›  Node.js (>=18.x)
  • 🐳 Docker & Docker Compose
  • πŸ—οΈ Terraform (>=1.0)
  • ☸ kubectl (latest version)
  • 🎭 Kustomize
  • ☁ AWS CLI & eksctl
  • βš™οΈ GitHub Actions configured
  • πŸ”‘ AWS IAM permissions to manage EKS

πŸƒβ€β™‚οΈ Quick Start (Local Development)

Option 1: Docker Compose (Recommended)

# Clone the repository
git clone https://github.com/NotHarshhaa/CI-CD_EKS-GitHub_Actions.git
cd CI-CD_EKS-GitHub_Actions

# Start the application with Docker Compose
docker-compose up --build

# Access the application
# Web UI: http://localhost:80
# Health Check: http://localhost:80/health
# API: POST http://localhost:80/api/calculate

Option 2: Local Node.js Development

# Navigate to app directory
cd app

# Install dependencies
npm install

# Run in development mode
npm run dev

# Run tests
npm test

# Run linting
npm run lint

βš™οΈ CI/CD Workflow

The CI/CD pipeline automates the entire deployment process using GitHub Actions.

πŸ”¨ Build Job

1️⃣ Set Up the Environment

  • Install Node.js dependencies using npm install.
  • Lint the code to ensure quality standards.

2️⃣ Run Tests

  • Execute unit tests with npm test.
  • Generate test reports for visibility.

3️⃣ Version Management

  • Uses Semantic Versioning (major.minor.patch).
  • Auto-increments the version based on commit messages.

4️⃣ Build & Push Docker Image

  • Builds a Docker image of the application.
  • Pushes it to Amazon Elastic Container Registry (ECR).

πŸš€ Deployment Job

1️⃣ Terraform Setup

  • Initializes Terraform with terraform init.
  • Ensures correct state management.

2️⃣ Infrastructure Provisioning

  • Executes terraform plan and terraform apply.
  • Deploys EKS clusters, networking, and storage.

3️⃣ Kubernetes Configuration

  • Configures kubectl to interact with the cluster.
  • Applies Kustomize overlays for environment-specific settings.

4️⃣ Ingress Controller Setup

  • Uses Helm to install NGINX Ingress.

5️⃣ Application Deployment

  • Deploys the latest Docker image to Kubernetes.
  • Exposes the service via Ingress and Load Balancer.

πŸ—οΈ Infrastructure Details

Environment Instance Type Replica Count
Dev t3.small 1
Staging t3.medium 3
Prod t3.large 3

βœ… DNS Automation via Cloudflare

  • Environment-specific subdomains:
    • dev.example.com
    • staging.example.com
    • prod.example.com

πŸ“¦ Application Deployment Strategy

This project supports multiple deployment strategies:

βœ… Rolling Updates – Default strategy, ensuring zero downtime.
βœ… Blue-Green Deployment – Used in production environments.
βœ… Canary Deployments – Gradual rollout for safe updates.


πŸ”„ GitOps Principles

βœ” Git as the Source of Truth
βœ” Declarative Infrastructure (Terraform & Kubernetes)
βœ” Automated Deployments via GitHub Actions

Every infrastructure change must be made via a Git commit.


πŸ”’ Security Best Practices

πŸ” Secrets Management

  • Uses AWS Secrets Manager & GitHub Actions encrypted secrets.

πŸ›‘ Container Security

  • Uses Trivy and Docker Bench Security for vulnerability scanning.

🚧 IAM & Least Privilege

  • Uses AWS IAM roles with restricted access.

πŸ“’ Notifications & Alerts

πŸ”” Slack & Email Notifications

  • CI/CD Job Updates – Pipeline status alerts.
  • DNS Updates – Cloudflare integration for alerts.

πŸ“‘ Monitoring & Logging

  • AWS CloudWatch for logs & metrics.
  • Prometheus & Grafana for observability.

πŸ“Š Monitoring & Logging

βœ… Application Logs – Aggregated using Fluent Bit.
βœ… Infrastructure Logs – Stored in AWS CloudWatch Logs.
βœ… Metrics Monitoring – Tracked using Prometheus & Grafana.


πŸ“œ Contributing

Want to contribute? Here’s how:

  1. Fork the repository & create a new branch.
  2. Make your changes and commit with a descriptive message.
  3. Open a Pull Request (PR) for review.

⭐ Support & Author

⭐ Hit the Star!

If you find this repository helpful and plan to use it for learning, please consider giving it a star ⭐. Your support motivates me to keep improving and adding more valuable content! πŸš€


πŸ› οΈ Author & Community

This project is crafted with passion by Harshhaa πŸ’‘.

I’d love to hear your feedback! Feel free to open an issue, suggest improvements, or just drop by for a discussion. Let’s build a strong DevOps community together!


πŸ“§ Let's Connect!

Stay connected and explore more DevOps content with me:

LinkedIn GitHub Telegram Dev.to Hashnode


πŸ“’ Stay Updated!

Want to stay up to date with the latest DevOps trends, best practices, and project updates? Follow me on my blogs and social channels!

Follow Me

About

A fully automated CI/CD pipeline that builds, tests, and deploys a Node.js application on Amazon EKS using GitHub Actions, Terraform, and Kubernetes.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published