خپره شوې پر

د 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
}

/**
 * د 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. د عملونو په باندې کلیک وکړئ.

  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 راز په توګه ورکړل، نو دوی په کار جریان فایل کې لیدل کیږي.

نتیجه

ما د بلاګ پوسټ لیکلو لپاره د یادونکي جوړولو دوه لارې پلټنه وکړه. لومړی لاره د زما GitHub پروفایل د README.md فایل تازه کول دي. دوهم لاره د بریښناليک یادونکي لیږل دي. زه اوس د لومړۍ لارې کارولو سره مخ یم ځکه چې دا د دوهمې لارې په پرتله ډیر لیدل کیږي. زه کولی شم هغه وخت یادونکی وګورم کله چې زه خپل GitHub پروفایل ته ځم.

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