Cloudflare এর হাতেখড়ি (পর্ব ২) – GitHub Actions দিয়ে অটো-ডেপ্লয় (CI/CD)

GitHub Actions দিয়ে Cloudflare Pages CI/CD

আগের পর্বে Cloudflare-এর বিল্ট-ইন Git integration দিয়ে সাইট ডেপ্লয় করেছিলাম — GitHub-এ পুশ করলেই Cloudflare নিজে থেকে বিল্ড করে লাইভ করে দেয়। কিন্তু বাস্তব প্রজেক্টে (যেমন Pathok Ghar-এ PDF/EPUB জেনারেশন) কখনো কখনো ডেপ্লয়ের আগে কাস্টম কিছু ধাপ লাগে, যা Cloudflare-এর ডিফল্ট বিল্ড প্রসেসে করা যায় না। এই পর্বে শিখব GitHub Actions দিয়ে নিজের কাস্টম পাইপলাইন বানিয়ে Cloudflare Pages-এ ডেপ্লয় করা।

কেন GitHub Actions দরকার, Cloudflare-এর নিজস্ব বিল্ড থাকতে?

  • কাস্টম বিল্ড ধাপ — যেমন ডেপ্লয়ের আগে একটা স্ক্রিপ্ট চালিয়ে ডেটা প্রসেস করা, ইমেজ অপটিমাইজ করা, বা PDF জেনারেট করা
  • একাধিক জব সমান্তরালে — টেস্ট চালানো, লিন্ট চেক করা, তারপর ডেপ্লয় করা — সব একটা ওয়ার্কফ্লোতে
  • একাধিক টার্গেটে ডেপ্লয় — একই কোড থেকে Cloudflare Pages আর অন্য কোথাও (যেমন একটা APK বিল্ড) একসাথে বানানো
  • পূর্ণ নিয়ন্ত্রণ — ঠিক কোন Node ভার্সন, কোন এনভায়রনমেন্টে বিল্ড হবে তা নিজে ঠিক করা

API Token তৈরি করা

GitHub Actions থেকে Cloudflare-এ ডেপ্লয় করতে একটা API Token লাগবে, যা GitHub Actions-কে Cloudflare অ্যাকাউন্টে অনুমতি দেবে।

  1. Cloudflare Dashboard-এ My Profile → API Tokens-এ যান
  2. Create Token চাপুন
  3. Edit Cloudflare Workers টেমপ্লেট বেছে নিন (এটাই Pages ডেপ্লয়ের জন্যও কাজ করে)
  4. Account resources-এ নিজের অ্যাকাউন্ট বেছে নিন, টোকেন তৈরি করুন
  5. টোকেনটা কপি করে রাখুন — এটা শুধু একবারই দেখা যাবে

GitHub Secrets-এ টোকেন যোগ করা

টোকেন কখনো কোডে সরাসরি লেখা যাবে না — GitHub-এর Secrets-এ সেভ করতে হয়।

  1. নিজের GitHub রিপোজিটরিতে Settings → Secrets and variables → Actions-এ যান
  2. New repository secret চেপে নাম দিন CLOUDFLARE_API_TOKEN, ভ্যালুতে কপি করা টোকেন বসান
  3. আরেকটা secret যোগ করুন — CLOUDFLARE_ACCOUNT_ID (Dashboard-এর ডানপাশে Account ID পাওয়া যায়)

Workflow ফাইল লেখা

রিপোজিটরিতে .github/workflows/deploy.yml ফাইল বানাতে হবে।

# .github/workflows/deploy.yml
name: Deploy to Cloudflare Pages

on:
  push:
    branches:
      - main

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: কোড চেকআউট
        uses: actions/checkout@v4

      - name: Node.js সেটআপ
        uses: actions/setup-node@v4
        with:
          node-version: 20

      - name: ডিপেন্ডেন্সি ইনস্টল
        run: npm install

      - name: বিল্ড
        run: npm run build

      - name: Cloudflare Pages-এ ডেপ্লয়
        uses: cloudflare/pages-action@v1
        with:
          apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
          accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
          projectName: my-first-site
          directory: dist

এই ফাইলটা পুশ করার সাথে সাথেই GitHub-এর Actions ট্যাবে গিয়ে পুরো প্রসেসটা লাইভ দেখা যাবে — প্রতিটা স্টেপ (checkout, setup, install, build, deploy) আলাদা করে সবুজ ✅ বা লাল ❌ চিহ্ন দেখাবে।

