- Publikuar më
Gjenerimi i njoftimeve të botimit të artikujve të blogut duke përdorur GitHub Actions
- Autorët
- Emri
- Imamuzzaki Abu Salam
- https://x.com/ImBIOS_Dev
Si e Krijova Një Kujtesë Për Shkrimin e Një Artikuj Blogu
Si shkrimtar, e kuptoj rëndësinë e konsistencës kur bëhet fjalë për publikimin e përmbajtjes së re. Megjithatë, ndodh që jeta të na ndalojë në rrugë dhe të na bëjë të harrojmë të shkruajmë një artikull të ri blogu. Për të më ndihmuar të mbaj përcjelljen e programit të ndarjes së përmbajtjes sime, krijova një kujtesë të thjeshtë duke përdorur GitHub Actions. Në këtë artikull, do të ndaj se si e krijova këtë punë rrjedhëse.
Çfarë është GitHub Action?
GitHub Actions është një mjet i fuqishëm që ju lejon të automatizoni punët tuaja rrjedhëse. Mund ta përdorni për të ndërtuar, testuar dhe vendosur kodin tuaj. Mund ta përdorni edhe për të kryer një gamë të gjerë detyrash të tjera, siç është dërgimi i njoftimeve ose planifikimi i kujtesave.
Si krijova një kujtesë për të shkruar një artikull blogu
Për të krijuar një kujtesë për të shkruar një artikull blogu, unë po përdor repozitorin e veçantë të GitHub README.md dhe shtova një skedar të quajtur .github/workflows/blog-posts.yml. Në këtë skedar, përcaktova punën rrjedhëse që GitHub Actions do të ekzekutojë. Ja përmbajtja fillestare e skedarit:
name: Blog Posts
on:
schedule:
- cron: '0 0 * * 0' # Ekzekuto në 00:00 çdo të dielë
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 }}
Kjo punë rrjedhëse aktivizohet çdo të dielë në 00:00. Pastaj ekzekuton një skrip që përditëson listën e artikujve të blogut. Skripti është shkruar në JavaScript dhe analizon ushqimin RSS të blogut tim. Pastaj gjeneron një listë të artikujve të blogut dhe përditëson skedarin README.md. Së fundi, bën commit ndryshimet dhe i shtyn ato në GitHub. Po përdor repozitorin e ouuan si referencë për këtë punë rrjedhëse.
Ku vjen kujtesa? Në të vërtetë ajo është në skedarin list-posts.js. Shtova një kujtesë në listën e artikujve të blogut. Ja përmbajtja e skedarit:
const { readFileSync, writeFileSync } = require('fs')
/**
* Kthe XML string në 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
}
/**
* Rregulloni JSON sipas pubDate
* @param {object} json
* @returns {object} sortedJson
*/
const sortJson = (json) => {
json.sort((a, b) => new Date(b.pubDate) - new Date(a.pubDate))
return json
}
// Lexoni skedarin XML dhe ktheni atë në JSON
const xmlString = readFileSync('feed.xml', 'utf8')
const feeds = sortJson(xmlToJson(xmlString).rss.channel.item)
// Krijo një listë Markdown të artikujve
const posts = feeds
.slice(0, 5)
.map(
(item) =>
`- ${new Date(item.pubDate).toISOString().split('T')[0]} [${item.title}](${
item.link
}?utm_source=GitHubProfile)`
)
// Përditësoni README.md nëse artikujt kanë ndryshuar,
// Përndryshe hidhni një gabim për të më kujtuar të shkruaj një artikull blogu
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')
}
Skripti lexon ushqimin RSS të blogut tim dhe gjeneron një listë të artikujve të blogut. Pastaj përditëson skedarin README.md me listën e artikujve të blogut. Nëse nuk ka artikuj të rinj të blogut, ai hidh një gabim për të më kujtuar të shkruaj një artikull blogu.
Ky është vetëm një gabim që do të hidhet kur skripti të ekzekutohet ndërsa artikujt janë ende të njëjtë dhe nuk është një kujtesë që do të dërgohet në emailin tim ose diçka më të dukshme për mua. Pra, vendosa të aktivizoj njoftimin për çdo ekzekutim të punës rrjedhëse që dështon. Ja se si të bëni këtë:
Kliko në këndin e sipërm të djathtë të faqes dhe zgjidh Settings.
Zgjidh Notifications në shiritin e majtë.
Kliko në Actions.
Zgjidh Send notifications for failed workflows only.
Tani, do të marr një njoftim kur skripti të ekzekutohet dhe nuk ka artikuj të rinj të blogut. Unë mund të shoh edhe njoftimin në faqen e internetit të GitHub.
Një mënyrë tjetër që eksploroja
Puna rrjedhëse e mëparshme që ju tregova është një version i modifikuar, kështu që README.md është gjithmonë e përditësuar. Unë eksploroja gjithashtu një mënyrë tjetër për të krijuar një kujtesë për të shkruar një artikull blogu. Por, kjo është një kujtesë e pastër pa mekanizmin e përditësimit README.md, vetëm një kujtesë.
Për të krijuar një kujtesë për të shkruar një artikull blogu, krijova një repozitor të ri të GitHub dhe shtova një skedar të quajtur .github/workflows/remind.yml
. Në këtë skedar, përcaktova punën rrjedhëse që GitHub Actions do të ekzekutojë. Ja përmbajtja e skedarit:
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
Kjo punë rrjedhëse më dërgon një kujtesë me email çdo ditë të javës në 10:00 AM, duke më kujtuar të shkruaj një artikull të ri blogu. Unë përdora një veprim të palës së tretë, dawidd6/action-send-mail, për të dërguar emailin. Unë ofrova kredencialet e emailit tim si sekrete të GitHub, kështu që ato nuk janë të dukshme në skedarin e punës rrjedhëse.
Përfundim
Kam eksploruar dy mënyra për të krijuar një kujtesë për të shkruar një artikull blogu. Mënyra e parë është përditësimi i skedarit README.md të profilit tim të GitHub. Mënyra e dytë është dërgimi i një kujtese me email. Aktualisht po përdor mënyrën e parë sepse është më e dukshme sesa mënyra e dytë. Unë mund të shoh kujtesën çdo herë që vizitoj profilin tim të GitHub.
Krijova një kujtesë për të shkruar një artikull blogu duke përdorur GitHub Actions është një mënyrë e thjeshtë dhe efektive për të mbajtur një program të rregullt të shkrimit të blogut. Me këtë punë rrjedhëse në vend, nuk do të harroni kurrë të shkruani një artikull të ri. Nëse jeni të interesuar për të krijuar punën tuaj të kujtesës rrjedhëse, sigurohuni që të shikoni dokumentacionin e GitHub Actions për të mësuar më shumë. Shkrimi i blogut i këndshëm!