/opt/scripts/deploy.sh
1#!/bin/bash2
3# 配置变量4TARGET_DIR="/var/www/your-project"5BRANCH="deploy"6
7echo "Starting deployment at $(date)"8
9cd $TARGET_DIR || exit10
11# 1. 强制拉取指定分支,确保不产生冲突12git fetch origin $BRANCH13git reset --hard origin/$BRANCH14
15# 2. 如果是 Laravel 项目,执行必要操作13 collapsed lines
16if [ -f "artisan" ]; then17 composer install --no-dev --optimize-autoloader18 npm install19 npm run build20 php artisan migrate --force21 php artisan config:cache22 php artisan route:cache23fi24
25# 3. 如果有服务需要重启26# sudo systemctl restart xxx.service27
28echo "Deployment finished at $(date)"注意: 记得给脚本执行权限:chmod +x /opt/scripts/deploy.sh。
配置 Webhook 接收器
需要一个程序来监听 GitHub 发来的请求。对于 Linux 服务器,最轻量且强大的工具是 webhook (Go 编写)。
1# Ubuntu/Debian2sudo apt install webhook3# CentOS/Fedora4sudo dnf install webhook1# 腾讯云的OpenCloudOS需要手动安装2# 1. 下载最新版本 (x86_64 架构)3curl -L https://github.com/adnanh/webhook/releases/download/2.8.1/webhook-linux-amd64.tar.gz -o webhook.tar.gz4
5# 2. 解压6tar -xvf webhook.tar.gz7
8# 3. 移动到系统 bin 目录以便全局调用9sudo mv webhook-linux-amd64/webhook /usr/local/bin/10
11# 4. 清理12rm -rf webhook-linux-amd64 webhook.tar.gz13
14# 5. 验证15webhook --version配置 hooks.json: 创建一个配置文件(如 ~/hooks.json)
1[2 {3 "id": "redeploy-app",4 "execute-command": "/opt/scripts/deploy.sh",5 "command-working-directory": "/var/www/your-project",6 "pass-arguments-to-command": [7 {8 "source": "payload",9 "name": "ref"10 }11 ],12 "trigger-rule": {13 "and": [14 {15 "match": {22 collapsed lines
16 "type": "payload-hmac-sha1",17 "secret": "你的Webhook密钥",18 "parameter": {19 "source": "header",20 "name": "X-Hub-Signature"21 }22 }23 },24 {25 "match": {26 "type": "value",27 "value": "refs/heads/deploy",28 "parameter": {29 "source": "payload",30 "name": "ref"31 }32 }33 }34 ]35 }36 }37]这个配置确保了只有当推送的分支是 refs/heads/deploy 且密钥正确时,才会执行脚本。
运行 Webhook 服务
1webhook -hooks ~/hooks.json -verbose(生产环境建议将其写成 systemd 服务在后台运行)
1sudo vim /etc/systemd/system/webhook.service1[Unit]2Description=Webhook listener for GitHub Deploy3After=network.target4
5[Service]6Type=simple7# 注意:这里 -hooks 指向你存放 hooks.json 的绝对路径8# -verbose 参数方便你在调试时通过 journalctl 查看详细日志9ExecStart=/usr/local/bin/webhook -hooks /root/hooks.json -verbose -hotreload10Restart=always11RestartSec=512User=root13# 如果你的脚本需要特定环境变量,可以在这里添加14# Environment=NODE_ENV=production15
2 collapsed lines
16[Install]17WantedBy=multi-user.target配置项解释:
-hotreload:非常实用。开启后,你修改hooks.json无需重启服务,它会自动重载配置。Restart=always:保证服务高可用。
启动并设置自启
1# 重载系统服务配置2sudo systemctl daemon-reload3
4# 启动 webhook 并设置为开机自启5sudo systemctl enable --now webhook6
7# 检查服务状态8sudo systemctl status webhook如果看到 active (running),说明服务已经稳稳地跑在后台了。
如何查看运行日志?
1# 查看实时滚动日志2journalctl -u webhook -fGitHub 端:配置 Webhook
- 进入你的 GitHub 仓库 ->
Settings->Webhooks->Add webhook。 - Payload URL:
http://你的服务器IP:9000/hooks/redeploy-app。 - Content type:
application/json。 - Secret: 填写你在
hooks.json中设置的“你的Webhook密钥”。 - Which events: 选择
Just the push event。