- Waxaa la daabacay
Sida loo isticmaalo GitHub Actions si loo abuuro macluumaad lagu daabaco maqaallo
- Qorayaasha
- Magaca
- Imamuzzaki Abu Salam
- https://x.com/ImBIOS_Dev
Sida aan u sameeyay Xasuusin si aan u Qoro Qoraal Blog ah
Sida qoraa, waan fahansanaa muhiimadda isku mid ahaanshaha marka la eego daabacaadda waxyaabaha cusub. Si kastaba ha ahaatee, waxaa jira waqtiyo noloshu ay ku dhex gasho, waxaana adkaan kara xasuusinta inaad qorto qoraal cusub oo blog ah. Si aan u caawiyo inaan ku sii jiro wadada jadwalka wadaagga, waxaan abuuray xasuusin fudud isticmaalaya GitHub Actions. Qoraalkan, waxaan wadaagi doonaa sida aan u sameeyay shaqadan.
Maxay tahay GitHub Action?
GitHub Actions waa qalab awood leh oo kuu oggolaanaya inaad si otomaatig ah u shaqeysiiso shaqooyinkaaga. Waxaad isticmaali kartaa si aad u dhisto, u tijaabiso, oo aad u daabacdo koodkaaga. Waxaad sidoo kale isticmaali kartaa si aad u fuliso shaqooyin kale oo ballaaran, sida diritaanka ogeysiinta ama jadwalka xasuusiyaha.
Sida aan u Abuuray Xasuusin si aan u Qoro Qoraal Blog ah
Si aan u abuuro xasuusin si aan u qoro qoraal blog ah, waxaan isticmaalayaa GitHub-ka kaydinta gaarka ah ee README.md oo aan ku daray fayl lagu magacaabo .github/workflows/blog-posts.yml. Faylkan, waxaan qeexay shaqada GitHub Actions ay fulin lahayd. Halkan waxaa ah waxyaabaha ugu horreeya ee ku jira faylka:
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 }}
Shaqadan waxaa la bilaabaa Axadda kasta 00:00. Ka dib waxay fulisaa qoraal oo cusbooneysiiya liiska qoraallada blog-ga. Qoraalka waxaa lagu qoray JavaScript waxaana uu falanqeeyaa quudinta RSS ee blog-ga. Ka dib waxay abuurtaa liiska qoraallada blog-ga oo cusbooneysiisa faylka README.md. Ugu dambeyntii, waxay fulisaa isbeddellada oo waxay u dirtaa GitHub. Waxaan isticmaalayaa kaydinta ouuan si loogu tixraaco shaqadan.
Xasuusintu meesha ay ka timid? Runtii waxay ku jirtaa faylka list-posts.js. Waxaan ku daray xasuusin liiska qoraallada blog-ga. Halkan waxaa ah waxyaabaha ku jira faylka:
const { readFileSync, writeFileSync } = require('fs')
/**
* Convert XML string to 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
}
/**
* 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)[\s\S]*(?=\n<!--END_SECTION:blog-posts-->)/,
posts.join('\n')
)
writeFileSync('README.md', updatedReadme)
console.log('Updated README.md')
}
Qoraalka waxaa uu akhriyaa quudinta RSS ee blog-ga oo uu abuuray liiska qoraallada blog-ga. Ka dib waxay cusbooneysiisaa faylka README.md liiska qoraallada blog-ga. Haddii aanu jirin qoraallo cusub oo blog ah, waxay soo tuuraysaa khalad si ay iigu xasuusisato inaan qoro qoraal blog ah.
Waa khalad oo kaliya oo la tuuri doono marka qoraalka la fulinayo iyadoo qoraallada ay wali isku mid yihiin, mana aha xasuusin oo loo diri doono emaylkayga ama wax ka muuqda oo iigu muuqda. Sidaa darteed, waxaan go'aansaday inaan awood siiyay ogeysiinta ee dhammaan fulinta shaqada oo fashilantay. Halkan waxaa ku yaal sida loo sameeyo:
Guji geeska sare ee midig ee bogga oo dooro Settings.
Dooro Notifications ee dhinaca bidix.
Guji Actions.
Dooro Send notifications for failed workflows only.
Hadda, waxaan heli doonaa ogeysiis marka qoraalka la fulinayo oo aynaan jirin qoraallo cusub oo blog ah. Waxaan sidoo kale arki karaa ogeysiiska bogga GitHub.
Hab Kale oo aan baaray
Shaqada hore oo aan kuu sheegay waa nooc la beddelay si README.md uu had iyo jeer u cusboonaado. Waxaan sidoo kale baaray hab kale oo loo abuuro xasuusin si loo qoro qoraal blog ah. Laakiin, waa xasuusin saafi ah oo aan lahayn habka cusbooneysiinta README.md, oo kaliya xasuusin.
Si aan u abuuro xasuusin si aan u qoro qoraal blog ah, waxaan abuuray keydinta GitHub cusub oo aan ku daray fayl lagu magacaabo .github/workflows/remind.yml
. Faylkan, waxaan qeexay shaqada GitHub Actions ay fulin lahayd. Halkan waxaa ku jira waxyaabaha ku jira faylka:
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
Shaqadan waxay iigu dirtaa xasuusin emayl ah maalin kasta oo shaqo ah 10:00 AM, si ay iigu xasuusisato inaan qoro qoraal cusub oo blog ah. Waxaan isticmaalay shaqada saddexaad, dawidd6/action-send-mail, si aan ugu diro emaylka. Waxaan bixiyay aqoonsiga emaylka si qarsoodi ah oo GitHub ah, sidaas darteed ma muuqdaan faylka shaqada.
Gabagabo
Waxaan baaray laba hab oo loo abuuro xasuusin si loo qoro qoraal blog ah. Habka koowaad waa in la cusbooneysiiyo faylka README.md ee astaanta GitHub-kayga. Habka labaad waa in la diro xasuusin emayl ah. Hadda waxaan isticmaalayaa habka koowaad maxaa yeelay wuu ka muuqdaa habka labaad. Waxaan arki karaa xasuusinta marka kasta oo aan booqdo astaanta GitHub-kayga.
Abuuritaanka xasuusin si loo qoro qoraal blog ah isticmaalaya GitHub Actions waa hab fudud oo waxtar leh oo lagu sii jiro wadada jadwalka blog-gaaga. Marka shaqadan la dejiyo, mar dambe ma ilaawi doonto inaad qorto qoraal cusub. Haddii aad xiiseyneyso inaad abuurto shaqada xasuusintaada, hubi inaad eegto dokumentiyada GitHub Actions si aad wax badan u barato. Ku raaxayso blog-ga!