Diterbitkan pada

Menjana Pengumuman Penerbitan Catatan Blog Menggunakan GitHub Actions

Penulis

Sebagai seorang penulis, saya memahami pentingnya konsistensi dalam menerbitkan kandungan baru. Walau bagaimanapun, terdapat masa-masa apabila kehidupan menghalang, dan ia boleh menjadi mencabar untuk mengingati untuk menulis catatan blog baharu. Untuk membantu saya kekal di landasan dengan jadual perkongsian saya, saya telah mencipta peringatan mudah menggunakan GitHub Actions. Dalam catatan ini, saya akan berkongsi bagaimana saya membuat aliran kerja ini.

Apakah GitHub Action?

GitHub Actions adalah alat yang berkuasa yang membolehkan anda mengautomasikan aliran kerja anda. Anda boleh menggunakannya untuk membina, menguji, dan menghantar kod anda. Anda juga boleh menggunakannya untuk melaksanakan pelbagai tugas lain, seperti menghantar pemberitahuan atau menjadualkan peringatan.

Bagaimana Saya Mencipta Peringatan untuk Menulis Catatan Blog

Untuk mencipta peringatan untuk menulis catatan blog, saya menggunakan repositori khas GitHub README.md dan menambah fail bernama .github/workflows/blog-posts.yml. Dalam fail ini, saya menentukan aliran kerja yang akan dilaksanakan oleh GitHub Actions. Berikut adalah kandungan awal fail:

name: Blog Posts

on:
  schedule:
    - cron: '0 0 * * 0' # Jalankan pada 00:00 setiap hari Ahad
  workflow_dispatch:

jobs:
  update-posts:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Kemas kini senarai catatan
        run: |
          sleep 1m
          curl -LO https://blog.imam.dev/feed.xml
          node src/list-posts.js
          rm feed.xml
      - name: Komit perubahan
        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 "Kemas kini catatan blog"
      - name: Tarik perubahan
        run: git pull -r
      - name: Dorong perubahan
        uses: ad-m/github-push-action@0fafdd62b84042d49ec0cb92d9cac7f7ce4ec79e
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }}

Aliran kerja ini dicetuskan setiap hari Ahad pada pukul 00:00. Ia kemudian menjalankan skrip yang mengemas kini senarai catatan blog. Skrip ini ditulis dalam JavaScript dan menganalisis suapan RSS blog saya. Ia kemudian menghasilkan senarai catatan blog dan mengemas kini fail README.md. Akhirnya, ia mengkomit perubahan dan mendorongnya ke GitHub. Saya menggunakan repositori ouuan sebagai rujukan untuk aliran kerja ini.

Di manakah peringatan itu datang? Ia sebenarnya berada dalam fail list-posts.js. Saya telah menambah peringatan kepada senarai catatan blog. Berikut adalah kandungan fail:

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

/**
 * Tukar rentetan XML kepada 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
}

/**
 * Urutkan JSON mengikut pubDate
 * @param {object} json
 * @returns {object} sortedJson
 */
const sortJson = (json) => {
  json.sort((a, b) => new Date(b.pubDate) - new Date(a.pubDate))
  return json
}

// Baca fail XML dan tukar kepada JSON
const xmlString = readFileSync('feed.xml', 'utf8')
const feeds = sortJson(xmlToJson(xmlString).rss.channel.item)

// Buat senarai Markdown catatan
const posts = feeds
  .slice(0, 5)
  .map(
    (item) =>
      `- ${new Date(item.pubDate).toISOString().split('T')[0]} [${item.title}](${
        item.link
      }?utm_source=GitHubProfile)`
  )

// Kemas kini README.md jika catatan telah berubah,
// Jika tidak, kembalikan ralat untuk mengingatkan saya untuk menulis catatan blog
const readme = readFileSync('README.md', 'utf8')
if (readme.includes(posts.join('\n'))) {
  throw new Error('Tiada catatan blog baharu')
} 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('Kemas kini README.md')
}

Skrip ini membaca suapan RSS blog saya dan menghasilkan senarai catatan blog. Ia kemudian mengemas kini fail README.md dengan senarai catatan blog. Jika tidak ada catatan blog baharu, ia akan menghasilkan ralat untuk mengingatkan saya untuk menulis catatan blog.

Ia hanya ralat yang akan dikembalikan apabila skrip dijalankan manakala catatan masih sama dan ia bukan peringatan yang akan dihantar ke e-mel saya atau sesuatu yang lebih ketara kepada saya. Oleh itu, saya memutuskan untuk mendayakan pemberitahuan untuk sebarang larian aliran kerja yang gagal. Berikut adalah cara untuk melakukannya:

  1. Klik pada sudut kanan atas halaman dan pilih Tetapan.

  2. Pilih Pemberitahuan pada bar sisi kiri.

  3. Klik pada Tindakan.

  4. Pilih Hantar pemberitahuan untuk aliran kerja yang gagal sahaja.

Sekarang, saya akan mendapat pemberitahuan apabila skrip dijalankan dan tidak ada catatan blog baharu. Saya juga boleh melihat pemberitahuan di laman web GitHub.

Cara Lain yang Saya Terokai

Aliran kerja sebelumnya yang saya beritahu tentang anda adalah versi yang diubah suai supaya README.md saya sentiasa dikemas kini. Saya juga menerokai cara lain untuk mencipta peringatan untuk menulis catatan blog. Tetapi, ia adalah peringatan tulen tanpa sebarang mekanisme pengemaskinian README.md, hanya peringatan.

Untuk mencipta peringatan untuk menulis catatan blog, saya telah mencipta repositori GitHub baharu dan menambah fail bernama .github/workflows/remind.yml. Dalam fail ini, saya menentukan aliran kerja yang akan dilaksanakan oleh GitHub Actions. Berikut adalah kandungan fail:

name: Peringatan untuk menulis catatan blog

on:
  schedule:
    - cron: '0 10 * * 1-5'

jobs:
  remind:
    runs-on: ubuntu-latest
    steps:
      - name: Hantar peringatan
        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: 'Peringatan untuk menulis catatan blog baharu'
          body: "Jangan lupa untuk menulis catatan blog baharu hari ini!"
          to: my-email@example.com

Aliran kerja ini menghantar e-mel peringatan kepada saya setiap hari bekerja pada pukul 10:00 pagi, mengingatkan saya untuk menulis catatan blog baharu. Saya menggunakan tindakan pihak ketiga, dawidd6/action-send-mail, untuk menghantar e-mel. Saya memberikan kelayakan e-mel saya sebagai rahsia GitHub, jadi ia tidak dapat dilihat dalam fail aliran kerja.

Kesimpulan

Saya telah menerokai dua cara untuk mencipta peringatan untuk menulis catatan blog. Cara pertama adalah untuk mengemas kini fail README.md profil GitHub saya. Cara kedua adalah untuk menghantar e-mel peringatan. Pada masa ini, saya menggunakan cara pertama kerana ia lebih ketara daripada cara kedua. Saya boleh melihat peringatan setiap kali saya melawat profil GitHub saya.

Mencipta peringatan untuk menulis catatan blog menggunakan GitHub Actions adalah cara yang mudah dan berkesan untuk kekal di landasan dengan jadual pengeblogan anda. Dengan aliran kerja ini di tempat, anda tidak akan pernah lupa untuk menulis catatan baharu lagi. Jika anda berminat untuk membuat aliran kerja peringatan anda sendiri, pastikan anda menyemak dokumentasi GitHub Actions untuk mengetahui lebih lanjut. Selamat mengeblog!