Diterbitkan pada

Cara membuat notifikasi publikasi postingan blog menggunakan GitHub Actions

Penulis

Sebagai seorang penulis, saya memahami pentingnya konsistensi dalam mempublikasikan konten baru. Namun, terkadang kehidupan menghalangi, dan mengingat untuk menulis postingan blog baru bisa menjadi tantangan. Untuk membantu saya tetap berada di jalur jadwal berbagi saya, saya membuat pengingat sederhana menggunakan GitHub Actions. Dalam postingan ini, saya akan membagikan cara saya membuat alur kerja ini.

Apa Itu GitHub Action?

GitHub Actions adalah alat yang ampuh yang memungkinkan Anda untuk mengotomatiskan alur kerja Anda. Anda dapat menggunakannya untuk membangun, menguji, dan menyebarkan kode Anda. Anda juga dapat menggunakannya untuk melakukan berbagai tugas lain, seperti mengirim notifikasi atau menjadwalkan pengingat.

Cara Saya Membuat Pengingat untuk Menulis Posting Blog

Untuk membuat pengingat untuk menulis posting blog, saya menggunakan repositori khusus GitHub README.md dan menambahkan file bernama .github/workflows/blog-posts.yml. Dalam file ini, saya mendefinisikan alur kerja yang akan dijalankan oleh GitHub Actions. Berikut adalah konten awal file:

name: Blog Posts

on:
  schedule:
    - cron: '0 0 * * 0' # Jalankan pukul 00:00 setiap Minggu
  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 }}

Alur kerja ini dipicu setiap Minggu pukul 00:00. Kemudian, ia menjalankan skrip yang memperbarui daftar postingan blog. Skrip tersebut ditulis dalam JavaScript dan mengurai umpan RSS dari blog saya. Kemudian, ia menghasilkan daftar postingan blog dan memperbarui file README.md. Terakhir, ia mengompilasi perubahan dan mendorongnya ke GitHub. Saya menggunakan repositori ouuan sebagai referensi untuk alur kerja ini.

Dari mana pengingatnya berasal? Itu sebenarnya ada di file list-posts.js. Saya menambahkan pengingat ke daftar postingan blog. Berikut adalah konten file:

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

/**
 * Konversi string XML ke 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 berdasarkan 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 file XML dan konversi ke JSON
const xmlString = readFileSync('feed.xml', 'utf8')
const feeds = sortJson(xmlToJson(xmlString).rss.channel.item)

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

// Perbarui README.md jika postingan telah berubah,
// Jika tidak, lempar kesalahan untuk mengingatkan saya untuk menulis postingan blog
const readme = readFileSync('README.md', 'utf8')
if (readme.includes(posts.join('\n'))) {
  throw new Error('Tidak ada postingan blog baru')
} 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('README.md telah diperbarui')
}

Skrip ini membaca umpan RSS dari blog saya dan menghasilkan daftar postingan blog. Kemudian, ia memperbarui file README.md dengan daftar postingan blog. Jika tidak ada postingan blog baru, ia akan memunculkan kesalahan untuk mengingatkan saya untuk menulis postingan blog.

Itu hanyalah kesalahan yang akan dilemparkan saat skrip dijalankan sementara postingan masih sama dan itu bukan pengingat yang akan dikirim ke email saya atau sesuatu yang lebih terlihat bagi saya. Jadi, saya memutuskan untuk mengaktifkan notifikasi untuk setiap alur kerja yang gagal. Berikut cara melakukannya:

  1. Klik sudut kanan atas halaman dan pilih Pengaturan.

  2. Pilih Notifikasi di bilah sisi kiri.

  3. Klik Tindakan.

  4. Pilih Kirim notifikasi hanya untuk alur kerja yang gagal.

Sekarang, saya akan mendapatkan notifikasi saat skrip dijalankan dan tidak ada postingan blog baru. Saya juga dapat melihat notifikasi di situs web GitHub.

Cara Lain yang Saya Jelajahi

Alur kerja sebelumnya yang saya ceritakan adalah versi modifikasi agar README.md saya selalu diperbarui. Saya juga menjelajahi cara lain untuk membuat pengingat untuk menulis posting blog. Tapi, itu hanya pengingat tanpa mekanisme pembaruan README.md, hanya pengingat.

Untuk membuat pengingat untuk menulis posting blog, saya membuat repositori GitHub baru dan menambahkan file bernama .github/workflows/remind.yml. Dalam file ini, saya mendefinisikan alur kerja yang akan dijalankan oleh GitHub Actions. Berikut adalah konten file:

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

Alur kerja ini mengirimkan pengingat email kepada saya setiap hari kerja pukul 10:00 pagi, mengingatkan saya untuk menulis postingan blog baru. Saya menggunakan tindakan pihak ketiga, dawidd6/action-send-mail, untuk mengirim email. Saya memberikan kredensial email saya sebagai rahasia GitHub, sehingga tidak terlihat di file alur kerja.

Kesimpulan

Saya telah menjelajahi dua cara untuk membuat pengingat untuk menulis posting blog. Cara pertama adalah memperbarui file README.md dari profil GitHub saya. Cara kedua adalah mengirim pengingat email. Saat ini saya menggunakan cara pertama karena lebih terlihat daripada cara kedua. Saya dapat melihat pengingat setiap kali saya mengunjungi profil GitHub saya.

Membuat pengingat untuk menulis posting blog menggunakan GitHub Actions adalah cara yang sederhana dan efektif untuk tetap berada di jalur jadwal blogging Anda. Dengan alur kerja ini, Anda tidak akan pernah lupa untuk menulis postingan baru lagi. Jika Anda tertarik untuk membuat alur kerja pengingat Anda sendiri, pastikan untuk melihat dokumentasi GitHub Actions untuk mempelajari lebih lanjut. Selamat ngeblog!