🧐
GitHub ActionsでREADME.mdのZenn記事一覧を自動更新したい
はじめに
こんにちは、白色です。現在、ベンチャーでフロントエンドエンジニアとして活動しています。
今回が5回目の投稿です。
概要
- GitHub Actionsを使用して、Zennの記事一覧を自動的に更新したい
- 新しい記事を投稿するたびに手動でREADMEを編集したくない
- 多すぎると見た目が悪いので、5件まで表示させたい
ソリューション
-
GitHub Actionsの設定:
最初にGitHub Actionsのワークフローを設定する。特定の条件(README.mdが更新されている)が満たされた時に動くようにする -
Zennの記事一覧の取得:
設定したActionが発火されると、ZennのAPIを呼び出して最新の記事一覧を取得します。 -
README.mdの更新:
取得した記事一覧を使用して、README.mdファイルを自動的に更新する。
使用コード
update.py
import requests
GENERATE_FILE_NAME = 'README.md'
# Zennの記事データを取得するAPIのURL
url = "https://zenn.dev/api/articles?username=maple_siro&order=latest"
# APIからデータを取得する関数
def fetch_data_from_api(url):
try:
response = requests.get(url)
response.raise_for_status()
return response.json()
except (requests.RequestException, ValueError) as err:
print(f"Error while getting data from API - {err}")
return None # エラーがあった場合はNoneを返す
# 取得したJSONデータからコンテンツを準備する関数
def prepare_content(jsonData):
# jsonDataがNoneであれば何も返さない
if jsonData is None:
return
# 最初の5つの記事を取得し、それらのタイトルとURLで整形された文字列を生成する
articles_list = [f"- [{article['title']}]({'https://zenn.dev/' + article['path']})"
for article in jsonData["articles"][:5]]
# 全記事の文字列を改行で連結する
formatted_articles_list = '\n'.join(articles_list)
# 実際の記事リストと置換したマークダウン文字列を返す
return '''
### Maple Profile 🍁
...README.mdの内容を入れる
## 🎾 My Zenn Article
{zennArticle}
'''.strip().format(zennArticle=formatted_articles_list)
# 生成したコンテンツをファイルに書き込む関数
def write_to_file(file_name, content):
# ファイルを書き込みモードで開き、コンテンツを書き込む
with open(file_name, 'w', encoding='utf-8') as file:
file.write(content)
# 与えられたURLを使ってAPIからデータを取得する
jsonData = fetch_data_from_api(url)
# 取得したデータに基づいてマークダウンコンテンツを生成する
content = prepare_content(jsonData)
# コンテンツが生成されたら、ファイルに書き込む
if content:
write_to_file(GENERATE_FILE_NAME, content)
update_readme_schedule.yml
# ワークフローの名前
name: update readme schedule
# このワークフローをトリガーするイベント
on:
# スケジュールされた実行(ここでは毎日0時に実行)
schedule:
- cron: "0 0 * * *"
# 手動でワークフローを実行するためのトリガー
workflow_dispatch:
# ワークフロー内のジョブ
jobs:
# ジョブ名
readme:
# 書き込み許可を持つ
permissions:
contents: write
# このジョブは最新のUbuntu環境で実行されます
runs-on: ubuntu-latest
steps:
# リポジトリのチェックアウト
- uses: actions/checkout@v3
# Pythonのセットアップ
- name: Set up Python
uses: actions/setup-python@v2
# Pythonのバージョンを3.9に設定
with:
python-version: "3.9"
# 依存関係のインストール
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install requests
# スクリプトの実行
- name: run
working-directory: scripts
run: |
python update.py
mv README.md ./../README.md
# コミットの作成
- name: commit
id: commit
run: |
git config --global user.name "${{ github.actor }}"
git config --global user.email "${{ github.actor }}@users.noreply.github.com"
git add README.md
# 変更があればコミットし、pushフィールドの値をtrueに設定
git diff-index --quiet HEAD || (git commit -m 'update README.md' && echo "::set-output name=push::true")
# コードのプッシュ
- name: push
# コミットステップでの出力結果がtrueであれば実行
if: steps.commit.outputs.push
run: git push origin HEAD:main
- ※コードコメントはChatGPTで作成しました
結果
- Zenn Article Listの部分が自動更新されるようになりました。
まとめ
- GitHub Actionsで使用して、定期実行を行うことができる + 条件も設定できるので、様々なことに使えそうだなと思いました。
- ChatGPTと連携させると面白かったりするのかな?...また考えてみます。
Discussion