Нашр шудааст дар

Истифодаи GitHub Actions барои эҷоди маълумот дар бораи нашри мақолаи блог

Муаллифон

Ҳамчун як нависанда, ман аз аҳамияти якхелагии маълумоти нашршуда огоҳ ҳастам. Аммо, вақте ки зиндагӣ ба роҳи мо монеа мешавад, ба хотир овардани навиштани як пости нав дар блог душвор мешавад. Барои он ки ман ба ҷадвали мубодилаи худ мувофиқ бошам, ман бо истифода аз GitHub Actions як хотиррасони оддӣ эҷод кардам. Дар ин пост, ман чӣ гуна ин корро анҷом додам, баён хоҳам кард.

GitHub Actions чист?

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 назар андозед, то маълумоти бештар гиред. Блогнависии хушбахт!