- 게시됨
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: 게시글 목록 업데이트
run: |
sleep 1m
curl -LO https://blog.imam.dev/feed.xml
node src/list-posts.js
rm feed.xml
- name: 변경 사항 커밋
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 "블로그 게시글 업데이트"
- name: 변경 사항 풀
run: git pull -r
- name: 변경 사항 푸시
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
}
/**
* pubDate로 JSON 정렬
* @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('새로운 블로그 게시글이 없습니다.')
} 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('README.md를 업데이트했습니다.')
}
이 스크립트는 블로그의 RSS 피드를 읽고 블로그 게시글 목록을 생성합니다. 그런 다음 README.md 파일을 블로그 게시글 목록으로 업데이트합니다. 새로운 블로그 게시글이 없으면 블로그 게시글을 작성하라는 알림을 표시하는 오류를 발생시킵니다.
이는 게시글이 여전히 동일한 상태에서 스크립트가 실행될 때 발생하는 오류일 뿐이며, 이메일로 전송되거나 저에게 더 눈에 띄는 방식으로 전달되는 알림이 아닙니다. 따라서 실패한 워크플로우 실행에 대한 알림을 활성화하기로 결정했습니다. 다음은 그 방법입니다.
페이지의 오른쪽 상단 모서리에서 설정을 선택합니다.
왼쪽 사이드바에서 알림을 선택합니다.
Actions를 클릭합니다.
실패한 워크플로우에 대한 알림만 보내기를 선택합니다.
이제 스크립트가 실행되고 새로운 블로그 게시글이 없으면 알림을 받게 됩니다. GitHub 웹사이트에서도 알림을 볼 수 있습니다.
제가 탐색한 또 다른 방법
이전에 설명한 워크플로우는 README.md가 항상 최신 상태가 되도록 수정된 버전입니다. 또한 블로그 게시글 작성 알림을 만드는 또 다른 방법을 탐색했지만, README.md 업데이트 메커니즘이 없는 순수한 알림일 뿐입니다. 단순한 알림입니다.
블로그 게시글 작성 알림을 만들기 위해 새 GitHub 저장소를 만들고 .github/workflows/remind.yml
이라는 파일을 추가했습니다. 이 파일에서 GitHub Actions가 실행할 워크플로우를 정의했습니다. 파일의 내용은 다음과 같습니다.
name: 블로그 게시글 작성 알림
on:
schedule:
- cron: '0 10 * * 1-5'
jobs:
remind:
runs-on: ubuntu-latest
steps:
- name: 알림 보내기
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: '새로운 블로그 게시글 작성 알림'
body: "오늘 새로운 블로그 게시글을 작성하는 것을 잊지 마세요!"
to: my-email@example.com
이 워크플로우는 평일에 오전 10:00에 이메일 알림을 보내 새로운 블로그 게시글을 작성하라는 알림을 보냅니다. 이메일을 보내기 위해 dawidd6/action-send-mail이라는 타사 액션을 사용했습니다. GitHub 암호로 이메일 자격 증명을 제공했으므로 워크플로우 파일에 표시되지 않습니다.
결론
블로그 게시글 작성 알림을 만드는 두 가지 방법을 살펴보았습니다. 첫 번째 방법은 GitHub 프로필의 README.md 파일을 업데이트하는 것입니다. 두 번째 방법은 이메일 알림을 보내는 것입니다. 현재 첫 번째 방법을 사용하고 있는데, 두 번째 방법보다 더 눈에 띄기 때문입니다. GitHub 프로필을 방문할 때마다 알림을 볼 수 있습니다.
GitHub Actions를 사용하여 블로그 게시글 작성 알림을 만드는 것은 블로그 일정을 따라가는 간단하고 효과적인 방법입니다. 이 워크플로우를 통해 새로운 게시글 작성을 잊는 일이 없을 것입니다. 자신의 알림 워크플로우를 만들고 싶다면 GitHub Actions 설명서를 참조하여 자세히 알아보세요. 즐거운 블로그 작성!