কাস্টম ধাপ যোগ করা — বাস্তব উদাহরণ

ধরা যাক Pathok Ghar-এর মতো একটা প্রজেক্টে, ডেপ্লয়ের আগে বইয়ের PDF জেনারেট করতে হয়। বিল্ডের আগে একটা এক্সট্রা স্টেপ যোগ করলেই হয়ে যায়।

      - name: ডিপেন্ডেন্সি ইনস্টল
        run: npm install

      - name: PDF/EPUB জেনারেট করা
        run: npm run generate-books

      - name: বিল্ড
        run: npm run build

      - name: Cloudflare Pages-এ ডেপ্লয়
        uses: cloudflare/pages-action@v1
        with:
          apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
          accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
          projectName: pathok-ghar
          directory: dist

প্রতিটা - name: ... ব্লক একটা আলাদা স্টেপ — ওপর থেকে নিচে ক্রমানুসারে চলে, কোনো একটা ব্যর্থ হলে বাকি স্টেপগুলো থেমে যায়, যা আসলে ভালো — ভাঙা কোড ভুলেও লাইভে ডেপ্লয় হবে না।

Deploy করার আগে টেস্ট চালানো

আরেকটা গুরুত্বপূর্ণ প্যাটার্ন — বিল্ডের আগে টেস্ট/লিন্ট চালিয়ে নিশ্চিত হওয়া কোডে স্পষ্ট ভুল নেই।

      - name: ডিপেন্ডেন্সি ইনস্টল
        run: npm install

      - name: লিন্ট চেক
        run: npm run lint

      - name: বিল্ড
        run: npm run build

npm run lint যদি কোনো এরর ধরে, তাহলে build স্টেপ আর চলবে না — অর্থাৎ ভাঙা কোড কখনো Cloudflare Pages-এ পৌঁছাবে না।

ইন্টারেক্টিভ — CI/CD পাইপলাইন দেখো

নিচে একটা টাইপিক্যাল ওয়ার্কফ্লো রান কেমন দেখতে হয় তা সিমুলেট করা হয়েছে — একটা স্টেপ ইচ্ছাকৃতভাবে ব্যর্থ করে দেখো বাকি স্টেপ কীভাবে থেমে যায়।

ভালো অভ্যাস

  • সিক্রেট কখনো কোডে হার্ডকোড করবেন না — সবসময় GitHub Secrets ব্যবহার করুন, Firebase এর হাতেখড়ি পর্ব ১২-এর মতোই
  • শুধু main ব্রাঞ্চে অটো-ডেপ্লয় রাখুন — অন্য ব্রাঞ্চে পুশ করলে ডেপ্লয় না হওয়াই নিরাপদ
  • বিল্ডের আগে সবসময় test/lint স্টেপ রাখুন — ভাঙা কোড লাইভে যাওয়া ঠেকায়

নিজে চেষ্টা করো

Exercise:

  1. নিজের একটা রিপোজিটরিতে Cloudflare API Token তৈরি করে GitHub Secrets-এ যোগ করো।
  2. উপরের deploy.yml নিজের প্রজেক্টে বসিয়ে পুশ করো, GitHub-এর Actions ট্যাবে গিয়ে লাইভ প্রসেস দেখো।
  3. ইচ্ছাকৃতভাবে বিল্ড ব্যর্থ করে (যেমন ভুল সিনট্যাক্স যোগ করে) দেখো পুরো পাইপলাইন কীভাবে থেমে যায়।
  4. একটা কাস্টম স্টেপ যোগ করো (যেমন একটা সাধারণ echo "হ্যালো" কমান্ড) বুঝতে কীভাবে যেকোনো শেল কমান্ড এই পাইপলাইনে চালানো যায়।

পরের পর্বে যা থাকছে

পরের পর্বে আমরা শিখব Custom Domain ও DNS সেটআপ — নিজের .pages.dev সাবডোমেইনের বদলে নিজের ডোমেইন কীভাবে যুক্ত করতে হয়, আর DNS রেকর্ড কীভাবে কাজ করে।

একটি মন্তব্য পোস্ট করুন

নবীনতর পূর্বতন

যোগাযোগ ফর্ম