Yayımlanma tarixi

GitHub Actions istifadə edərək blog yazısı nəşr bildirişlərinin yaradılması

Müəllif(lər)

Yeni məzmun nəşr edərkən ardıcıllığın vacibliyini başa düşən bir yazıçı kimi

Həyatın yolundan çıxması və yeni bir bloq yazısını yazmağı xatırlamağın çətin olması halları olur. Paylaşma cədvəlimdə yolunda qalmaq üçün GitHub Actions-dan istifadə edərək sadə bir xatırlatma yaratdım. Bu yazıda, bu iş axınının necə yaradıldığını paylaşacağam.

GitHub Action nədir?

GitHub Actions, iş axınlarınızı avtomatlaşdırmağa imkan verən güclü bir vasitədir. Kodunuzu qurmaq, sınamaq və yerləşdirmək üçün istifadə edə bilərsiniz. Həmçinin bildirişlər göndərmək və ya xatırlatmalar təyin etmək kimi müxtəlif digər vəzifələri yerinə yetirmək üçün də istifadə edə bilərsiniz.

Bloq Yazısı Yazma Xatırlatması Necə Yaradıldı

Bloq yazısı yazmaq üçün bir xatırlatma yaratmaq üçün, GitHub-ın xüsusi anbarını README.md istifadə edirəm və .github/workflows/blog-posts.yml adlı bir fayl əlavə edirəm. Bu faylda, GitHub Actions tərəfindən icra ediləcək iş axınını müəyyənləşdirdim. Faylın ilkin məzmunu belədir:

name: Blog Posts

on:
  schedule:
    - cron: '0 0 * * 0' # Hər bazar günü 00:00-da işə salın
  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 }}

Bu iş axını hər bazar günü saat 00:00-da işə salınır. Sonra bloq yazıları siyahısını yeniləyən bir skript işə salır. Skript JavaScript dilində yazılmışdır və blogumun RSS qidalanmasını analiz edir. Sonra bloq yazılarının siyahısını yaradır və README.md faylını yeniləyir. Nəhayət, dəyişiklikləri yerinə yetirir və onları GitHub-a göndərir. Bu iş axını üçün ouuan'ın anbarından istinad götürürəm.

Xatırlatma haradan gəlir? Əslində, list-posts.js faylında yerləşir. Bloq yazıları siyahısına bir xatırlatma əlavə etdim. Faylın məzmunu belədir:

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

/**
 * XML stringini JSON-a çevirmək
 * @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-u pubDate ilə sıralayır
 * @param {object} json
 * @returns {object} sortedJson
 */
const sortJson = (json) => {
  json.sort((a, b) => new Date(b.pubDate) - new Date(a.pubDate))
  return json
}

// XML faylını oxuyur və JSON-a çevirir
const xmlString = readFileSync('feed.xml', 'utf8')
const feeds = sortJson(xmlToJson(xmlString).rss.channel.item)

// Yazıların Markdown siyahısını yaradır
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-ni yeniləyir, əgər yazılar dəyişibsə,
// Əks halda, blog yazısı yazmağı xatırlatmaq üçün bir səhv çıxarır
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')
}

Skript blogumun RSS qidalanmasını oxuyur və bloq yazılarının siyahısını yaradır. Sonra README.md faylını bloq yazılarının siyahısı ilə yeniləyir. Əgər yeni bloq yazıları yoxdursa, blog yazısı yazmağı xatırlatmaq üçün bir səhv çıxarır.

Bu, skript icra olunarkən yazılar eyni qalırsa çıxarılacaq bir səhvdir və bu, e-poçta göndərilən və ya mənə daha görünən bir xatırlatma deyil. Buna görə də uğursuz olan iş axını işləmələri üçün bildirişləri aktivləşdirmək qərarına gəldim. Bunu necə etmək olar:

  1. Səhifənin sağ yuxarı küncündə klik edin və Ayarları seçin.

  2. Sol tərəfdəki menyuda Bildirişlər seçin.

  3. İşləmələr üzərində klik edin.

  4. Yalnız uğursuz olan işləmələr üçün bildiriş göndərmək seçin.

İndi skript icra olunur və yeni bloq yazıları yoxdursa, mənə bildiriş alacağam. GitHub saytında bildirişi də görə bilərəm.

Araşdırdığım Başqa Bir Yöntem

Sizə danışdığım əvvəlki iş axını dəyişdirilmiş versiyadır, belə ki, README.md həmişə yenilənmiş olsun. Bloq yazısı yazma xatırlatması yaratmaq üçün başqa bir yol da araşdırdım. Lakin bu, README.md yeniləmə mexanizmi olmadan, sadəcə bir xatırlatmadır.

Bloq yazısı yazmaq üçün bir xatırlatma yaratmaq üçün, yeni bir GitHub anbarı yaratdım və .github/workflows/remind.yml adlı bir fayl əlavə etdim. Bu faylda, GitHub Actions tərəfindən icra ediləcək iş axınını müəyyənləşdirdim. Faylın məzmunu belədir:

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

Bu iş axını hər iş gününün saat 10:00-da mənə bir e-poçt xatırlatması göndərir və yeni bir bloq yazısı yazmağı xatırladır. E-poçtu göndərmək üçün üçüncü tərəf action, dawidd6/action-send-mail, istifadə etdim. E-poçt hesabımın məlumatlarını GitHub sirləri kimi daxil etdim, belə ki, onlar iş axını faylında görünmür.

Nəticə

Bloq yazısı yazma xatırlatması yaratmaq üçün iki üsul araşdırdım. Birinci üsul, GitHub profilimin README.md faylını yeniləməkdir. İkinci üsul, e-poçt xatırlatması göndərməkdir. Hazırda birinci üsulu istifadə edirəm, çünki ikinci üsuldan daha görünəndir. GitHub profilimi hər dəfə ziyarət edəndə xatırlatmanı görə bilərəm.

GitHub Actions-dan istifadə edərək bloq yazısı yazma xatırlatması yaratmaq, bloq yazma cədvəlinizdə yolunda qalmaq üçün sadə və effektiv bir yoldur. Bu iş axını ilə, yeni bir yazı yazmağı heç vaxt unutmayacaqsınız. Öz xatırlatma iş axınınızı yaratmaqda maraqlıysanız, daha çox məlumat öyrənmək üçün GitHub Actions sənədlərinə baxmağı unutmayın. Xoş bloq yazıları!