You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Git仓库master分支变更时如何在Linux设备上触发执行指定脚本?

自动触发树莓派部署脚本的实现方案

下面提供两种常用的实现方式,你可以根据自己的网络环境选择:

方案1:Webhook 主动触发(推荐,实时性高)

适合树莓派可以暴露公网端口的场景,代码仓库有变更时会主动推送事件到树莓派,触发部署。

  • 第一步:在树莓派上部署一个轻量Web服务接收Webhook请求,以下是Python Flask的极简示例:
from flask import Flask, request
import subprocess
import hmac
import hashlib

app = Flask(__name__)
# 自行设置加密密钥,和后续仓库配置的Webhook密钥保持一致
WEBHOOK_SECRET = b"your_custom_secret_here"

@app.route('/deploy-bot', methods=['POST'])
def deploy_bot():
    # 校验请求签名,防止恶意触发
    sig_header = request.headers.get('X-Hub-Signature-256')
    if not sig_header:
        return "Invalid request", 403
    _, sig = sig_header.split('=')
    computed_sig = hmac.new(WEBHOOK_SECRET, request.data, hashlib.sha256).hexdigest()
    if not hmac.compare_digest(computed_sig, sig):
        return "Invalid signature", 403
    # 仅响应master分支的push事件
    if request.json.get('ref') == 'refs/heads/master':
        # 调用你已经写好的部署脚本
        subprocess.run(["/path/to/your/deploy_script.sh"], check=True)
        return "Deploy triggered", 200
    return "No deploy needed", 200

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=9000)

你可以用systemd把这个Web服务配置为后台常驻、开机自启,不要直接使用开发环境的运行方式对外提供服务。

  • 第二步:在你的代码托管平台(GitHub/GitLab/Gitee等)的仓库设置中找到Webhook配置页,填写:
    • payload URL:http://你的树莓派公网IP:9000/deploy-bot
    • Content type:选择application/json
    • Secret:填写你刚才在代码里设置的自定义密钥
    • 触发事件:仅选择push事件即可
  • 第三步:配置树莓派的防火墙和路由器端口映射,开放9000端口的公网访问权限;如果没有公网IP,可以配置内网穿透实现公网访问。

方案2:定时轮询仓库(无公网IP可用时选择)

不需要暴露公网端口,配置更简单,实时性稍差,通过定时任务定期检查仓库是否有更新。

  • 第一步:编写检查更新的脚本,示例如下:
#!/bin/bash
# 本地仓库路径
BOT_REPO_PATH="/home/pi/discord-bot"
# 你已经写好的部署脚本路径
DEPLOY_SCRIPT_PATH="/home/pi/deploy_bot.sh"
# 日志存储路径
LOG_PATH="/var/log/bot_deploy.log"

cd $BOT_REPO_PATH || exit 1
# 拉取远程仓库最新信息
git fetch origin > /dev/null 2>&1

# 对比本地和远程master分支的哈希值
LOCAL_HASH=$(git rev-parse HEAD)
REMOTE_HASH=$(git rev-parse origin/master)

if [ "$LOCAL_HASH" != "$REMOTE_HASH" ]; then
    echo "$(date "+%Y-%m-%d %H:%M:%S") 检测到master分支更新,触发部署" >> $LOG_PATH
    bash $DEPLOY_SCRIPT_PATH >> $LOG_PATH 2>&1
fi

给脚本加执行权限:chmod +x /path/to/check_update.sh

  • 第二步:添加定时任务,执行crontab -e编辑定时任务配置,加入以下内容(示例为每5分钟检查一次):
*/5 * * * * /path/to/check_update.sh

如果需要排查问题,可以把定时任务的输出也写入日志,调整为:

*/5 * * * * /path/to/check_update.sh >> /var/log/bot_check.log 2>&1

注意事项

  • 所有涉及的脚本都需要配置对应的执行权限,运行脚本的用户需要有仓库读写、机器人进程管理的权限
  • git拉取代码建议使用SSH密钥认证,避免密码验证的问题
  • 所有操作建议加日志输出,方便后续排查部署故障
  • 使用Webhook方案时务必开启签名校验,避免恶意请求触发部署脚本

内容的提问来源于stack exchange,提问作者derebetes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 22:45:02