DEVOPS & DEPLOYMENT

CI/CD Pipelines

Definition: CI/CD (Continuous Integration / Continuous Deployment) is a method to frequently deliver apps to customers by introducing automation into the stages of app development.

মডার্ন সফটওয়্যার ডেভেলপমেন্টে আমরা ম্যানুয়ালি সার্ভারে কোড আপলোড করি না। আমরা এমন একটি অটোমেটেড পাইপলাইন তৈরি করি যা কোড পুশ করার সাথে সাথে নিজে থেকেই টেস্ট করে সার্ভারে রিলিজ করে দেয়।

1. The Deployment Nightmare

Architectural Challenge (Team Collaboration)

ধরি, আমরা ৫ জন ডেভেলপারের একটি টিম একটি প্রজেক্টে কাজ করছি। ম্যানুয়াল যুগে কী হতো? একজন ডেভেলপার কাজ শেষ করে ফাইল জিপ (Zip) করে সার্ভারে আপলোড করতো। মাঝে মাঝে সে ভুলে কোনো প্যাকেজ ইনস্টল করতে ভুলে যেতো, ফলে লাইভ সার্ভার ক্র্যাশ করতো! একে বলা হয় "It works on my machine" প্রবলেম।

CI/CD এর সলিউশন: এখন আমরা কোড লিখে শুধু গিটহাবে git push করি। ক্লাউডে থাকা একটি ভার্চুয়াল মেশিন (যেমন: GitHub Actions) আমাদের কোডটি ডাউনলোড করে, অটোমেটিকভাবে npm test রান করে। যদি টেস্টে কোনো বাগ (Bug) ধরা পড়ে, তবে সে কোডটি লাইভ সার্ভারে পাঠাবে না এবং আমাদেরকে অ্যালার্ট দিবে। আর টেস্ট পাস করলে স্বয়ংক্রিয়ভাবে সার্ভারে রিলিজ (Deploy) করে দিবে!

Manual Deployment

  • FTP বা SSH দিয়ে ফাইল ম্যানুয়ালি আপলোড করতে হয়।
  • মানুষের ভুলে সার্ভার ডাউন হওয়ার ঝুঁকি অনেক বেশি।
  • বাগ (Bug) সহ কোড প্রোডাকশনে চলে যাওয়ার ভয় থাকে।

Automated CI/CD

  • git push করলেই সবকিছু অটোমেটিক হয়।
  • কোড লাইভ হওয়ার আগেই স্বয়ংক্রিয়ভাবে টেস্ট (Testing) হয়।
  • টিমের প্রোডাক্টিভিটি ১০ গুণ বেড়ে যায়।

2. GitHub Actions YAML

নিচে একটি স্ট্যান্ডার্ড CI/CD পাইপলাইনের কোড দেওয়া হলো। এই .yml ফাইলটি রিপোজিটরিতে থাকলে GitHub নিজে থেকেই একটি উবুন্টু (Ubuntu) সার্ভার তৈরি করে আমাদের কোড বিল্ড এবং টেস্ট করবে।

.github/workflows/deploy.yml
name: Node.js CI/CD Pipeline

on:
  push:
    branches: [ "main" ]

jobs:
  build_and_test:
    runs-on: ubuntu-latest
    
    steps:
    - uses: actions/checkout@v3
    
    - name: Use Node.js 18.x
      uses: actions/setup-node@v3
      with:
        node-version: '18.x'
        
    # Continuous Integration (CI)
    - name: Install Dependencies
      run: npm ci
      
    - name: Run Unit Tests
      run: npm test
      
    # Continuous Deployment (CD) runs ONLY if tests pass
    - name: Deploy to Production (Vercel/Render)
      if: success()
      run: npm run deploy
      env:
        PROD_API_KEY: ${{ secrets.PROD_API_KEY }}

3. Live Pipeline Simulator

চলুন প্র্যাকটিক্যালি দেখি। "Push Code" বাটনে ক্লিক করলে পাইপলাইন শুরু হবে। আপনি চাইলে একটি "Bug" ইন্ট্রোডিউস করতে পারেন, যা টেস্ট স্টেজে গিয়ে পুরো ডিপ্লয়মেন্ট আটকে দিবে, যাতে প্রোডাকশন সার্ভার বেঁচে যায়!

Build
Test
Deploy
Waiting for code changes...