برنامه نویسی

چگونه با استفاده از GitHub Action یادآوری برای نوشتن یک پست وبلاگ ایجاد کردم

به عنوان یک نویسنده، اهمیت ثبات را در انتشار محتوای جدید درک می کنم. با این حال، مواقعی وجود دارد که زندگی مانع می شود، و یادآوری نوشتن یک پست وبلاگ جدید می تواند چالش برانگیز باشد. برای اینکه به من کمک کند برنامه اشتراک‌گذاری خود را در مسیر خود نگه دارم، با استفاده از GitHub Actions یک یادآوری ساده ایجاد کردم. در این پست نحوه ساخت این گردش کار را به اشتراک می گذارم.

GitHub Action چیست؟

GitHub Actions ابزار قدرتمندی است که به شما امکان می دهد گردش کار خود را خودکار کنید. می توانید از آن برای ساخت، آزمایش و استقرار کد خود استفاده کنید. همچنین می‌توانید از آن برای انجام طیف گسترده‌ای از وظایف دیگر مانند ارسال اعلان‌ها یا زمان‌بندی یادآوری استفاده کنید.

چگونه یک یادآور برای نوشتن یک پست وبلاگ ایجاد کردم

برای ایجاد یک یادآوری برای نوشتن یک پست وبلاگ، من از مخزن ویژه GitHub README.md استفاده می کنم و فایلی به نام .github/workflows/blog-posts.yml اضافه کردم. در این فایل، من گردش کاری را که GitHub Actions اجرا می کند، تعریف کردم. در اینجا محتوای اولیه فایل آمده است:

name: Blog Posts

on:
  schedule:
    - cron: '0 0 * * 0' # Run at 00:00 every Sunday
  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')

/**
 * Convert XML string to 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
}

/**
 * Sort JSON by pubDate
 * @param {object} json
 * @returns {object} sortedJson
 */
const sortJson = (json) => {
  json.sort((a, b) => new Date(b.pubDate) - new Date(a.pubDate))
  return json
}

// Read XML file and convert to JSON
const xmlString = readFileSync('feed.xml', 'utf8')
const feeds = sortJson(xmlToJson(xmlString).rss.channel.item)

// Create Markdown list of posts
const posts = feeds
  .slice(0, 5)
  .map(
    (item) =>
      `- ${new Date(item.pubDate).toISOString().split('T')[0]} [${item.title}](${
        item.link
      }?utm_source=GitHubProfile)`
  )

// Update README.md if posts have changed,
// Otherwise throw an error to remind me to write a blog post
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. را کلیک کنید اقدامات.
  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 صبح یک ایمیل یادآوری برای من ارسال می کند و به من یادآوری می کند که یک پست وبلاگ جدید بنویسم. من از یک اقدام شخص ثالث، dawidd6/action-send-mail، برای ارسال ایمیل استفاده کردم. من اعتبار ایمیل خود را به عنوان اسرار GitHub ارائه کردم، بنابراین در فایل گردش کار قابل مشاهده نیستند.

نتیجه

من دو راه را برای ایجاد یادآوری برای نوشتن یک پست وبلاگ بررسی کرده ام. راه اول این است که فایل README.md نمایه GitHub من را به روز کنم. راه دوم ارسال یک ایمیل یادآوری است. من در حال حاضر از راه اول استفاده می کنم زیرا بیشتر از راه دوم قابل مشاهده است. هر بار که از نمایه GitHub خود بازدید می کنم، می توانم یادآوری را ببینم.

ایجاد یک یادآوری برای نوشتن یک پست وبلاگ با استفاده از GitHub Actions یک راه ساده و موثر برای ادامه برنامه وبلاگ نویسی شما است. با وجود این گردش کار، هرگز فراموش نخواهید کرد که دوباره یک پست جدید بنویسید. اگر علاقه مند به ایجاد گردش کار یادآوری خود هستید، حتماً اسناد GitHub Actions را بررسی کنید تا بیشتر بدانید. وبلاگ نویسی مبارک!

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا