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事件即可
- payload URL:
- 第三步:配置树莓派的防火墙和路由器端口映射,开放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
相关产品推荐
相关产品推荐

