Published on

もう手作業は卒業!Github Actionsでレポート作成を自動化する

Authors
  • avatar
    Name
    Nomad Dev Life
    Twitter
2025-01-13-title

インフルエンザの発生状況のデータを自動更新したい

前回stliteを使ってインフルエンザの発生情報をグラフに表示しました。stliteはブラウザ上で動くwasmなので、CSVデータの置き場所以外はサーバーが必要ありませんでした。

厚生労働省によるインフルエンザの発生状況のレポートは、基本的には毎週金曜日に更新されています。毎週金曜日に、Google Colabを実行してCSVファイルを作成し、Webサーバーに配置し直すのは面倒です。 そこで今回は、Github Actionsを使って、インフルエンザの発生状況のレポートをダウンロードし、CSVに変換してWebサーバーにdeployしてみます。

イメージ

今回は、GitHub Actionsで土曜9:00a.m.にjobを起動し、厚生労働省からPDFをダウンロードしてCSVを作成し、成果物(public)をSSH/SCPでVPSにdeployしたいと思います。イメージは以下です。

2025-01-13-image

Github Actionsのjobの流れ

Github Actionsのjobの流れは以下です。

  1. 土曜9:00a.m.にGithub Actionsのjobを起動する
  2. 厚生労働省のページにuploadされているPDFをダウンロードする
  3. ダウンロードしたPDFの中の表から都道府県別の報告数を抽出し、CSVファイルを生成する
  4. CSVファイルをVultr VPSにアップロードする

Github Actions

上記のワークフローを実行するGithub Actionsのymlファイルは以下です。これを、リポジトリの.github/workflowディレクトリの下に任意の名前で配置します。

name: Process PDF and Create CSV

on:
  schedule:
    - cron: '0 9 * * 6'  # 土曜の9時(UTC)に実行
  workflow_dispatch:   # 手動実行を可能にする

jobs:
  process_pdf_job:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v3

      - name: Set up Python
        uses: actions/setup-python@v4
        with:
          python-version: '3.10'

      - name: Install dependencies
        run: |
          python -m pip install --upgrade pip
          pip install -r requirements.txt

      - name: Run Python script
        run: python actions/process_pdf.py

      - name: Commit and push CSV
        run: |
           git config user.name github-actions
           git config user.email github-actions@github.com
           git add public
           git commit -m "Update CSVs" || echo "No changes to commit"
           git push origin main
  
      - name: Archive the output folder
        run: tar -czf public.tar.gz public
      
      - name: Upload artifact
        uses: actions/upload-artifact@v4
        with:
          name: public-folder
          path: public.tar.gz

  deploy:
    runs-on: ubuntu-latest
    needs: process_pdf_job
    steps:
      - name: Download artifact
        uses: actions/download-artifact@v4
        with:
          name: public-folder

      - name: Set up SSH
        uses: webfactory/ssh-agent@v0.9.0
        with:
          ssh-private-key: ${{ secrets.WEB_SSH_KEY }}

      - name: Backup the contents on VPS
        run: |
          ssh -o StrictHostKeyChecking=no user@your-vps-ip 'bash -s' << 'EOF'

          BACKUP_DIR="/path/to/backup"
          TARGET_DIR="/path/to/public"

          DATE=$(date +"%Y%m%d")
          tar -czvf "$BACKUP_DIR/backup_$DATE.tar.gz" "$TARGET_DIR"
          rm -rf "$TARGET_DIR"

          echo "Backup completed: $BACKUP_DIR/backup_$DATE.tar.gz"

          EOF

      - name: Deploy to VPS using scp
        run: |
          scp -o StrictHostKeyChecking=no public.tar.gz user@your-vps-ip:/path/to

      - name: Extract files on VPS
        run: |
          ssh -o StrictHostKeyChecking=no user@your-vps-ip "tar -xzf /path/to/public.tar.gz -C /path/to && rm /path/to/public.tar.gz && docker exec nginx-release nginx -s reload"

ファイルをVPS上のLinuxサーバーにSCPでアップロードする箇所は、Nomad Dev Life - GitHub ActionsでblogをNginxにdeployするで説明した内容と同じなので、詳細はそちらのページを参照してください。

actions/process_pdf.py

PDFをダウンロードしてtabula-pyでデータを取り出し、CSVにするところまでは、前々回に記載した内容とほぼ同じです。Google Colabで実行していたコードを、Github Actions上で動かすように変更しています。

おわりに

前回、stliteを使って作成したレポートは、この更新されたデータを見るように変更しました。以下のリンクから確認することができます。

今回は、Github Actionsを使って、インフルエンザの発生状況のレポートをダウンロードし、CSVに変換してWebサーバーにdeployしました。これで、毎週土曜日に手動でCSVコードを更新せずに済みそうです。