Опубликовано

Как создать уведомление о публикации поста в блоге с помощью GitHub Actions

Авторы

Как я создал напоминание о написании статьи в блоге с помощью GitHub Actions

Как писатель, я понимаю важность последовательности при публикации нового контента. Однако бывают случаи, когда жизнь мешает, и может быть сложно помнить о необходимости написать новый пост в блоге. Чтобы помочь мне оставаться в курсе своего графика публикаций, я создал простое напоминание с помощью GitHub Actions. В этом посте я расскажу, как я сделал этот рабочий процесс.

Что такое GitHub Action?

GitHub Actions — это мощный инструмент, который позволяет автоматизировать ваши рабочие процессы. Вы можете использовать его для сборки, тестирования и развертывания своего кода. Вы также можете использовать его для выполнения широкого спектра других задач, таких как отправка уведомлений или планирование напоминаний.

Как я создал напоминание о написании статьи в блоге

Чтобы создать напоминание о написании статьи в блоге, я использую специальный репозиторий GitHub README.md и добавил файл с именем .github/workflows/blog-posts.yml. В этом файле я определил рабочий процесс, который GitHub Actions будет выполнять. Вот начальное содержимое файла:

name: Blog Posts

on:
  schedule:
    - cron: '0 0 * * 0' # Запускать в 00:00 каждое воскресенье
  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 }}

Этот рабочий процесс запускается каждое воскресенье в 00:00. Затем он запускает скрипт, который обновляет список статей в блоге. Скрипт написан на JavaScript и анализирует RSS-ленту моего блога. Затем он генерирует список статей в блоге и обновляет файл README.md. Наконец, он фиксирует изменения и отправляет их на GitHub. Я использую репозиторий ouuan в качестве примера для этого рабочего процесса.

Откуда же взялось напоминание? Оно на самом деле находится в файле list-posts.js. Я добавил напоминание в список статей в блоге. Вот содержимое файла:

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

/**
 * Преобразует строку XML в 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
}

/**
 * Сортирует JSON по pubDate
 * @param {object} json
 * @returns {object} sortedJson
 */
const sortJson = (json) => {
  json.sort((a, b) => new Date(b.pubDate) - new Date(a.pubDate))
  return json
}

// Читает XML-файл и преобразует в JSON
const xmlString = readFileSync('feed.xml', 'utf8')
const feeds = sortJson(xmlToJson(xmlString).rss.channel.item)

// Создает список статей Markdown
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, если посты изменились,
// в противном случае выдает ошибку, чтобы напомнить мне написать статью в блоге
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')
}

Скрипт читает RSS-ленту моего блога и генерирует список статей в блоге. Затем он обновляет файл README.md этим списком. Если нет новых статей в блоге, он выдает ошибку, чтобы напомнить мне написать статью.

Это просто ошибка, которая будет выброшена при выполнении скрипта, пока сообщения остаются прежними, и это не напоминание, которое будет отправлено мне на электронную почту или что-то более заметное для меня. Поэтому я решил включить уведомление для любых неудачных запусков рабочего процесса. Вот как это сделать:

  1. Нажмите на верхний правый угол страницы и выберите Настройки.

  2. Выберите Уведомления в левой боковой панели.

  3. Нажмите на Действия.

  4. Выберите Отправлять уведомления только об ошибочных рабочих процессах.

Теперь я получу уведомление, когда скрипт будет выполнен, и нет новых статей в блоге. Я также могу видеть уведомление на веб-сайте GitHub.

Еще один способ, который я изучил

Предыдущий рабочий процесс, о котором я вам рассказывал, является модифицированной версией, поэтому мой README.md всегда обновлен. Я также изучил другой способ создания напоминания о написании статьи в блоге. Но это простое напоминание без механизма обновления README.md, просто напоминание.

Чтобы создать напоминание о написании статьи в блоге, я создал новый репозиторий GitHub и добавил файл с именем .github/workflows/remind.yml. В этом файле я определил рабочий процесс, который GitHub Actions будет выполнять. Вот содержимое файла:

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

Этот рабочий процесс отправляет мне напоминание по электронной почте каждый будний день в 10:00 утра, напоминая мне о необходимости написать новый пост в блоге. Я использовал стороннее действие, dawidd6/action-send-mail, для отправки электронного письма. Я предоставил свои учетные данные электронной почты в качестве секретов GitHub, поэтому они не видны в файле рабочего процесса.

Вывод

Я изучил два способа создания напоминания о написании статьи в блоге. Первый способ - обновить файл README.md моего профиля GitHub. Второй способ - отправить напоминание по электронной почте. В настоящее время я использую первый способ, потому что он более заметен, чем второй. Я вижу напоминание каждый раз, когда захожу на свой профиль GitHub.

Создание напоминания о написании статьи в блоге с помощью GitHub Actions — это простой и эффективный способ оставаться в курсе своего графика ведения блога. С помощью этого рабочего процесса вы никогда не забудете написать новый пост. Если вы заинтересованы в создании своего рабочего процесса напоминаний, обязательно ознакомьтесь с документацией GitHub Actions, чтобы узнать больше. Счастливого ведения блога!