- Published on
もう手作業は卒業!Github Actionsでレポート作成を自動化する
- Authors
- Name
- Nomad Dev Life
インフルエンザの発生状況のデータを自動更新したい
前回、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したいと思います。イメージは以下です。
Github Actionsのjobの流れ
Github Actionsのjobの流れは以下です。
- 土曜9:00a.m.にGithub Actionsのjobを起動する
- 厚生労働省のページにuploadされているPDFをダウンロードする
- ダウンロードしたPDFの中の表から都道府県別の報告数を抽出し、CSVファイルを生成する
- 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コードを更新せずに済みそうです。