একজন ওয়েব ডেভেলপারের জন্য Continuous Integration & Continuous Delivery (CI/CD) খুবই গুরুত্বপূর্ণ একটি পর্যায়। এই অংশটুকু Automate করে ফেলতে পারলে আপনার উপর থেকে অনেক বিশাল একটি চাপ সরে যাবে।

আর সবচেয়ে আনন্দের ব্যপার হলো CI/CD পাইপলাইন তৈরী করার মাধ্যমে এই পুরো Process টা Automate করা সম্ভব।

এই ব্লগে আমরা GitHub Actions ব্যবহার করে আমাদের সোর্স কোড থেকে Docker Image তৈরী করে Docker Hub এ Delivery করে দিবো। উদাহরনস্বরুপ আমি একটি Django প্রোজেক্ট ব্যবহার করবো, কিন্তু পাইপলাইলের বেশিরভাগ অংশ সব প্রোগ্রামিং ল্যাঙ্গুয়েজ ও ফ্রেমওয়ার্কের জন্য একই।

Action Script লেখাঃ

যদি গিটহাবে আমাদের প্রোজেক্ট সোর্স কোড আপলোড করা হয়ে থাকে তাহলে এখন Action Script লিখার পালা। প্রোজেক্টের রুট ডিরেক্টরিতে .github>workflows>cicd.yml হায়ারার্কিতে cicd.yml ফাইলটি তৈরী করে ফেলি।

cicd.yml ফাইলে আমাদের প্রোসেসগুলো লিখতে হবে। প্রথমেই এ্যাকশনের নাম দিয়ে শুরু করি।

name: CI/CD

এরপর ইভেন্ট ডিটেইলস। মানে কখন এই স্ক্রিপ্টটি রান করবে। অর্থাৎ master ব্রাঞ্চে পুশ করা মাত্রই এই স্ক্রিপ্টটি রান করা শুরু করবে।

on:
  push:
    branches: [ master ]

এরপর Jobs গুলো বলতে হবে। আমাদের প্রথম Jobs এর নাম build। এটি কোন OS এ রান করবে সেটা বলে দিবো এবং সাথে build strategy টাও উল্লেখ করে দিবো

jobs:
  build:

    runs-on: ubuntu-latest
    strategy:
      max-parallel: 4
      matrix:
        python-version: [3.8]

এরপরই চলে আসে build job এর স্টেপগুলোর পালা। প্রথমেই আমরা checkout করে নিবো।

 steps:
    - uses: actions/checkout@v2

এরপর যে পাইথন ভার্শনে আমাদের প্রোজেক্টটি রান করবো সেটা বলে দিবো।

- name: Set up Python ${{ matrix.python-version }}
  uses: actions/setup-python@v2
  with:
    python-version: ${{ matrix.python-version }}

তৃতীয় স্টেপে আমরা ডিপেন্ডেন্সিগুলো ইনস্টল করে নিবো।

- name: Install Dependencies
  run: |
    python -m pip install --upgrade pip
    pip install -r requirements.txt

চতুর্থ স্টেপে আমাদের প্রোজেক্টটি টেস্ট করে নিবো।

- name: Run Tests
  run: |
   python manage.py test

পঞ্চম স্টেপে আমরা আমাদের সোর্স কোডকে ডকার ইমেজে বিল্ড করবো এবং ডকার হাবে পুশ করবো।

- name: Build and Push Docker Image
  uses: mr-smithers-excellent/docker-build-push@v4
  with:
    image: shakilahmmeed/cicd
    registry: docker.io
    tag: latest
    username: ${{ secrets.DOCKER_USERNAME }}
    password: ${{ secrets.DOCKER_PASSWORD }}

পঞ্চম স্টেপে আমরা docker ইউজারনেম ও পাসওয়ার্ড ব্যবহার করেছি। যেগুলো রিপোজিটরি সিক্রেটের ভিতর জমা রাখা আছে। Settings>Secrets>New secret এ ক্লিক করে নতুন সিক্রেট যুক্ত করে নিতে পারবেন।

নিচে পুরো কোড একসাথে দেয়া হলো। এই স্ক্রিপ্টটি সহ কমিট করে master ব্রাঞ্চে পুশ করলে এ্যাকশন রান করা শুরু করবে এবং ধাপে ধাপে সবগুলো এক্সিকিউট হয়ে Docker Image টি Docker Hub এ আপলোড হয়ে যাবে।

name: CI/CD

on:
  push:
    branches: [ refactor ]

jobs:
  build:

    runs-on: ubuntu-latest
    strategy:
      max-parallel: 4
      matrix:
        python-version: [3.8]

    steps:
    - uses: actions/checkout@v2
    - name: Set up Python ${{ matrix.python-version }}
      uses: actions/setup-python@v2
      with:
        python-version: ${{ matrix.python-version }}
    - name: Install Dependencies
      run: |
        python -m pip install --upgrade pip
        pip install -r requirements.txt
    - name: Run Tests
      run: |
        python manage.py test
    - name: Build and Push Docker Image
      uses: mr-smithers-excellent/docker-build-push@v4
      with:
        image: shakilahmmeed/cicd
        registry: docker.io
        tag: latest
        username: ${{ secrets.DOCKER_USERNAME }}
        password: ${{ secrets.DOCKER_PASSWORD }}

Script টি রান করার সময় শেষ স্টেপে আমরা ডকার ইমেজ তৈরী করেছি। সোর্স কোড থেকে ডকার ইমেজ বিল্ড করার জন্য আমাদের আরেকটি স্ক্রিপ্ট লিখতে হবে যেটি Dockerfile নামে পরিচিত। এই script টিতে আমরা এ্যাপ সার্ভার হিসেবে gunicorn ব্যবহার করেছি। তাই requirements.txt তে অবশ্যই gunicorn প্যাকেজটি থাকতে হবে।

Django প্রোজেক্ট এর ইমেজ বিল্ড করার জন্য Dockerfile এর কনটেন্টগুলো হবেঃ

FROM python:3.8.6
ENV PYTHONUNBUFFERED=1
ENV PYTHONDONTWRITEBYTECODE=1
WORKDIR /code
COPY requirements.txt /code/
RUN pip install -r requirements.txt
COPY . /code/
RUN python manage.py collectstatic --noinput
CMD gunicorn cicd.wsgi:application --bind 0.0.0.0:8000

0 Comments

Leave a Reply

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