আমি সবসময় স্ট্যাটিক সাইট জেনারেটর (Static Site Generator) পছন্দ করি কারণ এগুলো অনেক ফাস্ট এবং মাঝরাতে ডাটাবেস ক্রাশ করার কোনো ভয় থাকে না। তবে অনেকদিন ধরেই আমার ব্লগিং প্রসেসটা অনেকটা "ম্যানুয়াল ট্রান্সমিশন" গাড়ির মতো মনে হচ্ছিল। কোনো পোস্ট পাবলিশ করতে চাইলে ডেস্কটপে বসে গিট পুশ করতে হতো এবং বিল্ডের জন্য অপেক্ষা করতে হতো। এই সমস্যা কাটাতে আমি Automating My Blog প্রজেক্টটি হাতে নেই।

বিল্ড-টাইম ফিল্টার: তারিখ দিয়ে সিডিউলিং

আমার এই সিস্টেমের প্রাণ হলো ভাইট (Vite)-এর import.meta.glob। যখন আমি কোনো পোস্ট লিখি, তার মেটাডেটাতে একটা তারিখ দিয়ে দেই। স্ভেল্টকিট বিল্ড করার সময় চেক করে দেখে সেই তারিখটি বর্তমান সময়ের পরের কি না। তারিখ যদি ভবিষ্যতে হয়, তবে সেটি প্রোডাকশন বিল্ডে ইনক্লুড হয় না।

const now = new Date().getTime();
// ... লুপের ভেতরে ...
const isVisible = !post.metadata.hidden && postDate <= now;

এখানে একটা বড় সমস্যা বা অভিযোগ হলো, এই ড্রাফটগুলো কিন্তু গিট রিপোজিটরিতে ঠিকই থেকে যায়। যদিও রিপোজিটরি প্রাইভেট, তবে এটি যদি কখনো ওপেন-সোর্স করি, তখন ড্রাফটগুলো হাইড করার জন্য আমাকে অন্য কোনো রাস্তা খুঁজতে হবে।

গিটহাব অ্যাকশনস: ক্রন জবের অবাস্তবতা

সিডিউল করা পোস্টগুলো অটোমেটিকালি লাইভ করার জন্য আমি গিটহাব অ্যাকশনস (GitHub Actions) এ ক্রন জব সেটআপ করেছি। প্রতিটি রাতে এটি একবার করে সাইট রিবিল্ড করে।

on:
  schedule:
    - cron: '0 0 * * *'

কিন্তু একটি জিনিস আমি শিখেছি যে, গিটহাবের এই schedule কমান্ডটি আসলে একটি "সাজেশন" মাত্র। আমি অনেক সময় দেখেছি রাত ১২টার বিল্ড রাত ২টা বা ৩টায় ট্রিগার হচ্ছে। এটি গিটহাবের রানার কতটুকু বিজি তার ওপর নির্ভর করে। আপনার যদি একদম নিখুঁত টাইমিং দরকার হয়, তবে এর ওপর ভরসা না করাই ভালো।

Nix এবং "আমার মেশিনে তো চলে" সমস্যা

আমার বিল্ড এনভায়রনমেন্ট ক্লিন রাখতে আমি Nix Flakes ব্যবহার করি। গিটহাব অ্যাকশনসের ফাইলে আমি সরাসরি npm install রান না করে nix develop ব্যবহার করি যাতে লোকাল মেশিনের মতো একই pnpm বা নোড (Node.js) ভার্সন পাওয়া যায়।

আমি ভেবেছিলাম এটি সব সিআই (CI) প্রবলেম সলভ করবে। কিন্তু আমি একবার একটা অদ্ভূত বাগ ফেস করলাম যেখানে একটি রিমার্ক প্লাগইন ম্যাকওএস (macOS) এ ঠিকঠাক কাজ করলেও লিনাক্স রানারে ফেইল করছিল। আমার মনে হয় Nix আমাদের ৯৫% পথ নিয়ে যায়, কিন্তু বাকি ৫% মেলাতে মাঝেমধ্যে পুরো বিকেলটাই নষ্ট হয়ে যায়।

প্রিভিউ মোড: একটি কুইক হ্যাক

বারবার pnpm dev রান না করে ড্রাফট দেখার জন্য আমি একটি প্রিভিউ মোড ইমপ্লিমেন্ট করেছি। ইউআরএল (URL) এ একটি সিক্রেট টোকেন থাকলে আমার ফিল্টার সেটি বাইপাস করে সব ড্রাফট দেখিয়ে দেয়।

Automating My Blog নিয়ে এই পুরো জার্নিটা আমার ব্লগিংয়ের "ডেপ্লয়মেন্ট এনজাইটি" কমিয়ে দিয়েছে। এখন আমি জাস্ট পোস্ট লিখে তারিখ সেট করে দিয়ে শান্তিতে ঘুমাতে পারি।

স্ভেল্টকিট (SvelteKit) এবং গিটহাব অ্যাকশনস ব্যবহার করে Automating My Blog তৈরির টেকনিক্যাল প্রসেস, তারিখ অনুযায়ী সিডিউলিং এবং নিক্স (Nix) এনভায়রনমেন্টের সীমাবদ্ধতা নিয়ে বিস্তারিত জানুন।

Asaduzzaman Pavel

About the Author

Asaduzzaman Pavel is a Software Engineer who actually enjoys the friction of a well-architected system. He has over 15 years of experience building high-performance backends and infrastructure that can actually handle the real-world chaos of scale.

Currently looking for new opportunities to build something amazing.