当前位置: 首页 > news >正文

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-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这个“代码城堡”,去安装那个“魔法门铃”。

  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的电话被打响,智能管家接听、验签,然后,忠实地执行了那份更新、重启的行动清单。

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

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

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

http://www.dtcms.com/a/341077.html

相关文章:

  • 7.2 Linux:驱动开发——模块机制
  • 7.3 Linux:驱动开发——应用程序和驱动程序的交互
  • imx6ull-驱动开发篇30——Linux 非阻塞IO实验
  • 电商平台商品详情数据爬取教程​
  • JS原型链
  • 第10课_Rust网络编程
  • TrustZone 版的按键点灯程序下载调试 LAT1492
  • 迅为RK3562开发板Android修改uboot logo
  • element UI 和 element plus 在组件上有哪些不同
  • 《算法导论》第 35 章-近似算法
  • 《设计模式之禅》笔记摘录 - 17.模板方法模式
  • hot100 之160-相交链表(双指针切换)
  • 如何合并分卷压缩文件?两种方法让文件更整洁
  • SQL详细语法教程(七)核心优化
  • 【CocosCreator】electron/Cocos双窗口本地模拟聊天系统
  • 挑战极限:在256MB内存的机器上构建MySQL极简安装方案
  • Nginx 负载均衡和缓存配置
  • Unicode 字符串转 UTF-8 编码算法剖析
  • FPGA实现Aurora 64B66B图像视频点对点传输,基于GTH高速收发器,提供2套工程源码和技术支持
  • 科研笔记:博士论文写作攻略
  • IPSEC安全基础前篇
  • 七十三、【Linux数据库】MySQL数据库PXC 集群概述与演示
  • mvdr波束形成
  • week3-[分支结构]2023
  • STM32F407VGT6从零建立一个标准库工程模板+VSCode或Keil5
  • 【电气工程学习】
  • 可传参配置的同步异步fifo
  • PyTorch 社区贡献 和 设计原则
  • Web 安全之延迟攻击(Delay Attack)详解
  • PyCharm2025无法启动Powershell.exe的解决办法