প্রকাশিত

GitHub Actions ব্যবহার করে ব্লগ পোস্ট প্রকাশের বিজ্ঞপ্তি তৈরি করা

লেখকগণ

নতুন ব্লগ পোস্ট লেখার জন্য GitHub Actions ব্যবহার করে মনে করিয়ে দেওয়ার জন্য একটি সহজ সিস্টেম তৈরি করা

একজন লেখক হিসেবে, আমি নতুন কনটেন্ট প্রকাশের ক্ষেত্রে সঙ্গতির গুরুত্ব বুঝতে পারি। তবে, এমন সময় থাকে যখন জীবন পথে বাধা সৃষ্টি করে এবং নতুন ব্লগ পোস্ট লেখার কথা মনে রাখা কঠিন হয়ে পড়ে। আমার শেয়ারিং সিডিউলের সাথে পালন করতে সাহায্য করার জন্য, আমি GitHub Actions ব্যবহার করে একটি সহজ মনে করিয়ে দেওয়া সিস্টেম তৈরি করেছি। এই পোস্টে, আমি কিভাবে এই ওয়ার্কফ্লো তৈরি করেছি তা শেয়ার করব।

GitHub Action কী?

GitHub Actions একটি শক্তিশালী টুল যা আপনাকে আপনার ওয়ার্কফ্লো স্বয়ংক্রিয় করতে দেয়। আপনি এটি আপনার কোড তৈরি, পরীক্ষা এবং স্থাপন করার জন্য ব্যবহার করতে পারেন। আপনি এটি অন্যান্য বিভিন্ন কাজের জন্যও ব্যবহার করতে পারেন, যেমন বিজ্ঞপ্তি পাঠানো বা মনে করিয়ে দেওয়ার জন্য সময়সূচি তৈরি করা।

আমি কিভাবে একটি ব্লগ পোস্ট লেখার মনে করিয়ে দেওয়ার জন্য একটি সিস্টেম তৈরি করেছি

একটি ব্লগ পোস্ট লেখার মনে করিয়ে দেওয়ার জন্য, আমি GitHub এর ImBIOS রিপোজিটরিতে README.md ফাইলটি ব্যবহার করেছি এবং .github/workflows/blog-posts.yml নামে একটি ফাইল যোগ করেছি। এই ফাইলে, আমি GitHub Actions দ্বারা কার্যকর করা হবে এমন ওয়ার্কফ্লো নির্ধারণ করেছি। ফাইলটির প্রাথমিক কনটেন্ট এখানে:

name: Blog Posts

on:
  schedule:
    - cron: '0 0 * * 0' # প্রতি রবিবার 00:00 এ চালানো হবে
  workflow_dispatch:

jobs:
  update-posts:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Update post list
        run: |
          sleep 1m
          curl -LO https://blog.imam.dev/feed.xml
          node src/list-posts.js
          rm feed.xml
      - name: Commit changes
        run: |
          git config --local user.email "github-actions[bot]@users.noreply.github.com"
          git config --local user.name "github-actions[bot]"
          git add -A
          git diff-index --quiet HEAD || git commit -m "Update blog posts"
      - name: Pull changes
        run: git pull -r
      - name: Push changes
        uses: ad-m/github-push-action@0fafdd62b84042d49ec0cb92d9cac7f7ce4ec79e
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }}

এই ওয়ার্কফ্লো প্রতি রবিবার 00:00 এ চালু হয়। তারপর এটি একটি স্ক্রিপ্ট চালায় যা ব্লগ পোস্টের তালিকা আপডেট করে। স্ক্রিপ্টটি জাভাস্ক্রিপ্টে লেখা এবং আমার ব্লগের RSS ফিড পার্স করে। তারপর এটি ব্লগ পোস্টের একটি তালিকা তৈরি করে এবং README.md ফাইলটি আপডেট করে। অবশেষে, এটি পরিবর্তনগুলি প্রতিশ্রুতিবদ্ধ করে এবং GitHub এ পুশ করে। এই ওয়ার্কফ্লোর জন্য, আমি ouuan এর রিপোজিটরিটিকে রেফারেন্স হিসেবে ব্যবহার করেছি।

মনে করিয়ে দেওয়ার সিস্টেমটি কোথা থেকে এসেছে? এটি আসলে list-posts.js ফাইলে। আমি ব্লগ পোস্টের তালিকায় একটি মনে করিয়ে দেওয়া যোগ করেছি। ফাইলটির কনটেন্ট এখানে:

