Gitea Webhook教程:实现git push后自动部署更新网站 (CI/CD入门)
更多云服务器知识,尽在hostol.com
你是不是已经爱上了Gitea带给你的那种,对自己代码100%的掌控感和安全感?
但随着你提交代码的次数越来越多,你可能很快就发现了一个“美中不足”的、极其破坏“沉浸式开发体验”的烦人环节。
这个场景,你一定不陌生: 你在本地的编辑器里,奋笔疾书,解决掉一个Bug,或者添加了一个新功能。你心满意足地,在终端里敲下: git add .
git commit -m "完成了一个超酷的功能"
git push origin main
行云流水,一气呵成。但是,工作并没有结束!
你必须再像一个勤劳的“搬运工”一样,打开另一个终端窗口,ssh
登录到你的服务器上,找到那个深藏不露的项目目录,小心翼翼地敲下git pull
,然后再手动重启一下你的应用进程……
天啊!这感觉,就像你发明了一台全自动的“时空传送机”,但每次传送完物品后,都得自己跑去目的地签收一下快递。这种感觉,实在是太“不未来”了,对不对?
难道,就没有一种魔法,能让git push
这个动作,像推倒第一块多米-诺骨牌一样,自动地、优雅地、在几秒钟之内,触发后续所有的“服务器更新”动作吗?
有!这种魔法,不仅存在,而且实现起来,远比你想象的要简单。它的名字,叫Webhook。
“魔法门铃”:Webhook到底是什么?
在开始实战前,我们先用一个比喻,来彻底搞懂Webhook的原理。
- Gitea(你的代码城堡): 就像一栋装有“魔法门铃”的房子。
git push
动作: 就像一个访客(你),按下了这栋房子的门铃。- Webhook URL: 这是你在Gitea里设置的一个网址。它就像是你告诉门铃:“嘿,如果有人按门铃,请立刻给这个电话号码(URL),打一个电话,并告诉他‘有人来了’!”
- Webhook监听服务(我们即将创建的): 它就像一个永远守在那个“电话”旁边、随时待命的“智能管家”。
整个流程就是: 你git push
-> Gitea的“门铃”响了 -> Gitea立刻给指定的URL“打电话” -> 守在电话旁边的“智能管家”接到了电话,说:“收到!”,然后立刻按照你预设的“行动清单”,去更新网站。
看,这就是自动化的美妙之处。我们今天要做的,就是亲手打造这个“智能管家”,并教会他那套“行动清单”。
第一步:聘请“智能管家”——编写Webhook监听服务
我们的“管家”,将是一个用Node.js和Express框架编写的、极其轻巧的Web服务。它的唯一职责,就是竖起耳朵,监听来自Gitea的那个“魔法电话”。
- 在你的服务器上,找个地方安顿你的“管家”。 这个服务,不应该放在你的网站项目目录里。我们给它一个独立的家。
Bash
# 在你的用户主目录下
mkdir gitea-webhook-butler
cd gitea-webhook-butler
npm init -y
npm install express body-parser crypto child_process
2.为“管家”编写“工作守则” (server.js
)
Bash
nano server.js
将下面的代码,完整地复制进去。
JavaScript
const express = require('express');
const bodyParser = require('body-parser');
const crypto = require('crypto');
const { exec } = require('child_process');const app = express();
const PORT = 9001; // 管家接电话的“分机号”
const SECRET = 'YOUR_ULTRA_SECRET_TOKEN'; // 你和Gitea之间的“秘密暗号”
const DEPLOY_SCRIPT_PATH = '/home/myadmin/deploy_scripts/deploy.sh'; // 管家的“行动清单”存放位置app.use(bodyParser.json());app.post('/webhook', (req, res) => {// --- 安全第一步:验证“暗号” ---const signature = req.headers['x-gitea-signature'];const hmac = crypto.createHmac('sha256', SECRET);const expectedSignature = hmac.update(JSON.stringify(req.body)).digest('hex');if (signature !== expectedSignature) {console.error('无效的签名! Invalid signature!');return res.status(401).send('Invalid signature.');}console.log('签名验证成功! Signature verified.');// --- 检查是否是推送到主分支 ---if (req.body.ref === 'refs/heads/main') {console.log('接收到主分支(main)的push事件,开始执行部署脚本...');exec(`sh ${DEPLOY_SCRIPT_PATH}`, (error, stdout, stderr) => {if (error) {console.error(`执行部署脚本出错: ${error}`);return res.status(500).send('Deployment script failed.');}console.log(`部署脚本输出: ${stdout}`);console.error(`部署脚本错误输出: ${stderr}`);res.status(200).send('Deployment initiated successfully.');});} else {res.status(200).send('Push event received, but not for the main branch. No action taken.');}
});app.listen(PORT, () => {console.log(`智能管家已上岗,正在监听 ${PORT} 端口...`);
});
- 代码解读:
SECRET
: 这是我们和Gitea之间约定的“秘密暗号”。Gitea在“打电话”时,会用这个暗号,对通话内容进行一次加密签名。我们的管家在接到电话后,会用同样的暗号,进行一次验签。只有签名对得上,才确认是“自己人”,才会执行后续动作。这能防止任何路人甲乙丙丁,都能来触发我们的自动部署。请务必把它换成一个你自己才知道的、足够复杂的字符串!DEPLOY_SCRIPT_PATH
: 这是我们管家的“行动清单”文件的存放位置,我们稍后就去创建它。- 核心逻辑就是:验证暗号 -> 检查是不是推送到
main
主分支 -> 执行部署脚本。
第二步:撰写“行动清单”——deploy.sh
部署脚本
现在,我们来为“管家”撰写那份具体的“行动清单”。
Bash
mkdir -p /home/myadmin/deploy_scripts
nano /home/myadmin/deploy_scripts/deploy.sh
写入以下内容(请根据你自己的项目情况进行修改!):
Bash
#!/bin/bash# =======================================================
# 网站自动部署行动清单
# =======================================================# 1. 进入你的网站项目目录
cd /var/www/my-awesome-app || exit# 2. 从Gitea拉取最新的代码
git pull origin main# 3. (可选) 如果是Node.js项目,安装新的依赖
# npm install# 4. (可选) 如果需要编译,执行编译命令
# npm run build# 5. 重启你的应用
# 这里我们假设你用pm2来管理你的Node.js应用
pm2 restart my-app-nameecho "部署完成于: $(date)"
重要提示:
- 我们在这里引入了一个管理Node.js应用的“神器”——
pm2
。它可以守护你的应用进程,让它在崩溃后自动重启。你需要先在服务器上安装它 (sudo npm install pm2 -g
),并用pm2 start your_app.js --name my-app-name
来启动你的应用。 - 给这个脚本加上可执行权限:
chmod +x /home/myadmin/deploy_scripts/deploy.sh
。
第三步:连接“魔法门铃”——在Gitea里配置Webhook
好了,管家和行动清单都已就位。现在,我们回到Gitea这个“代码城堡”,去安装那个“魔法门铃”。
- 登录你的Gitea,进入你的代码仓库页面。
- 点击右上角的“设置”,然后选择左侧菜单的“Webhook”。
- 点击“添加Webhook”,选择“Gitea”。
- 填写配置:
- 目标URL:
http://127.0.0.1:9001/webhook
。注意! 这里我们用127.0.0.1
而不是公网IP,因为Gitea和我们的管家服务,是运行在同一台服务器上的,走内网通信最快也最安全。9001
就是我们管家监听的那个“分机号”。 - HTTP方法:
POST
。 - 触发事件: 选择“推送事件”。
- 密钥: 把你在
server.js
里设置的那个YOUR_ULTRA_SECRET_TOKEN
,原封不动地,粘贴到这里。
- 目标URL:
- 点击“添加Webhook”。
创建好之后,你可以点击“测试推送”按钮。如果一切正常,你的Webhook旁边会出现一个绿色的小勾。同时,你的“管家”服务,应该也打印出了一堆日志。
第四步:让“管家”7x24小时上岗
我们的管家服务,现在还只是在前台运行。我们需要让他进入后台,7x24小时不眠不休地工作。这里,我们再次请出pm2
。
Bash
# 在你的gitea-webhook-butler目录下
pm2 start server.js --name gitea-butler
pm2 save # 保存进程列表,确保服务器重启后,管家也会自动上岗
pm2 startup # 生成开机自启脚本
见证,那解放双手的“魔法时刻”
好了,所有的多米诺骨牌,都已精确地摆放到位。
现在,深呼吸。
去你本地的代码编辑器,打开你的项目,随便修改一行文字,比如把Hello from the Backend!
改成Hello from Automated Deployment!
。
然后,在你本地的终端里,像往常一样,敲下那三句你已经敲了无数遍的命令:
Bash
git add .
git commit -m "My first automated deploy!"
git push origin main
这一次,在你按下回车键的那一刻
,请静静地体会。
你推倒的,不再只是一行代码,而是一整套多米诺骨牌的第一张。Gitea的门铃被触发,Webhook的电话被打响,智能管家接听、验签,然后,忠实地执行了那份更新、重启的行动清单。
几秒钟后,你再去刷新你的网站,你会发现,页面上的内容,已经奇迹般地,变成了你刚刚修改的样子。
你,已经从一个“代码的生产者”,进化成了一个“生产流程的设计师”。你不仅在创造,更在创造“创造本身”的效率。
这,就是自动化的真正魅力。