GitHubにpushすると自動でpull&再起動させる方法(Webhook)
Raspberry Pi で GitHub の push を検知し、自動で git pull & コマンド実行する方法(Webhook)
1. 必要なパッケージをインストール
sudo apt update sudo apt install -y git python3-flask
2. Webhook用のPythonスクリプトを作成
nano /home/pi/webhook.py
以下の内容を記述:
from flask import Flask, request import os import subprocess app = Flask(__name__) @app.route('/webhook', methods=['POST']) def webhook(): repo_path = "/home/pi/your-repo" # クローンしたリポジトリのパス os.chdir(repo_path) # `git pull` を実行 subprocess.run(["git", "pull"], check=True) # 追加で実行するコマンド(例: デプロイスクリプト) subprocess.run(["bash", "deploy.sh"], check=True) # 非同期で実行する場合 subprocess.Popen(["npm", "run", "start"], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) return "Success", 200 if __name__ == '__main__': app.run(host='0.0.0.0', port=5000)
3. Webhookサーバーを systemd で自動起動
sudo nano /etc/systemd/system/webhook.service
以下を記述:
[Unit] Description=GitHub Webhook Listener After=network.target [Service] ExecStart=/usr/bin/python3 /home/pi/webhook.py WorkingDirectory=/home/pi Restart=always User=pi [Install] WantedBy=multi-user.target
設定を適用:
sudo systemctl daemon-reload sudo systemctl enable webhook sudo systemctl start webhook
4. GitHub Webhook を設定
- GitHub のリポジトリ → Settings → Webhooks → Add webhook
- Payload URL: http://<ラズパイのIP>:5000/webhook
- Content type: application/json
- Just the push event を選択
- Add webhook
5. 動作確認
ターミナルで Webhook が動いているか確認:
curl -X POST http://localhost:5000/webhook
成功すると "Success" が返る。
補足
- deploy.sh に追加のコマンドを記述
- Webhook を HTTPS 化するなら Nginx + Let's Encrypt を導入
- GitHub の Webhook Secret を使ってセキュリティ強化も可能
これで GitHub に push するたびに git pull & コマンド実行が自動化できます! 🚀