Как управлять графиком написания с помощью GitHub Actions
25 апреля 2023 г.Как писатель, я понимаю важность согласованности при публикации нового контента. Однако бывают случаи, когда жизнь мешает, и может быть сложно не забыть написать новый пост в блоге. Чтобы не отставать от расписания обмена, я создал простое напоминание с помощью GitHub Actions. В этом посте я расскажу, как я создал этот рабочий процесс.
Что такое действия GitHub?
GitHub Actions – это мощный инструмент, позволяющий автоматизировать рабочие процессы. Вы можете использовать его для создания, тестирования и развертывания кода. Вы также можете использовать его для выполнения множества других задач, таких как отправка уведомлений или планирование напоминаний.
Как я создал напоминание о записи в блоге
Чтобы создать напоминание о написании сообщения в блоге, я использую специальный репозиторий README.md на GitHub и добавляю файл с именем .github/workflows/blog-posts.yml. В этом файле я определил рабочий процесс, который будет выполнять GitHub Actions. Вот исходное содержимое файла:
name: Blog Posts
on:
schedule:
- cron: '0 0 * * 0' # Run at 00:00 every Sunday
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')
/**
* Convert XML string to JSON
* @param {string} xmlString
* @returns {object} json
*/
const xmlToJson = (xmlString) => {
const regex = /<(w+)([^>]*)>([sS]*?)</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
}
/**
* Sort JSON by pubDate
* @param {object} json
* @returns {object} sortedJson
*/
const sortJson = (json) => {
json.sort((a, b) => new Date(b.pubDate) - new Date(a.pubDate))
return json
}
// Read XML file and convert to JSON
const xmlString = readFileSync('feed.xml', 'utf8')
const feeds = sortJson(xmlToJson(xmlString).rss.channel.item)
// Create Markdown list of posts
const posts = feeds
.slice(0, 5)
.map(
(item) =>
`- ${new Date(item.pubDate).toISOString().split('T')[0]} [${item.title}](${
item.link
}?utm_source=GitHubProfile)`
)
// Update README.md if posts have changed,
// otherwise throw an error to remind me to write a blog post
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)[sS]*(?=n<!--END_SECTION:blog-posts-->)/,
posts.join('n')
)
writeFileSync('README.md', updatedReadme)
console.log('Updated README.md')
}
Скрипт читает RSS-канал моего блога и создает список сообщений в блоге. Затем он обновляет файл README.md со списком сообщений в блоге. Если новых сообщений в блоге нет, выдается ошибка, напоминающая мне о написании сообщения в блоге.
Это просто ошибка, которая будет выдана при выполнении скрипта, пока сообщения остаются прежними, и это не напоминание, которое будет отправлено на мою электронную почту или что-то более заметное для меня. Поэтому я решил включить уведомления о любых неудачных запусках рабочего процесса.
Вот как это сделать:
- Нажмите в правом верхнем углу страницы и выберите Настройки.
- Выберите Уведомления на левой боковой панели.
- Нажмите Действия.
- Выберите Отправлять уведомления только о неудачных рабочих процессах.
Теперь я получу уведомление, когда скрипт будет выполнен и новых сообщений в блоге не будет. Я также вижу уведомление на веб-сайте 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, чтобы узнать больше. Удачного ведения блога!
Оригинал