نُشر في

كيفية إنشاء تذكيرات لمشاركة مدونة باستخدام GitHub Actions

الكتاب

إنشاء تذكير لكتابة مشاركة مدونة باستخدام GitHub Actions

ككاتب، أفهم أهمية الاتساق عند نشر محتوى جديد. ومع ذلك، هناك أوقات تتداخل فيها الحياة، وقد يكون من الصعب تذكر كتابة مشاركة مدونة جديدة. لمساعدتي في البقاء على المسار الصحيح مع جدول مشاركاتي، قمت بإنشاء تذكير بسيط باستخدام 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' # يتم تشغيله في الساعة 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. ثم يقوم بتشغيل نص يحدّث قائمة مشاركات المدونة. النص مكتوب بلغة JavaScript ويحلل موجز RSS لمدونتي. ثم يقوم بإنشاء قائمة بمشاركات المدونة وتحديث ملف README.md. أخيرًا، يقوم بإجراء تغييرات الدمج ودفعها إلى GitHub. أنا أستخدم مستودع ouuan كمرجع لهذا التدفق.

من أين أتى التذكير؟ هو في الواقع موجود في ملف list-posts.js. لقد أضفت تذكيرًا إلى قائمة مشاركات المدونة. إليك محتوى الملف:

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

/**
 * تحويل سلسلة XML إلى 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
}

/**
 * فرز JSON حسب pubDate
 * @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 صباحًا، لتذكيري بكتابة مشاركة مدونة جديدة. استخدمت إجراءً تابعًا لجهة خارجية، dawidd6/action-send-mail، لإرسال البريد الإلكتروني. لقد قدمت بيانات اعتماد بريدي الإلكتروني كأمان GitHub، لذلك فهي غير مرئية في ملف تدفق العمل.

الخاتمة

لقد استكشفت طريقتين لإنشاء تذكير لكتابة مشاركة مدونة. الطريقة الأولى هي تحديث ملف README.md لملفي الشخصي على GitHub. الطريقة الثانية هي إرسال تذكير عبر البريد الإلكتروني. أقوم حاليًا باستخدام الطريقة الأولى لأنها أكثر وضوحًا من الطريقة الثانية. يمكنني رؤية التذكير في كل مرة أزور فيها ملف تعريف GitHub الخاص بي.

إن إنشاء تذكير لكتابة مشاركة مدونة باستخدام GitHub Actions هو طريقة بسيطة وفعالة للبقاء على المسار الصحيح مع جدول مدونتك. مع وجود هذا التدفق العمل، لن تنسى أبدًا كتابة مشاركة جديدة. إذا كنت مهتمًا بإنشاء تدفق العمل الخاص بك، فتأكد من مراجعة وثائق GitHub Actions لمعرفة المزيد. تمتع بالتدوين!