깃허브(GitHub)와 블로그는 단순한 기록용에 그치지 않고, 개발자로 하여금 자신을 정의하는 수단으로도 쓰이고 있다. 하지만 이들을 꾸준히 관리하는 게 여간 쉬운 일이 아니다. 바로 그런 이유에서 그들의 성실성을 대변하는 역할을 톡톡히 수행하고 있기도 하지만 말이다😓
특히 프로젝트에 전념하는 동안엔 나 역시 어느 한쪽만 관리하는 데 치우치게 됐기에, 둘을 연동해 최근 활동 기록을 한 눈에 확인할 수 있다면 다른 하나가 마냥 방치되는 문제는 줄일 수 있지 않을까 하는 기대에서 관련 기능을 추가하고 싶었다.
①깃허브(GitHub) 프로필 README.md 파일에 최근 블로그 게시글을 원하는 개수만큼 불러오고, ②새 게시글이 작성되면 이를 깃허브(GitHub)에 커밋해(commit) 반영되게끔 만드는 방법은 다음과 같다.
1. Python으로 블로그 피드(RSS) 크롤링
❗ RSS(Really Simple Syndication, Rich Site Summary)란, 뉴스나 블로그와 같이 새로운 컨텐츠 업데이트가 잦은 혹은 비정기적인 사이트에서 쓰이는 컨텐츠 표현 방식을 말한다. RSS 서비스를 적용하면 구독자는 각 사이트에 일일이 방문하지 않고도 업데이트돼 리더(reader)로부터 읽혀온 내용들을 때마다 빠르고 편리하게 확인할 수 있는 것이다. 파이썬(Python)은 이를 구현하는 대표적 언어이다.
- RSS 피드는 XML 기반의 문서 포맷으로 이루어져 있다. 이 글에서 다룰 블로그인 티스토리(Tistory) 역시 마찬가지다.
1-1. import feedparser
python -m pip install feedparser
import feedparser
uri = "티스토리주소/rss"
feed = feedparser.parse(uri)
- 피드를 사용하기 위해서는 RSS 파싱용 모듈인 feedparser 설치가 우선되어야 한다.
- 이때 주소 부분을 http로 작성하면 URLError(SSLCertVerificationError)가 발생하니 주의하자.
1-2. Markdown 작성
markdown_text = """
#### Hi there 👋
#### 📚Latest Blog Posts
"""
- 프로필에 쓰일 소개 문구 등의 텍스트가 있다면 이곳에 작성한다.
1-3. feed entries 반복
for i in feed['entries'][:5]:
markdown_text += f"[{i['title']}]({i['link']}) <br>"
f = open("README.md", mode="w", encoding="utf-8")
f.write(markdown_text)
f.close()
- 앞서 정의한 feed의 entries를 반복할 차례이다. 이때
탐색 index에 대해 별도로 조건문을 써서 통제하는 대신, 노출하고자 하는 게시글 개수를 명시할 수가 있다. 현재는 5개로 설정한 상태이다: [:5]
1-4. 깃허브(GitHub) 레포지토리에 'Add file'
- 작성한 .py 파일을 프로필 레포지토리에 추가한다: Add file → Create new file
- 파일명은 자유롭게 짓되 하단의 .yml 파일 구문에서 쓰여야 하므로 잘 기억하고 있자.
2. GitHub Actions 통한 Workflow 생성
❗ GitHub Actions는 빌드, 테스트, 배포 파이프라인을 자동화할 수 있는 CI(Continuous Integration, 지속 통합) 및 CD(Continuous Deployment, 지속 배포) 플랫폼이다. 다시 말해 등록된 워크플로우(workflow)의 자동화를 돕는다.
2-1. configure Python application
- 해당 레포지토리의 Actions → New workflow → Choose a workflow에서 Python application으로 설정한다(configure).
2-2. python-app.yml 파일 작성
- 2-1 과정을 잘 수행했다면 자동으로 채워진 작성 양식이 뜰 텐데, 혹시 모를 버전 문제에 대비해 사용되는 버전 정보(uses, python-version)만 그대로 쓰고 나머지 정보는 아래와 같이 수정한다.
# This workflow will install Python dependencies, run tests and lint with a single version of Python
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-python
name: Update Latest Blog Posts
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
schedule:
- cron: "0 0 */1 * *"
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout버전확인
- name: Set up Python 버전확인
uses: actions/setup-python버전확인
with:
python-version: 버전확인
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install feedparser
- name: Read Blog Feed with Python
run: |
python 파일이름.py
- name: Update README.md
run: |
git pull
git add .
git diff
git config --local user.email "깃허브이메일"
git config --local user.name "깃허브아이디"
git commit -m "Update README.md"
git push
- 현재 설정된 cron은 매일 자정마다 위 워크플로우를 실행케 만든다("0 0 */1 * *" == At 00:00 on every day-of-month). 필요에 따라 이 값을 변경해 원하는 주기로 업데이트되도록 할 수 있다: https://crontab.guru/
- 작성 마친 다음 'Commit changes...' 버튼을 눌러 .github/workflows 폴더 하위에 python-app.yml 파일을 생성한다. 이때도 역시 파일명은 자유롭게 지으면 된다.