আগের পর্বে 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 অ্যাকাউন্টে অনুমতি দেবে।
- Cloudflare Dashboard-এ My Profile → API Tokens-এ যান
- Create Token চাপুন
- Edit Cloudflare Workers টেমপ্লেট বেছে নিন (এটাই Pages ডেপ্লয়ের জন্যও কাজ করে)
- Account resources-এ নিজের অ্যাকাউন্ট বেছে নিন, টোকেন তৈরি করুন
- টোকেনটা কপি করে রাখুন — এটা শুধু একবারই দেখা যাবে
GitHub Secrets-এ টোকেন যোগ করা
টোকেন কখনো কোডে সরাসরি লেখা যাবে না — GitHub-এর Secrets-এ সেভ করতে হয়।
- নিজের GitHub রিপোজিটরিতে Settings → Secrets and variables → Actions-এ যান
- New repository secret চেপে নাম দিন
CLOUDFLARE_API_TOKEN, ভ্যালুতে কপি করা টোকেন বসান - আরেকটা 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:
- নিজের একটা রিপোজিটরিতে Cloudflare API Token তৈরি করে GitHub Secrets-এ যোগ করো।
- উপরের
deploy.ymlনিজের প্রজেক্টে বসিয়ে পুশ করো, GitHub-এর Actions ট্যাবে গিয়ে লাইভ প্রসেস দেখো। - ইচ্ছাকৃতভাবে বিল্ড ব্যর্থ করে (যেমন ভুল সিনট্যাক্স যোগ করে) দেখো পুরো পাইপলাইন কীভাবে থেমে যায়।
- একটা কাস্টম স্টেপ যোগ করো (যেমন একটা সাধারণ
echo "হ্যালো"কমান্ড) বুঝতে কীভাবে যেকোনো শেল কমান্ড এই পাইপলাইনে চালানো যায়।
পরের পর্বে যা থাকছে
পরের পর্বে আমরা শিখব Custom Domain ও DNS সেটআপ — নিজের .pages.dev সাবডোমেইনের বদলে নিজের ডোমেইন কীভাবে যুক্ত করতে হয়, আর DNS রেকর্ড কীভাবে কাজ করে।