Yayınlandı

GitHub Actions'ı Kullanarak Blog Yayınlarının Yayınlanma Bildirimi Oluşturma

Yazarlar

Bir Yazar Olarak GitHub Actions ile Blog Yazma Hatırlatıcısı Oluşturma

Bir yazar olarak, yeni içerik yayınlama söz konusu olduğunda tutarlılığın önemini anlıyorum. Ancak, hayatın araya girdiği ve yeni bir blog yazısı yazmayı hatırlamanın zor olduğu zamanlar oluyor. Paylaşım programımda yolumda kalmama yardımcı olmak için GitHub Actions kullanarak basit bir hatırlatıcı oluşturdum. Bu yazıda, bu iş akışını nasıl yaptığımı paylaşacağım.

GitHub Action Nedir?

GitHub Actions, iş akışlarınızı otomatikleştirmenizi sağlayan güçlü bir araçtır. Kodunuzu oluşturmak, test etmek ve dağıtmak için kullanabilirsiniz. Ayrıca bildirim göndermek veya hatırlatıcıları zamanlamak gibi çok çeşitli diğer görevleri gerçekleştirmek için de kullanabilirsiniz.

Bir Blog Yazısı Yazma Hatırlatıcısı Nasıl Oluşturdum

Bir blog yazısı yazma hatırlatıcısı oluşturmak için, GitHub özel deposunun README.md dosyasını kullanıyor ve .github/workflows/blog-posts.yml adlı bir dosya ekliyorum. Bu dosyada, GitHub Actions'ın yürüteceği iş akışını tanımladım. Dosyanın başlangıç içeriği şöyle:

name: Blog Yazıları

on:
  schedule:
    - cron: '0 0 * * 0' # Her Pazar 00:00'da çalıştır
  workflow_dispatch:

jobs:
  update-posts:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Yazı listesini güncelle
        run: |
          sleep 1m
          curl -LO https://blog.imam.dev/feed.xml
          node src/list-posts.js
          rm feed.xml
      - name: Değişiklikleri kaydet
        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 "Blog yazılarını güncelle"
      - name: Değişiklikleri çek
        run: git pull -r
      - name: Değişiklikleri gönder
        uses: ad-m/github-push-action@0fafdd62b84042d49ec0cb92d9cac7f7ce4ec79e
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }}

Bu iş akışı her Pazar 00:00'da tetikleniyor. Daha sonra blog yazı listesini güncelleyen bir betik çalıştırıyor. Betik JavaScript'te yazılmış ve blogumun RSS akışını ayrıştırıyor. Ardından bir blog yazısı listesi oluşturuyor ve README.md dosyasını güncelliyor. Son olarak, değişiklikleri kaydediyor ve GitHub'a gönderiyor. Bu iş akışı için ouuan'ın deposunu referans olarak kullanıyorum.

Hatırlatıcı nereden geliyor? Aslında, list-posts.js dosyasında. Blog yazı listesine bir hatırlatıcı ekledim. Dosyanın içeriği şöyle:

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

/**
 * XML dizesini JSON'a dönüştür
 * @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'ye göre sırala
 * @param {object} json
 * @returns {object} sortedJson
 */
const sortJson = (json) => {
  json.sort((a, b) => new Date(b.pubDate) - new Date(a.pubDate))
  return json
}

// XML dosyasını oku ve JSON'a dönüştür
const xmlString = readFileSync('feed.xml', 'utf8')
const feeds = sortJson(xmlToJson(xmlString).rss.channel.item)

// Yazıların Markdown listesini oluştur
const posts = feeds
  .slice(0, 5)
  .map(
    (item) =>
      `- ${new Date(item.pubDate).toISOString().split('T')[0]} [${item.title}](${
        item.link
      }?utm_source=GitHubProfile)`
  )

// Yazılar değiştiyse README.md'yi güncelle,
// Aksi takdirde, bir blog yazısı yazmamı hatırlatmak için bir hata fırlat
const readme = readFileSync('README.md', 'utf8')
if (readme.includes(posts.join('\n'))) {
  throw new Error('Yeni blog yazısı yok')
} 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 güncellendi')
}

Betik, blogumun RSS akışını okuyor ve bir blog yazısı listesi oluşturuyor. Ardından, blog yazısı listesiyle README.md dosyasını güncelliyor. Yeni blog yazısı yoksa, bir blog yazısı yazmamı hatırlatmak için bir hata fırlatıyor.

Bu sadece betik, yazılar aynı kaldığı halde yürütüldüğünde fırlatılan bir hatadır ve e-postama veya bana daha görünür bir şekilde gönderilecek bir hatırlatıcı değildir. Bu nedenle, başarısız olan herhangi bir iş akışı çalışması için bildirimi etkinleştirmeye karar verdim. İşte nasıl yapılacağı:

  1. Sayfanın sağ üst köşesindeki Ayarlar'ı tıklayın.

  2. Sol kenar çubuğunda Bildirimler'i seçin.

  3. Eylemler'i tıklayın.

  4. Yalnızca başarısız iş akışları için bildirim gönder'i seçin.

Artık, betik yürütüldüğünde ve yeni blog yazısı yoksa bir bildirim alacağım. Bildirimi GitHub web sitesinde de görebilirim.

Araştırdığım Başka Bir Yol

Size anlattığım önceki iş akışı, README.md dosyamın her zaman güncel olması için değiştirilmiş bir versiyondur. Ayrıca bir blog yazısı yazma hatırlatıcısı oluşturmak için başka bir yol da araştırdım. Ancak bu, herhangi bir README.md güncelleme mekanizması olmadan sadece bir hatırlatıcıydı.

Bir blog yazısı yazma hatırlatıcısı oluşturmak için yeni bir GitHub deposu oluşturdum ve .github/workflows/remind.yml adlı bir dosya ekledim. Bu dosyada, GitHub Actions'ın yürüteceği iş akışını tanımladım. Dosyanın içeriği şöyle:

name: Blog yazısı yazma hatırlatıcısı

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

jobs:
  remind:
    runs-on: ubuntu-latest
    steps:
      - name: Hatırlatıcı gönder
        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: 'Yeni bir blog yazısı yazma hatırlatıcısı'
          body: "Bugün yeni bir blog yazısı yazmayı unutma!"
          to: benim-eposta@ornek.com

Bu iş akışı, her hafta içi saat 10:00'da bana bir e-posta hatırlatıcısı göndererek yeni bir blog yazısı yazmamı hatırlatıyor. E-postayı göndermek için dawidd6/action-send-mail adlı üçüncü taraf bir eylem kullandım. E-posta kimlik bilgilerimi GitHub gizli bilgileri olarak sağladım, böylece iş akışı dosyasında görünmüyorlar.

Sonuç

Bir blog yazısı yazma hatırlatıcısı oluşturmak için iki yol araştırdım. İlk yol, GitHub profilimdeki README.md dosyasını güncellemektir. İkinci yol, bir e-posta hatırlatıcısı göndermektir. Şu anda ilk yolu kullanıyorum çünkü ikinci yoldan daha görünür. GitHub profilimı ziyaret ettiğimde hatırlatıcıyı görebiliyorum.

GitHub Actions kullanarak bir blog yazısı yazma hatırlatıcısı oluşturmak, bloglama programınızda yolunuzu kaybetmemek için basit ve etkili bir yoldur. Bu iş akışı yerindeyken, yeni bir yazı yazmayı asla unutmayacaksınız. Kendi hatırlatıcı iş akışınızı oluşturmakla ilgileniyorsanız, daha fazla bilgi edinmek için GitHub Actions belgelerini mutlaka inceleyin. Mutlu bloglamalar!