- Нашр шудааст дар
Истифодаи GitHub Actions барои эҷоди маълумот дар бораи нашри мақолаи блог
- Муаллифон
- Ном
- Imamuzzaki Abu Salam
- https://x.com/ImBIOS_Dev
Ҳамчун як нависанда, ман аз аҳамияти якхелагии маълумоти нашршуда огоҳ ҳастам. Аммо, вақте ки зиндагӣ ба роҳи мо монеа мешавад, ба хотир овардани навиштани як пости нав дар блог душвор мешавад. Барои он ки ман ба ҷадвали мубодилаи худ мувофиқ бошам, ман бо истифода аз GitHub Actions як хотиррасони оддӣ эҷод кардам. Дар ин пост, ман чӣ гуна ин корро анҷом додам, баён хоҳам кард.
GitHub Actions чист?
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-ро бо рӯйхати постҳои блог нав мекунад. Агар пости нав вуҷуд надошта бошад, он як хато меандозад, то ба ман хотиррасон кунад, ки пости блог нависам.
Ин танҳо як хатоест, ки ҳангоми иҷрои скрипт, ҳангоме ки постҳо ҳамон қадар мемонанд, андохта мешавад ва ин як хотиррасоне нест, ки ба почтаи электронии ман фиристода мешавад ё барои ман намоёнтар аст. Ҳамин тавр, ман қарор додам, ки огоҳиномаро барои ҳар гуна иҷрои ҷараёни кор, ки ноком шудааст, фаъол кунам. Ин чӣ гуна ин корро анҷом додан мумкин аст:
Ба кунҷи болоии рост гузаред ва Танзимот-ро интихоб кунед.
Огоҳиномаҳо-ро дар панели чап интихоб кунед.
Actions-ро клик кунед.
Танҳо барои ҷараёнҳои кори нокомшуда огоҳинома фиристед-ро интихоб кунед.
Ҳоло, ҳангоми иҷрои скрипт ва вуҷуд надоштани пости нав, ман як огоҳинома хоҳам гирифт. Ман инчунин метавонам огоҳиномаро дар вебсайти 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 назар андозед, то маълумоти бештар гиред. Блогнависии хушбахт!