CI/CD পাইপলাইন: GitHub Actions দিয়ে ব্যাখ্যা
আপনি সবেমাত্র একটি কমিট পুশ করেছেন এবং এখন ম্যানুয়ালি টেস্ট চালাচ্ছেন, অ্যাপ বিল্ড করছেন এবং সার্ভারে ফাইল আপলোড করছেন। এটি কাজ করে, কিন্তু এটি ধীর, ভুলপ্রবণ এবং স্কেল করে না। এখানেই CI/CD পাইপলাইন আসে।
এই গাইডে, আমরা CI/CD ধারণাগুলো ভেঙে দেখাবো এবং GitHub Actions দিয়ে একটি বাস্তব পাইপলাইন তৈরি করতে দেখাবো। শেষে, আপনি যেকোনো প্রজেক্টের জন্য টেস্টিং, বিল্ডিং এবং ডিপ্লয়মেন্ট অটোমেট করতে শিখবেন।
CI/CD কী?
CI (Continuous Integration) হলো স্বয়ংক্রিয়ভাবে কোড পরিবর্তন টেস্ট এবং শেয়ার্ড ব্রাঞ্চে মার্জ করার অভ্যাস। প্রতিটি পুশ একটি বিল্ড এবং টেস্ট রান ট্রিগার করে, যা ইন্টিগ্রেশন সমস্যাগুলো আগেই ধরে ফেলে।
CD (Continuous Delivery/Deployment) CI-কে বাড়িয়ে দেয় স্বয়ংক্রিয়ভাবে আপনার অ্যাপ্লিকেশন প্রোডাকশনে প্রস্তুত (এবং ঐচ্ছিকভাবে ডিপ্লয়) করার মাধ্যমে। Continuous Delivery মানে কোড সবসময় ডিপ্লয় করার জন্য প্রস্তুত; Continuous Deployment মানে এটি স্বয়ংক্রিয়ভাবে ডিপ্লয় হয়।
একসাথে, CI/CD একটি পাইপলাইন গঠন করে: স্বয়ংক্রিয় ধাপের একটি সিরিজ যা আপনার কোডকে কমিট থেকে প্রোডাকশনে নিয়ে যায়।
CI/CD-এর জন্য GitHub Actions কেন ব্যবহার করবেন?
GitHub Actions হলো GitHub-এ অন্তর্নির্মিত একটি CI/CD প্ল্যাটফর্ম। এটি পাবলিক রিপোজিটরির জন্য বিনামূল্যে এবং প্রাইভেটের জন্য উদার মিনিট অফার করে। মূল সুবিধা:
- ইন্টিগ্রেটেড: কোনো বাহ্যিক সেবা প্রয়োজন নেই; ওয়ার্কফ্লো আপনার রিপোতে থাকে।
- ইভেন্ট-চালিত: পুশ, পুল রিকোয়েস্ট, শিডিউল বা ম্যানুয়াল ডিসপ্যাচে ওয়ার্কফ্লো ট্রিগার করুন।
- এক্সটেনসিবল: GitHub মার্কেটপ্লেসে হাজারো প্রি-বিল্ট অ্যাকশন।
- ম্যাট্রিক্স বিল্ড: সহজেই একাধিক OS এবং ভাষার সংস্করণে টেস্ট করুন।
GitHub Actions-এর মূল ধারণা
আপনার প্রথম ওয়ার্কফ্লো লেখার আগে, এই শব্দগুলো বুঝুন:
| শব্দ | বর্ণনা |
|---|---|
| Workflow | .github/workflows/ এর অধীনে একটি YAML ফাইলে সংজ্ঞায়িত স্বয়ংক্রিয় প্রক্রিয়া। |
| Event | একটি ট্রিগার যা একটি ওয়ার্কফ্লো শুরু করে (যেমন, push, pull_request)। |
| Job | একই রানারে চালানো ধাপের একটি সেট। জবগুলো ডিফল্টভাবে সমান্তরালে চলে। |
| Step | একটি জবের মধ্যে একটি একক কাজ। একটি কমান্ড চালাতে পারে বা একটি অ্যাকশন ব্যবহার করতে পারে। |
| Action | পুনঃব্যবহারযোগ্য কোডের একটি ইউনিট (যেমন, actions/checkout) যা আপনি একটি ধাপে অন্তর্ভুক্ত করতে পারেন। |
| Runner | একটি ভার্চুয়াল মেশিন যা জবগুলো চালায় (Ubuntu, Windows, macOS)। |
আপনার প্রথম CI পাইপলাইন তৈরি করা
একটি Node.js প্রজেক্টের জন্য একটি বেসিক CI ওয়ার্কফ্লো তৈরি করি। এটি মেইন ব্রাঞ্চে প্রতিটি পুশ এবং পুল রিকোয়েস্টে টেস্ট চালাবে।
.github/workflows/ci.yml তৈরি করুন:
name: CI
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
test:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [18.x, 20.x]
steps:
- uses: actions/checkout@v4
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
- run: npm ci
- run: npm test
এই ওয়ার্কফ্লো:
main-এ পুশ এবং PR-এ ট্রিগার হয়।- সর্বশেষ Ubuntu রানারে
testনামে একটি জব চালায়। - Node.js 18 এবং 20-এর বিরুদ্ধে টেস্ট করতে একটি ম্যাট্রিক্স ব্যবহার করে।
- কোড চেকআউট করে, Node সেট আপ করে, নির্ভরতা ইনস্টল করে এবং টেস্ট চালায়।
এই ফাইলটি পুশ করুন এবং Actions ট্যাব দেখুন। আপনি দুটি সমান্তরাল জব দেখতে পাবেন (প্রতি Node সংস্করণের জন্য একটি)। যদি কোনো টেস্ট ব্যর্থ হয়, ওয়ার্কফ্লো ব্যর্থ হয় এবং GitHub আপনাকে অবহিত করে।
কন্টিনিউয়াস ডিপ্লয়মেন্ট যোগ করা
CI দুর্দান্ত, কিন্তু CD হলো যেখানে অটোমেশন জ্বলজ্বল করে। চলুন ওয়ার্কফ্লোটি বাড়িয়ে দিই যাতে মেইন ব্রাঞ্চে টেস্ট পাস করার পরে একটি সার্ভারে ডিপ্লয় করা যায়।
আমরা একটি deploy জব যোগ করব যা test-এর উপর নির্ভর করে এবং শুধুমাত্র main-এ পুশে চলে।
deploy:
needs: test
if: github.ref == 'refs/heads/main' && github.event_name == 'push'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Deploy to server
uses: appleboy/ssh-action@v1.0.0
with:
host: ${{ secrets.SSH_HOST }}
username: ${{ secrets.SSH_USER }}
key: ${{ secrets.SSH_KEY }}
script: |
cd /var/www/myapp
git pull origin main
npm ci --production
pm2 restart myapp
মূল পয়েন্ট:
needs: testনিশ্চিত করে যে ডিপ্লয়মেন্ট শুধুমাত্র টেস্ট পাস হলে চলে।ifশর্তটি ডিপ্লয়মেন্টকেmain-এ পুশে সীমাবদ্ধ করে।- সিক্রেটস (
SSH_HOST,SSH_USER,SSH_KEY) GitHub রিপোজিটরি সেটিংসে সংরক্ষিত থাকে এবং নিরাপদে ইনজেক্ট করা হয়।
এই প্যাটার্নটি অনেক ডিপ্লয়মেন্ট টার্গেটের জন্য কাজ করে: SSH, Docker রেজিস্ট্রি, ক্লাউড প্ল্যাটফর্ম (AWS, Vercel, Netlify), বা Kubernetes।
GitHub Actions-এর সাথে CI/CD-এর জন্য সেরা অনুশীলন
- ওয়ার্কফ্লো দ্রুত রাখুন: বিল্ড সময় কমাতে নির্ভরতা ক্যাশে করুন (যেমন,
actions/cache)। - দ্রুত ব্যর্থ হোন: ধীর টেস্টের আগে দ্রুত চেক (লিন্টিং) চালান।
- এনভায়রনমেন্ট ব্যবহার করুন: প্রোডাকশন ডিপ্লয়মেন্টের জন্য সুরক্ষা নিয়ম কনফিগার করুন।
- সিক্রেটস সুরক্ষিত করুন: কখনো ক্রেডেনশিয়াল হার্ডকোড করবেন না; GitHub Secrets ব্যবহার করুন।
- মনিটর এবং সতর্ক করুন: ব্যর্থ ওয়ার্কফ্লোর জন্য নোটিফিকেশন সেট আপ করুন।
ব্যর্থ ওয়ার্কফ্লো ডিবাগ করা
যখন একটি ওয়ার্কফ্লো ব্যর্থ হয়, GitHub প্রতিটি ধাপের লগ দেখায়। সাধারণ সমস্যাগুলোর মধ্যে রয়েছে:
- অনুপস্থিত নির্ভরতা: টেস্টের আগে
npm ciবা সমতুল্য চলে কিনা নিশ্চিত করুন। - ভুল সিক্রেটস: নাম এবং মান দুবার চেক করুন।
- অনুমতি ত্রুটি: রানার অনুমতি এবং SSH কী যাচাই করুন।
আপনি রিপোজিটরি সিক্রেটস ACTIONS_STEP_DEBUG কে true সেট করে ডিবাগ লগিং সক্রিয় করতে পারেন।
FAQ
CI এবং CD-এর মধ্যে পার্থক্য কী?
CI কোড পরিবর্তনের টেস্টিং এবং ইন্টিগ্রেশন স্বয়ংক্রিয় করে। CD সেই পরিবর্তনগুলো একটি এনভায়রনমেন্টে ডেলিভারি বা ডিপ্লয়মেন্ট স্বয়ংক্রিয় করে। CI কোডের গুণমান নিশ্চিত করে; CD নিশ্চিত করে যে এটি দ্রুত এবং নির্ভরযোগ্যভাবে ব্যবহারকারীদের কাছে পৌঁছায়।
GitHub Actions কি বিনামূল্যে?
GitHub Actions পাবলিক রিপোজিটরির জন্য বিনামূল্যে। প্রাইভেট রিপোজিটরির জন্য, আপনি মাসিক বিনামূল্যে মিনিটের ভাতা পান (যেমন, ফ্রি অ্যাকাউন্টের জন্য 2,000 মিনিট) এবং অতিরিক্ত ব্যবহারের জন্য অর্থ প্রদান করেন। সেলফ-হোস্টেড রানারও একটি বিকল্প।
আমি কি নন-GitHub প্রজেক্টের জন্য GitHub Actions ব্যবহার করতে পারি?
হ্যাঁ, GitHub Actions যেকোনো কমান্ড-লাইন টুল চালাতে পারে। আপনি এটি অন্যত্র হোস্ট করা প্রজেক্ট বিল্ড এবং ডিপ্লয় করতে ব্যবহার করতে পারেন, যতক্ষণ কোড GitHub-এ থাকে বা আপনি এটি আনতে অ্যাকশন ব্যবহার করেন।
আপনার CI/CD স্ট্রিমলাইন করতে প্রস্তুত? GitHub Actions দিয়ে আপনার টেস্ট অটোমেট করে শুরু করুন। ডিপ্লয়মেন্ট লগ দ্রুত বিশ্লেষণ করার জন্য, প্রতিটি ডিপ্লয়ের পরে ত্রুটি এবং পারফরম্যান্স সমস্যা সনাক্ত করতে আমাদের Nginx Log Analyzer ব্যবহার করে দেখুন।