夜火笔记

Laravel 搭配 github webhook 实现自动化部署

2026-04-16
笔记 phplaravelgit
4分钟
620字

/opt/scripts/deploy.sh

1
#!/bin/bash
2
3
# 配置变量
4
TARGET_DIR="/var/www/your-project"
5
BRANCH="deploy"
6
7
echo "Starting deployment at $(date)"
8
9
cd $TARGET_DIR || exit
10
11
# 1. 强制拉取指定分支,确保不产生冲突
12
git fetch origin $BRANCH
13
git reset --hard origin/$BRANCH
14
15
# 2. 如果是 Laravel 项目,执行必要操作
13 collapsed lines
16
if [ -f "artisan" ]; then
17
composer install --no-dev --optimize-autoloader
18
npm install
19
npm run build
20
php artisan migrate --force
21
php artisan config:cache
22
php artisan route:cache
23
fi
24
25
# 3. 如果有服务需要重启
26
# sudo systemctl restart xxx.service
27
28
echo "Deployment finished at $(date)"

注意: 记得给脚本执行权限:chmod +x /opt/scripts/deploy.sh

配置 Webhook 接收器

需要一个程序来监听 GitHub 发来的请求。对于 Linux 服务器,最轻量且强大的工具是 webhook (Go 编写)。

Terminal window
1
# Ubuntu/Debian
2
sudo apt install webhook
3
# CentOS/Fedora
4
sudo dnf install webhook
Terminal window
1
# 腾讯云的OpenCloudOS需要手动安装
2
# 1. 下载最新版本 (x86_64 架构)
3
curl -L https://github.com/adnanh/webhook/releases/download/2.8.1/webhook-linux-amd64.tar.gz -o webhook.tar.gz
4
5
# 2. 解压
6
tar -xvf webhook.tar.gz
7
8
# 3. 移动到系统 bin 目录以便全局调用
9
sudo mv webhook-linux-amd64/webhook /usr/local/bin/
10
11
# 4. 清理
12
rm -rf webhook-linux-amd64 webhook.tar.gz
13
14
# 5. 验证
15
webhook --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 服务

Terminal window
1
webhook -hooks ~/hooks.json -verbose

(生产环境建议将其写成 systemd 服务在后台运行)

Terminal window
1
sudo vim /etc/systemd/system/webhook.service
1
[Unit]
2
Description=Webhook listener for GitHub Deploy
3
After=network.target
4
5
[Service]
6
Type=simple
7
# 注意:这里 -hooks 指向你存放 hooks.json 的绝对路径
8
# -verbose 参数方便你在调试时通过 journalctl 查看详细日志
9
ExecStart=/usr/local/bin/webhook -hooks /root/hooks.json -verbose -hotreload
10
Restart=always
11
RestartSec=5
12
User=root
13
# 如果你的脚本需要特定环境变量,可以在这里添加
14
# Environment=NODE_ENV=production
15
2 collapsed lines
16
[Install]
17
WantedBy=multi-user.target

配置项解释:

  • -hotreload:非常实用。开启后,你修改 hooks.json 无需重启服务,它会自动重载配置。
  • Restart=always:保证服务高可用。

启动并设置自启

Terminal window
1
# 重载系统服务配置
2
sudo systemctl daemon-reload
3
4
# 启动 webhook 并设置为开机自启
5
sudo systemctl enable --now webhook
6
7
# 检查服务状态
8
sudo systemctl status webhook

如果看到 active (running),说明服务已经稳稳地跑在后台了。

如何查看运行日志?

Terminal window
1
# 查看实时滚动日志
2
journalctl -u webhook -f

GitHub 端:配置 Webhook

  1. 进入你的 GitHub 仓库 -> Settings -> Webhooks -> Add webhook
  2. Payload URL: http://你的服务器IP:9000/hooks/redeploy-app
  3. Content type: application/json
  4. Secret: 填写你在 hooks.json 中设置的“你的Webhook密钥”。
  5. Which events: 选择 Just the push event
本文标题:Laravel 搭配 github webhook 实现自动化部署
文章作者:夜火/xloong
发布时间:2026-04-16
Copyright 2026
站点地图