const { readFileSync, writeFileSync } = require('fs')

/**
 * XML string কে JSON এ রূপান্তর করুন
 * @param {string} xmlString
 * @returns {object} json
 */
const xmlToJson = (xmlString) => {
  const regex = /<(\w+)([^>]*)>([\s\S]*?)<\/\1>/gm
  const matches = xmlString.matchAll(regex)
  const json = {}

  for (const match of matches) {
    const [, key, attributes, value] = match
    const subMatches = value.matchAll(regex)
    const subJson = {}

    for (const subMatch of subMatches) {
      const [, subKey, subAttributes, subValue] = subMatch

      if (subValue.match(regex)) {
        if (Array.isArray(subJson[subKey])) {
          subJson[subKey].push(
            xmlToJson(`<${subKey}${subAttributes}>${subValue}</${subKey}>`)[subKey]
          )
        } else if (subJson[subKey]) {
          subJson[subKey] = [
            subJson[subKey],
            xmlToJson(`<${subKey}${subAttributes}>${subValue}</${subKey}>`)[subKey],
          ]
        } else {
          subJson[subKey] = xmlToJson(`<${subKey}${subAttributes}>${subValue}</${subKey}>`)[subKey]
        }
      } else if (Array.isArray(subJson[subKey])) {
        subJson[subKey].push(subValue)
      } else if (subJson[subKey]) {
        subJson[subKey] = [subJson[subKey], subValue]
      } else {
        subJson[subKey] = subValue
      }
    }

    if (json[key]) {
      if (Array.isArray(json[key])) {
        json[key].push(subJson)
      } else {
        json[key] = [json[key], subJson]
      }
    } else {
      json[key] = subJson
    }
  }

  return json
}

/**
 * pubDate দ্বারা JSON সাজান
 * @param {object} json
 * @returns {object} sortedJson
 */
const sortJson = (json) => {
  json.sort((a, b) => new Date(b.pubDate) - new Date(a.pubDate))
  return json
}

// XML ফাইল পড়ুন এবং JSON এ রূপান্তর করুন
const xmlString = readFileSync('feed.xml', 'utf8')
const feeds = sortJson(xmlToJson(xmlString).rss.channel.item)

// পোস্টগুলির Markdown তালিকা তৈরি করুন
const posts = feeds
  .slice(0, 5)
  .map(
    (item) =>
      `- ${new Date(item.pubDate).toISOString().split('T')[0]} [${item.title}](${
        item.link
      }?utm_source=GitHubProfile)`
  )

// যদি পোস্টগুলি পরিবর্তিত হয়, তাহলে README.md আপডেট করুন,
// অন্যথায় একটি ব্লগ পোস্ট লেখার জন্য মনে করিয়ে দেওয়ার জন্য একটি ত্রুটি ছুড়ে দিন
const readme = readFileSync('README.md', 'utf8')
if (readme.includes(posts.join('\n'))) {
  throw new Error('No new blog posts')
} else {
  const updatedReadme = readFileSync('README.md', 'utf8').replace(
    /(?<=<!--START_SECTION:blog-posts-->\n)[\s\S]*(?=\n<!--END_SECTION:blog-posts-->)/,
    posts.join('\n')
  )
  writeFileSync('README.md', updatedReadme)

  console.log('Updated README.md')
}

স্ক্রিপ্টটি আমার ব্লগের RSS ফিড পড়ে এবং ব্লগ পোস্টের একটি তালিকা তৈরি করে। তারপর এটি README.md ফাইলটি ব্লগ পোস্টের তালিকা দিয়ে আপডেট করে। যদি কোন নতুন ব্লগ পোস্ট না থাকে, তাহলে এটি একটি ত্রুটি ছুড়ে দেয় যা আমাকে একটি ব্লগ পোস্ট লেখার জন্য মনে করিয়ে দেয়।

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

  1. পৃষ্ঠার উপরে ডানদিকে ক্লিক করুন এবং সেটিংস নির্বাচন করুন।

  2. বামদিকের সাইডবারে বিজ্ঞপ্তি নির্বাচন করুন।

  3. Actions এ ক্লিক করুন।

  4. ব্যর্থ ওয়ার্কফ্লোর জন্য কেবলমাত্র বিজ্ঞপ্তি পাঠান নির্বাচন করুন।

