منتشر شده در

د GitHub Actions په کارولو سره د بلاګ پوسټونو د خپرولو اعلان تولیدول

نویسندگان

د لیکوال په توګه، زه د نوي محتوا خپرولو په وخت کې د ثبات اهمیت پوهیږم. خو ځینې وختونه ژوند خنډونه پیدا کوي، او دا کیدی شي چې د نوي بلاګ پوست خپرولو یاد ساتل ستونزمن وي. د خپل شریکولو مهال ویش سره په مسیر کې پاتې کیدو لپاره، ما د GitHub Actions په کارولو سره یو ساده یادښت جوړ کړ. په دې پوست کې، زه به دا چې څنګه ما دا کار جریان جوړ کړ شریک کړم.

GitHub Action څه شی دی؟

GitHub Actions یو پیاوړی وسیله ده چې تاسو ته اجازه درکوي خپل کار جریانونه اتومات کړئ. تاسو کولی شئ دا د خپل کوډ جوړولو، ازمویل او ځای پر ځای کولو لپاره وکاروئ. تاسو کولی شئ دا د نورو ډول ډول کارونو ترسره کولو لپاره هم وکاروئ، لکه د خبرتیاو لیږل یا د یادښتونو مهالویش کول.

زه څنګه د بلاګ پوست لیکلو لپاره یادښت جوړ کړ؟

د بلاګ پوست لیکلو لپاره د یادښت جوړولو لپاره، زه [د GitHub ځانګړي ذخیرې] (https://github.com/ImBIOS/ImBIOS) [README.md] (http://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] (http://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] (http://README.md) فایل په دې د بلاګ پوستونو لیست سره تازه کوي. که نوي بلاګ پوستونه شتون نلري، نو دا یوه غلطي رامینځته کوي ترڅو ما ته یادښت ورکړي چې بلاګ پوست ولیکم.

دا یوازې یوه غلطي ده چې کله سکریپټ اجرا کیږي او پوستونه لاهم ورته دي، دا د یادښت په توګه نه ده چې ما ته په بریښناليک کې لیږل کیږي یا زما لپاره نور لیدل کیدی شي. نو، ما پریکړه وکړه چې د هر ناکام کار جریان اجرا لپاره خبرتیا فعال کړم. دلته څنګه دا کار کول کیږي:

  1. د پاڼې په ښي اړخ کې د پورتنۍ برخې کې کلیک وکړئ او ترتیبات غوره کړئ.

  2. په چپ لور کې د کنترول تختې کې خبرتیاوې غوره کړئ.

  3. کړنې باندې کلیک وکړئ.

  4. یوازې د ناکام کار جریانونو لپاره خبرتیاوې لیږئ غوره کړئ.

اوس، کله چې سکریپټ اجرا کیږي او نوي بلاګ پوستونه شتون نلري، ما ته خبرتیا به ورکړل شي. زه کولی شم د GitHub ویب پاڼې په اړه خبرتیا هم وګورم.

بل لاره چې ما یې پلټنه وکړه

پخوانی کار جریان چې ما تاسو ته وویل، یوه تعدیل شوی نسخه ده، نو زما [README.md] (http://README.md) تل تازه وي. ما د بلاګ پوست لیکلو لپاره د یادښت جوړولو لپاره بله لاره هم پلټنه وکړه. خو دا یوازې یو یادښت دی، د [README.md] (http://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] (http://README.md) فایل تازه کول دي. دوهم لاره د بریښناليک یادښت لیږل دي. زه اوس د لومړۍ لارې کار اخلم ځکه چې د دوهمې لارې په پرتله ډیر لیدل کیدی شي. زه کولی شم د هرې ځلې چې زما د GitHub پروفایل څخه لیدنه کوم یادښت وګورم.

د بلاګ پوست لیکلو لپاره د یادښت جوړول د GitHub Actions په کارولو سره د خپل بلاګ مهال ویش سره په مسیر کې پاتې کیدو لپاره یوه ساده او اغیزمنه لاره ده. د دې کار جریان په ځای کولو سره، تاسو به هیڅکله د نوي پوست لیکلو له یادولو څخه مهرباني ونه کړئ. که تاسو په خپل یادښت کار جریان جوړولو کې علاقه لرئ، نو ډاډ ترلاسه کړئ چې د GitHub Actions اسنادو څخه لیدنه وکړئ ترڅو نور معلومات ترلاسه کړئ. خوشحاله بلاګ کول!