Ýaýradylan senesi

Makala çap etmek barada maglumatlary döretmek üçin GitHub Actions-dan peýdalanmak

Awtorlar

Ýazaryň üçin GitHub Aksiýalarynyň kömegi bilen ýatlatma döretmek

Ýazaryň biri hökmünde, täze mazmun çap edende yzygiderliligiň möhümdigini düşünýärin. Emma, haýat ýolunda gaçyp, täze blog ýazgysy ýazmak ýatdan çykyp biler. Paýlaşmak tertibimde ýolunda bolmaga kömek etmek üçin, GitHub Aksiýalaryny ulanýan ýönekeý ýatlatma döretdim. Bu ýazgyda, bu iş akşamyňy nädip döredendigimi paýlaşaryn.

GitHub Aksiýasy näme?

GitHub Aksiýalary iş akşamlaryňy awtomatlaşdyrmaga mümkinçilik berýän güýçli bir guraldyr. Ony kodyňyzy gurmak, synamak we ýerleşdirmek üçin ulanyp bilersiňiz. Şeýle hem, habarnamalar ibermek ýa-da ýatlatmalar bellige almak ýaly dürli beýleki işleri ýerine ýetirmek üçin ulanyp bilersiňiz.

Blog ýazgysy ýazmak üçin ýatlatma döredenim

Blog ýazgysy ýazmak üçin ýatlatma döretmek üçin, GitHub-yň ýörite depasyny README.md ulanyp, .github/workflows/blog-posts.yml ady bilen bir faýl goşdym. Bu faýlda, GitHub Aksiýalarynyň ýerine ýetirjek iş akşamyny kesgitledim. Faýlyň ilkinji mazmuny şeýle:

name: Blog Posts

on:
  schedule:
    - cron: '0 0 * * 0' # Her ýekşenbe 00:00-da işledýär
  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ş akşamy her ýekşenbe 00:00-da işledýär. Soňra, blog ýazgylarynyň sanawyny täzeläýän bir skripti ýerine ýetirýär. Skript JavaScript-de ýazylan we blogumyň RSS akymyny analiz edýär. Soňra, blog ýazgylarynyň sanawyny döredýär we README.md faýlyny täzeläýär. Ahyrky, üýtgetmeleriň ýerine ýetirilenligi we GitHub-a iterilenligi barada habar berýär. Bu iş akşamy üçin ouuan-yň depasyny salgylanma hökmünde ulanyp bilersiňiz.

Ýatlatma neredenn gelýär? Aslynda, ol list-posts.js faýlynda. Blog ýazgylarynyň sanawyna ýatlatma goşdum. Faýlyň mazmuny şeýle:

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

/**
 * XML ýazgysyny JSON-a öwürmek
 * @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-y pubDate boýunça sortlamak
 * @param {object} json
 * @returns {object} sortedJson
 */
const sortJson = (json) => {
  json.sort((a, b) => new Date(b.pubDate) - new Date(a.pubDate))
  return json
}

// XML faýlyny okamak we JSON-a öwürmek
const xmlString = readFileSync('feed.xml', 'utf8')
const feeds = sortJson(xmlToJson(xmlString).rss.channel.item)

// Ýazgylaryň Markdown sanawyny döretmek
const posts = feeds
  .slice(0, 5)
  .map(
    (item) =>
      `- ${new Date(item.pubDate).toISOString().split('T')[0]} [${item.title}](${
        item.link
      }?utm_source=GitHubProfile)`
  )

// Eger ýazgylar üýtgedi bolsa, README.md-ni täzelämek,
// Ýogsam, blog ýazgysy ýazmak üçin ýatlatma bermek üçin ýalňyşlyk atmak
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 blogumyň RSS akymyny okaýar we blog ýazgylarynyň sanawyny döredýär. Soňra, blog ýazgylarynyň sanawy bilen README.md faýlyny täzeläýär. Eger täze blog ýazgylary ýok bolsa, blog ýazgysy ýazmak üçin ýatlatma bermek üçin ýalňyşlyk atýar.

Bu, ýazgylar şol ýerde galanda we men üçin görnükli ýatlatma ýa-da e-poçta ýatlatma hökmünde iberilmese, skripti ýerine ýetirilende atyljak ýalňyşlykdyr. Şonuň üçin, iş akşamlaryň ýalňyşlyk bilen ýerine ýetirilmegi üçin habarnamany açmaga karar berdim. Şeýle edip bilersiňiz:

  1. Saýtyň ýokary sag künjünden basyp, Saglamalar-y saýlaň.

  2. Çepdäki diňleýji paneliň içinden Habarnamalar-y saýlaň.

  3. Aksiýalar-a basyň.

  4. Diňe ýalňyşlyk bilen işledýän iş akşamlary üçin habarnamalar iber-i saýlaň.

Indi, skripti ýerine ýetirilende we täze blog ýazgylary ýok bolsa, men habarnama alarys. Şeýle hem, GitHub saýtynda habarnamany görüp bilersiňiz.

Öwrenen beýleki ýol

Size gürrüň beren öňki iş akşamy, README.md faýlymyň hemişe häzirki zaman bolmagy üçin üýtgedilen görnüşdir. Blog ýazgysy ýazmak üçin ýatlatma döretmegiň beýleki bir ýoluny hem öwrendim. Emma, bu README.md faýlyny täzeläýän iş akşamy däl, diňe ýatlatma berýär.

Blog ýazgysy ýazmak üçin ýatlatma döretmek üçin, täze bir GitHub depasy döretdim we .github/workflows/remind.yml ady bilen faýl goşdum. Bu faýlda, GitHub Aksiýalarynyň ýerine ýetirjek iş akşamyny kesgitledim. Faýlyň mazmuny şeýle:

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ş akşamy her iş gününiň irden 10:00-da, täze blog ýazgysy ýazmak üçin ýatlatma bermek üçin e-poçta iberýär. E-poçta ibermek üçin, dawidd6/action-send-mail ady bilen üçünji tarapyň aksiýasyny ulandum. E-poçta maglumatlarymy GitHub-yň ýaňsytma hökmünde berdim, şonuň üçin ol iş akşamy faýlynda görünmeýär.

Netije

Blog ýazgysy ýazmak üçin ýatlatma döretmegiň iki sany ýoluny öwrendim. Birinji ýol, GitHub profilimde README.md faýlyny täzelämekdir. Ikinji ýol, e-poçta ýatlatma ibermekdir. Häzirki wagtda, birinji ýoly ulanyp bilersiňiz, çünki ikinji ýoldan has görnüklidir. GitHub profilimde her gezek ziyaret edende ýatlatmany görüp bilersiňiz.

GitHub Aksiýalaryny ulanýan blog ýazgysy ýazmak üçin ýatlatma döretmek, blog ýazmak tertibiňizde ýolunda galmak üçin ýönekeý we netijeli bir ýoldur. Bu iş akşamynyň ýerine ýetirilmegi bilen, hiç wagt täze ýazgy ýazmagyňyzy ýatdan çykarmazsyňyz. Eger öz ýatlatma iş akşamyňyzy döretmek isleýän bolsaňyz, GitHub Aksiýalarynyň resminama dokumentlerini öwrenip, has köp maglumat almak üçin barlaň. Ýakymly blog ýazmak!