এখন, যখন স্ক্রিপ্টটি চালানো হবে এবং কোন নতুন ব্লগ পোস্ট না থাকবে তখন আমি একটি বিজ্ঞপ্তি পাব। GitHub ওয়েবসাইটেও আমি বিজ্ঞপ্তিটি দেখতে পারব।

আরেকটি উপায় যা আমি অনুসন্ধান করেছি

আপনাকে যে ওয়ার্কফ্লোটি সম্পর্কে বললাম তা একটি সংশোধিত সংস্করণ যাতে আমার README.md ফাইলটি সর্বদা আপডেট থাকে। আমি একটি ব্লগ পোস্ট লেখার জন্য একটি মনে করিয়ে দেওয়ার সিস্টেম তৈরির আরেকটি উপায়ও অনুসন্ধান করেছি। তবে, এটি একটি বিশুদ্ধ মনে করিয়ে দেওয়ার সিস্টেম, README.md আপডেট করার কোনও ব্যবস্থা ছাড়া, কেবলমাত্র একটি মনে করিয়ে দেওয়ার।

একটি ব্লগ পোস্ট লেখার জন্য একটি মনে করিয়ে দেওয়ার সিস্টেম তৈরি করার জন্য, আমি একটি নতুন GitHub রিপোজিটরি তৈরি করেছি এবং .github/workflows/remind.yml নামে একটি ফাইল যোগ করেছি। এই ফাইলে, আমি GitHub Actions দ্বারা কার্যকর করা হবে এমন ওয়ার্কফ্লো নির্ধারণ করেছি। ফাইলটির কনটেন্ট এখানে:

name: Reminder to write a blog post

on:
  schedule:
    - cron: '0 10 * * 1-5'

jobs:
  remind:
    runs-on: ubuntu-latest
    steps:
      - name: Send a reminder
        uses: dawidd6/action-send-mail@v3.1.0
        with:
          server_address: smtp.gmail.com
          server_port: 465
          username: ${{ secrets.EMAIL_USERNAME }}
          password: ${{ secrets.EMAIL_PASSWORD }}
          subject: 'Reminder to write a new blog post'
          body: "Don't forget to write a new blog post today!"
          to: my-email@example.com

এই ওয়ার্কফ্লোটি প্রতি সপ্তাহের দিন 10:00 AM এ আমাকে একটি ইমেল মনে করিয়ে দেয় যা আমাকে একটি নতুন ব্লগ পোস্ট লেখার জন্য মনে করিয়ে দেয়। আমি ইমেল পাঠানোর জন্য একটি তৃতীয় পক্ষের অ্যাকশন, dawidd6/action-send-mail, ব্যবহার করেছি। আমি আমার ইমেল ক্রেডেনশিয়াল GitHub সিক্রেট হিসেবে প্রদান করেছি, তাই ওয়ার্কফ্লো ফাইলে এগুলি দৃশ্যমান নয়।

উপসংহার

আমি একটি ব্লগ পোস্ট লেখার জন্য একটি মনে করিয়ে দেওয়ার সিস্টেম তৈরির দুটি উপায় অনুসন্ধান করেছি। প্রথম উপায়টি আমার GitHub প্রোফাইলের README.md ফাইলটি আপডেট করা। দ্বিতীয় উপায়টি একটি ইমেল মনে করিয়ে দেওয়া পাঠানো। বর্তমানে আমি প্রথম উপায়টি ব্যবহার করছি কারণ এটি দ্বিতীয় উপায়ের চেয়ে বেশি দৃশ্যমান। প্রতিবার আমার GitHub প্রোফাইলটি দেখার সময় আমি মনে করিয়ে দেওয়াটি দেখতে পারি।

GitHub Actions ব্যবহার করে একটি ব্লগ পোস্ট লেখার জন্য একটি মনে করিয়ে দেওয়ার সিস্টেম তৈরি করা আপনার ব্লগিং সিডিউলের সাথে পালন করার একটি সহজ এবং কার্যকর উপায়। এই ওয়ার্কফ্লোটি স্থাপনের মাধ্যমে, আপনি আর কখনও নতুন পোস্ট লেখার কথা ভুলে যাবেন না। আপনি যদি আপনার নিজের মনে করিয়ে দেওয়ার ওয়ার্কফ্লো তৈরি করতে আগ্রহী হন, তাহলে আরও জানতে GitHub Actions ডকুমেন্টেশন দেখুন। শুভ ব্লগিং!