- Ýaýradylan senesi
Makala çap etmek barada maglumatlary döretmek üçin GitHub Actions-dan peýdalanmak
- Awtorlar
- Ady
- Imamuzzaki Abu Salam
- https://x.com/ImBIOS_Dev
Ýazaryň üçin GitHub Aksiýalarynyň kömegi bilen ýatlatma döretmek
Ýazaryň biri hökmünde, täze mazmun çap edende yzygiderliligiň möhümdigini düşünýärin. Emma, haýat ýolunda gaçyp, täze blog ýazgysy ýazmak ýatdan çykyp biler. Paýlaşmak tertibimde ýolunda bolmaga kömek etmek üçin, GitHub Aksiýalaryny ulanýan ýönekeý ýatlatma döretdim. Bu ýazgyda, bu iş akşamyňy nädip döredendigimi paýlaşaryn.
GitHub Aksiýasy näme?
GitHub Aksiýalary iş akşamlaryňy awtomatlaşdyrmaga mümkinçilik berýän güýçli bir guraldyr. Ony kodyňyzy gurmak, synamak we ýerleşdirmek üçin ulanyp bilersiňiz. Şeýle hem, habarnamalar ibermek ýa-da ýatlatmalar bellige almak ýaly dürli beýleki işleri ýerine ýetirmek üçin ulanyp bilersiňiz.
Blog ýazgysy ýazmak üçin ýatlatma döredenim
Blog ýazgysy ýazmak üçin ýatlatma döretmek üçin, GitHub-yň ýörite depasyny README.md ulanyp, .github/workflows/blog-posts.yml
ady bilen bir faýl goşdym. Bu faýlda, GitHub Aksiýalarynyň ýerine ýetirjek iş akşamyny kesgitledim. Faýlyň ilkinji mazmuny şeýle:
name: Blog Posts
on:
schedule:
- cron: '0 0 * * 0' # Her ýekşenbe 00:00-da işledýär
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 }}
Bu iş akşamy her ýekşenbe 00:00-da işledýär. Soňra, blog ýazgylarynyň sanawyny täzeläýän bir skripti ýerine ýetirýär. Skript JavaScript-de ýazylan we blogumyň RSS akymyny analiz edýär. Soňra, blog ýazgylarynyň sanawyny döredýär we README.md faýlyny täzeläýär. Ahyrky, üýtgetmeleriň ýerine ýetirilenligi we GitHub-a iterilenligi barada habar berýär. Bu iş akşamy üçin ouuan-yň depasyny salgylanma hökmünde ulanyp bilersiňiz.
Ýatlatma neredenn gelýär? Aslynda, ol list-posts.js
faýlynda. Blog ýazgylarynyň sanawyna ýatlatma goşdum. Faýlyň mazmuny şeýle:
const { readFileSync, writeFileSync } = require('fs')
/**
* XML ýazgysyny JSON-a öwürmek
* @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-y pubDate boýunça sortlamak
* @param {object} json
* @returns {object} sortedJson
*/
const sortJson = (json) => {
json.sort((a, b) => new Date(b.pubDate) - new Date(a.pubDate))
return json
}
// XML faýlyny okamak we JSON-a öwürmek
const xmlString = readFileSync('feed.xml', 'utf8')
const feeds = sortJson(xmlToJson(xmlString).rss.channel.item)
// Ýazgylaryň Markdown sanawyny döretmek
const posts = feeds
.slice(0, 5)
.map(
(item) =>
`- ${new Date(item.pubDate).toISOString().split('T')[0]} [${item.title}](${
item.link
}?utm_source=GitHubProfile)`
)
// Eger ýazgylar üýtgedi bolsa, README.md-ni täzelämek,
// Ýogsam, blog ýazgysy ýazmak üçin ýatlatma bermek üçin ýalňyşlyk atmak
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')
}
Skript blogumyň RSS akymyny okaýar we blog ýazgylarynyň sanawyny döredýär. Soňra, blog ýazgylarynyň sanawy bilen README.md faýlyny täzeläýär. Eger täze blog ýazgylary ýok bolsa, blog ýazgysy ýazmak üçin ýatlatma bermek üçin ýalňyşlyk atýar.
Bu, ýazgylar şol ýerde galanda we men üçin görnükli ýatlatma ýa-da e-poçta ýatlatma hökmünde iberilmese, skripti ýerine ýetirilende atyljak ýalňyşlykdyr. Şonuň üçin, iş akşamlaryň ýalňyşlyk bilen ýerine ýetirilmegi üçin habarnamany açmaga karar berdim. Şeýle edip bilersiňiz:
Saýtyň ýokary sag künjünden basyp, Saglamalar-y saýlaň.
Çepdäki diňleýji paneliň içinden Habarnamalar-y saýlaň.
Aksiýalar-a basyň.
Diňe ýalňyşlyk bilen işledýän iş akşamlary üçin habarnamalar iber-i saýlaň.
Indi, skripti ýerine ýetirilende we täze blog ýazgylary ýok bolsa, men habarnama alarys. Şeýle hem, GitHub saýtynda habarnamany görüp bilersiňiz.
Öwrenen beýleki ýol
Size gürrüň beren öňki iş akşamy, README.md faýlymyň hemişe häzirki zaman bolmagy üçin üýtgedilen görnüşdir. Blog ýazgysy ýazmak üçin ýatlatma döretmegiň beýleki bir ýoluny hem öwrendim. Emma, bu README.md faýlyny täzeläýän iş akşamy däl, diňe ýatlatma berýär.
Blog ýazgysy ýazmak üçin ýatlatma döretmek üçin, täze bir GitHub depasy döretdim we .github/workflows/remind.yml
ady bilen faýl goşdum. Bu faýlda, GitHub Aksiýalarynyň ýerine ýetirjek iş akşamyny kesgitledim. Faýlyň mazmuny şeýle:
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
Bu iş akşamy her iş gününiň irden 10:00-da, täze blog ýazgysy ýazmak üçin ýatlatma bermek üçin e-poçta iberýär. E-poçta ibermek üçin, dawidd6/action-send-mail ady bilen üçünji tarapyň aksiýasyny ulandum. E-poçta maglumatlarymy GitHub-yň ýaňsytma hökmünde berdim, şonuň üçin ol iş akşamy faýlynda görünmeýär.
Netije
Blog ýazgysy ýazmak üçin ýatlatma döretmegiň iki sany ýoluny öwrendim. Birinji ýol, GitHub profilimde README.md faýlyny täzelämekdir. Ikinji ýol, e-poçta ýatlatma ibermekdir. Häzirki wagtda, birinji ýoly ulanyp bilersiňiz, çünki ikinji ýoldan has görnüklidir. GitHub profilimde her gezek ziyaret edende ýatlatmany görüp bilersiňiz.
GitHub Aksiýalaryny ulanýan blog ýazgysy ýazmak üçin ýatlatma döretmek, blog ýazmak tertibiňizde ýolunda galmak üçin ýönekeý we netijeli bir ýoldur. Bu iş akşamynyň ýerine ýetirilmegi bilen, hiç wagt täze ýazgy ýazmagyňyzy ýatdan çykarmazsyňyz. Eger öz ýatlatma iş akşamyňyzy döretmek isleýän bolsaňyz, GitHub Aksiýalarynyň resminama dokumentlerini öwrenip, has köp maglumat almak üçin barlaň. Ýakymly blog ýazmak!