るちtechブログ

とあるサイトを作っています

GitHubにpushすると自動でpull&再起動させる方法(Webhook)

Raspberry PiGitHub の 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 & コマンド実行が自動化できます! 🚀