🧐

GitHub ActionsでREADME.mdのZenn記事一覧を自動更新したい

2023/07/12に公開

はじめに

こんにちは、白色です。現在、ベンチャーでフロントエンドエンジニアとして活動しています。
今回が5回目の投稿です。

概要

  • GitHub Actionsを使用して、Zennの記事一覧を自動的に更新したい
  • 新しい記事を投稿するたびに手動でREADMEを編集したくない
  • 多すぎると見た目が悪いので、5件まで表示させたい

ソリューション

  1. GitHub Actionsの設定:
    最初にGitHub Actionsのワークフローを設定する。特定の条件(README.mdが更新されている)が満たされた時に動くようにする

  2. Zennの記事一覧の取得:
    設定したActionが発火されると、ZennのAPIを呼び出して最新の記事一覧を取得します。

  3. README.mdの更新:
    取得した記事一覧を使用して、README.mdファイルを自動的に更新する。

使用コード

https://github.com/fuuki12/fuuki12

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の部分が自動更新されるようになりました。
    README.md

まとめ

  • GitHub Actionsで使用して、定期実行を行うことができる + 条件も設定できるので、様々なことに使えそうだなと思いました。
  • ChatGPTと連携させると面白かったりするのかな?...また考えてみます。

Discussion