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的那个"魔法电话"。

  1. 在你的服务器上,找个地方安顿你的"管家"。 这个服务,不应该放在你的网站项目目录里。我们给它一个独立的家。

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} 端口...`);
});
  1. 代码解读:
    • 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-name

echo "部署完成于: $(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这个"代码城堡",去安装那个"魔法门铃"。

  1. 登录你的Gitea,进入你的代码仓库页面。
  2. 点击右上角的"设置 ",然后选择左侧菜单的"Webhook"。
  3. 点击"添加Webhook ",选择"Gitea"。
  4. 填写配置:
    • 目标URL: http://127.0.0.1:9001/webhook注意! 这里我们用127.0.0.1而不是公网IP,因为Gitea和我们的管家服务,是运行在同一台服务器上的,走内网通信最快也最安全。9001就是我们管家监听的那个"分机号"。
    • HTTP方法: POST
    • 触发事件: 选择"推送事件"。
    • 密钥: 把你在server.js里设置的那个YOUR_ULTRA_SECRET_TOKEN,原封不动地,粘贴到这里。
  5. 点击"添加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的电话被打响,智能管家接听、验签,然后,忠实地执行了那份更新、重启的行动清单。

几秒钟后,你再去刷新你的网站,你会发现,页面上的内容,已经奇迹般地,变成了你刚刚修改的样子。

你,已经从一个"代码的生产者",进化成了一个"生产流程的设计师"。你不仅在创造,更在创造"创造本身"的效率。

这,就是自动化的真正魅力。

相关推荐
Nejosi_念旧26 分钟前
git报错解决:ssh: connect to host github.com port 22: Connection refused
git·ssh·github
你的人类朋友1 小时前
说说git的变基
前端·git·后端
程序设计实验室2 小时前
在Windows上将git与ssh-agent搭配使用,再也不用输入git密码了
windows·git
兔老大RabbitMQ3 小时前
git pull origin master失败
java·开发语言·git
码农小白-RMS11 小时前
cursor-执行git指令(vscode同理)
git
爱喝矿泉水的猛男13 小时前
Git Commit 提交信息标准格式
git·commit
℘团子এ13 小时前
git中,将新项目推送到新建的远程仓库
git
gitboyzcf14 小时前
Git 常用命令
前端·git·后端
哈里谢顿14 小时前
Git 最实用的四个还原命令详解
git