- Nai-publish noong
Paano Gumawa ng Mga Paalala para sa Blog Post Gamit ang GitHub Actions
- Mga May-akda
- Pangalan
- Imamuzzaki Abu Salam
- https://x.com/ImBIOS_Dev
Bilang Isang Manunulat: Paglikha ng Paalala para sa Pagsusulat ng Blog gamit ang GitHub Actions
Bilang isang manunulat, nauunawaan ko ang kahalagahan ng pagiging pare-pareho pagdating sa paglalathala ng bagong nilalaman. Gayunpaman, may mga pagkakataon na nakakaabala ang buhay, at maaaring maging mahirap na maalala na magsulat ng bagong post sa blog. Para tulungan akong manatili sa track sa aking iskedyul ng pagbabahagi, gumawa ako ng isang simpleng paalala gamit ang GitHub Actions. Sa post na ito, ibabahagi ko kung paano ko ginawa ang workflow na ito.
Ano ang GitHub Action?
Ang GitHub Actions ay isang makapangyarihang tool na nagbibigay-daan sa iyo na awtomatiko ang iyong mga workflow. Maaari mo itong gamitin upang bumuo, subukan, at i-deploy ang iyong code. Maaari mo ring gamitin ito upang magsagawa ng iba't ibang mga gawain, tulad ng pagpapadala ng mga notification o pag-iskedyul ng mga paalala.
Paano Ako Gumawa ng Paalala para sa Pagsusulat ng Post sa Blog
Upang lumikha ng paalala para sa pagsusulat ng post sa blog, ginagamit ko ang espesyal na repositoryo ng GitHub README.md at nagdagdag ng isang file na pinangalanang .github/workflows/blog-posts.yml. Sa file na ito, tinukoy ko ang workflow na isasagawa ng GitHub Actions. Narito ang paunang nilalaman ng file:
name: Blog Posts
on:
schedule:
- cron: '0 0 * * 0' # Patakbuhin sa 00:00 tuwing Linggo
workflow_dispatch:
jobs:
update-posts:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: I-update ang listahan ng post
run: |
sleep 1m
curl -LO https://blog.imam.dev/feed.xml
node src/list-posts.js
rm feed.xml
- name: I-commit ang mga pagbabago
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 "I-update ang mga post sa blog"
- name: I-pull ang mga pagbabago
run: git pull -r
- name: I-push ang mga pagbabago
uses: ad-m/github-push-action@0fafdd62b84042d49ec0cb92d9cac7f7ce4ec79e
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
Ang workflow na ito ay na-trigger tuwing Linggo sa 00:00. Pagkatapos ay nagpapatakbo ito ng isang script na nag-uupdate sa listahan ng mga post sa blog. Ang script ay nakasulat sa JavaScript at nag-parse sa RSS feed ng aking blog. Pagkatapos ay bumubuo ito ng isang listahan ng mga post sa blog at ina-update ang file na README.md. Sa wakas, ini-commit nito ang mga pagbabago at ini-push ang mga ito sa GitHub. Ginagamit ko ang repositoryo ni ouuan bilang sanggunian para sa workflow na ito.
Saan nagmula ang paalala? Ito ay nasa file na list-posts.js. Nagdagdag ako ng paalala sa listahan ng mga post sa blog. Narito ang nilalaman ng file:
const { readFileSync, writeFileSync } = require('fs')
/**
* I-convert ang XML string sa 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
}
/**
* I-sort ang JSON ayon sa pubDate
* @param {object} json
* @returns {object} sortedJson
*/
const sortJson = (json) => {
json.sort((a, b) => new Date(b.pubDate) - new Date(a.pubDate))
return json
}
// Basahin ang XML file at i-convert sa JSON
const xmlString = readFileSync('feed.xml', 'utf8')
const feeds = sortJson(xmlToJson(xmlString).rss.channel.item)
// Gumawa ng Markdown list ng mga post
const posts = feeds
.slice(0, 5)
.map(
(item) =>
`- ${new Date(item.pubDate).toISOString().split('T')[0]} [${item.title}](${
item.link
}?utm_source=GitHubProfile)`
)
// I-update ang README.md kung nagbago ang mga post,
// Kung hindi, magtapon ng error upang ipaalala sa akin na magsulat ng post sa blog
const readme = readFileSync('README.md', 'utf8')
if (readme.includes(posts.join('\n'))) {
throw new Error('Walang bagong post sa blog')
} 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('Na-update ang README.md')
}
Binabasa ng script ang RSS feed ng aking blog at bumubuo ng isang listahan ng mga post sa blog. Pagkatapos ay ina-update nito ang file na README.md gamit ang listahan ng mga post sa blog. Kung walang bagong post sa blog, nagtatapon ito ng error upang ipaalala sa akin na magsulat ng post sa blog.
Ito ay isang error lamang na itatapon kapag ang script ay pinapatakbo habang ang mga post ay pareho pa rin at hindi ito isang paalala na ipapadala sa aking email o isang bagay na mas nakikita sa akin. Kaya, nagpasya akong paganahin ang notification para sa anumang nabigong pagpapatakbo ng workflow. Narito kung paano ito gawin:
Mag-click sa kanang itaas na sulok ng pahina at piliin ang Mga Setting.
Piliin ang Mga Notification sa kaliwang sidebar.
Mag-click sa Mga Aksyon.
Piliin ang Magpadala ng mga notification para sa nabigong mga workflow lamang.
Ngayon, makakatanggap ako ng notification kapag ang script ay pinapatakbo at walang bagong post sa blog. Maaari ko ring makita ang notification sa website ng GitHub.
Isa Pang Paraan na Aking Sinubukan
Ang nakaraang workflow na sinabi ko sa iyo ay isang binagong bersyon upang ang aking README.md ay palaging napapanahon. Sinubukan ko rin ang isa pang paraan upang lumikha ng paalala para sa pagsusulat ng post sa blog. Ngunit, ito ay isang purong paalala nang walang anumang mekanismo ng pag-update ng README.md, isang paalala lamang.
Upang lumikha ng paalala para sa pagsusulat ng post sa blog, gumawa ako ng isang bagong repositoryo ng GitHub at nagdagdag ng isang file na pinangalanang .github/workflows/remind.yml
. Sa file na ito, tinukoy ko ang workflow na isasagawa ng GitHub Actions. Narito ang nilalaman ng file:
name: Paalala upang magsulat ng post sa blog
on:
schedule:
- cron: '0 10 * * 1-5'
jobs:
remind:
runs-on: ubuntu-latest
steps:
- name: Magpadala ng paalala
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: 'Paalala upang magsulat ng bagong post sa blog'
body: "Huwag kalimutang magsulat ng bagong post sa blog ngayon!"
to: my-email@example.com
Ang workflow na ito ay nagpapadala sa akin ng isang email na paalala tuwing araw ng linggo sa 10:00 AM, na nagpapaalala sa akin na magsulat ng bagong post sa blog. Gumamit ako ng isang third-party na aksyon, dawidd6/action-send-mail, upang ipadala ang email. Ibinigay ko ang aking mga kredensyal sa email bilang mga lihim ng GitHub, kaya hindi ito nakikita sa workflow file.
Konklusyon
Sinubukan ko ang dalawang paraan upang lumikha ng paalala para sa pagsusulat ng post sa blog. Ang unang paraan ay ang pag-update ng file na README.md ng aking profile sa GitHub. Ang pangalawang paraan ay ang pagpapadala ng email na paalala. Kasalukuyang ginagamit ko ang unang paraan dahil mas nakikita ito kaysa sa pangalawang paraan. Makikita ko ang paalala sa tuwing binibisita ko ang aking profile sa GitHub.
Ang paglikha ng paalala para sa pagsusulat ng post sa blog gamit ang GitHub Actions ay isang simple at epektibong paraan upang manatili sa track sa iyong iskedyul ng pag-blog. Gamit ang workflow na ito, hindi mo na kailangang kalimutan na magsulat ng bagong post. Kung interesado kang lumikha ng iyong sariling workflow na paalala, tiyaking suriin ang dokumentasyon ng GitHub Actions upang matuto nang higit pa. Maligayang pag-blog!