Gitee WebHook 实现个人项目自动部署:从手动 scp 到 “push 即部署“ 全流程实录(含 8 个坑)

发布时间:2026/8/27 7:57:37

Gitee WebHook 实现个人项目自动部署:从手动 scp 到 “push 即部署“ 全流程实录(含 8 个坑)
个人项目TypeScript Node Docker部署在阿里云 ECS每次更新都要ssh上去git pulldocker compose build手都拉出茧了。于是折腾了一套 “push 即部署”把过程和踩过的坑记下来给同样被手动部署折磨的朋友一个参考。一、先搞清楚CI/CD 到底是什么概念含义本次做到了吗CI持续集成每次提交自动构建、测试、静态检查部分有构建没跑测试CD持续部署代码通过检查后自动发布到生产环境做到了git push即部署触发方式WebHook实时/ 轮询有延迟/ 定时WebHook 实时触发严格说本次搭的是一个“极简 CD”没有独立的 CI 流水线靠 Git 平台的 WebHook 事件通知触发服务器端构建。对个人项目完全够用也是学习 CI/CD 最直观的入门路径。二、方案选型为什么是 Gitee WebHooks方案原理优点缺点GitHub Actions SSHpush 触发云端流水线SSH 到服务器执行部署生态大、可视化国内访问不稳本方案最初选的它最后弃用Gitee WebHooks本次采用push 时 Gitee 发 HTTP 通知到服务器服务器执行部署国内快、零门槛、实时要自己写接收端几十行 Python 搞定cron 轮询服务器定时git fetch比对零组件、最稳最长延迟 N 分钟非实时核心思路构建放在服务器上做个人 2C2G 小机器 swap 扛得住Gitee 只扮演触发源。这样省掉了镜像仓库、云端 runner 等一堆组件。三、架构总览校验 Tokengit fetch reset --hard本地 git pushGitee WebHookwebhook_server.py :9000deploy.shDocker 容器重建组件技术职责触发源Gitee WebHookpush 时 POST 到服务器带X-Gitee-Token签名头接收端webhook_server.pyPython 标准库零依赖校验 Token / 事件类型后台执行部署脚本执行器deploy.shgit fetch reset --hard origin/main→docker compose up -d --build宿主systemdUseradmin开机自启、崩溃自拉、日志统一审计/var/log/webhook-deploy.log每次部署全过程的输出四、实施步骤可直接抄1. 服务器项目目录 git 化# 服务器上假设项目在 /opt/navigate此前是 tar 包部署cd/opt/navigatecp.env.prod /tmp/.env.prod.bak# 先备份密钥文件sudochown-Radmin:admin /opt/navigate# 目录归属当前部署用户关键gitinitgitremoteaddorigin gitgitee.com:你的账号/你的仓库.gitgitfetch origingitreset--hardorigin/main# 工作区与远端完全一致cp/tmp/.env.prod.bak .env.prodchmod600.env.prod服务器拉代码用 SSH 密钥ssh-keygen -t ed25519生成后公钥加到 Gitee → 设置 → SSH 公钥再ssh-keyscan gitee.com ~/.ssh/known_hosts预存指纹。2. 部署脚本deploy.sh#!/bin/bashset-euopipefailexportGIT_SSH_COMMANDssh -o StrictHostKeyCheckingaccept-newcd/opt/navigateecho git sync ($(date%F %T))gitfetch origingitreset--hardorigin/main# 服务器是纯跟随角色硬对齐远端echo rebuild restart containersdockercompose --env-file .env.prod-fdocker-compose.prod.yml up-d--buildecho container statusdockercompose --env-file .env.prod-fdocker-compose.prod.ymlps3. webhook 接收端webhook_server.pyPython 标准库40 行importargparse,hmac,logging,socketserver,subprocess,threading,timefromhttp.serverimportBaseHTTPRequestHandler,HTTPServer# Python 3.7 才内置 ThreadingHTTPServer这里兼容 3.6 旧系统classThreadingHTTPServer(socketserver.ThreadingMixIn,HTTPServer):daemon_threadsTrueDEPLOY_SCRIPT/opt/navigate/scripts/deploy.shLOG_FILE/var/log/webhook-deploy.logclassHandler(BaseHTTPRequestHandler):secretdefdo_POST(self):ifself.path!/hooks/deploy:self.send_error(404);returntokenself.headers.get(X-Gitee-Token,)ifnothmac.compare_digest(token,self.secret):logging.warning(reject: bad token from %s,self.client_address[0])self.send_error(401);returnifself.headers.get(X-Gitee-Event,)!Push Hook:self.send_error(400);returnthreading.Thread(targetself._run_deploy,daemonTrue).start()self.send_response(200)self.end_headers()self.wfile.write(b{status:deploy started})def_run_deploy(self):try:withopen(LOG_FILE,a,encodingutf-8)asf:f.write(\n deploy triggered %s \n%time.strftime(%F %T))subprocess.run([bash,DEPLOY_SCRIPT],stdoutf,stderrsubprocess.STDOUT)f.write( done %s \n%time.strftime(%F %T))exceptExceptionase:withopen(LOG_FILE,a,encodingutf-8)asf:f.write( ERROR: %s \n%e)if__name____main__:apargparse.ArgumentParser()ap.add_argument(--port,typeint,default9000)ap.add_argument(--secret,requiredTrue)argsap.parse_args()Handler.secretargs.secret logging.basicConfig(levellogging.INFO,format%(asctime)s %(message)s)ThreadingHTTPServer((0.0.0.0,args.port),Handler).serve_forever()4. systemd 托管开机自启 崩溃自拉# /etc/systemd/system/webhook.service [Unit] DescriptionGitee WebHook receiver (python) Afternetwork.target docker.service [Service] Typesimple Useradmin # 与仓库属主一致避开 git 权限坑 ExecStart/usr/bin/python3 /opt/navigate/scripts/webhook_server.py --port 9000 --secret 你的密码 Restartalways RestartSec3 [Install] WantedBymulti-user.targetsudosystemctl daemon-reloadsudosystemctlenable--nowwebhooksudosystemctl status webhook5. 放行端口阿里云安全组ECS 控制台 → 实例 → 安全组 → 入方向TCP 9000源0.0.0.0/0系统防火墙若开启sudo firewall-cmd --permanent --add-port9000/tcp sudo firewall-cmd --reload6. Gitee 配置 WebHook仓库 → 管理 → WebHooks 管理 → 添加字段值URLhttp://服务器公网IP:9000/hooks/deploy密码与 systemd 里--secret完全一致事件勾选 Push7. 端到端验证# 本地gitpush gitee main# 服务器tail-n40/var/log/webhook-deploy.log# 看到 triggered → git sync → rebuild → done五、踩坑实录重点8 个坑#坑现象原因解决1下载静默失败curl -sL下载 GitHub 二进制mv报文件不存在国内网络拿到的是错误页-sL静默模式不报错弃用 GitHub 下载改 Python 标准库零依赖方案2checkout 权限拒绝git checkout报Permission deniedtar 部署遗留文件属主是 root当前用户无写目录权限sudo chown -R admin:admin /opt/navigate一劳永逸3Python 版本太老ImportError: cannot import name ThreadingHTTPServerCentOS 7 自带 Python 3.6该类 3.7 才有用ThreadingMixIn HTTPServer自定义兼容类4git 拒绝操作fatal: detected dubious ownershipsystemd 默认 root 跑仓库属主却是 adminsystemd 加Useradmin身份统一5公网超时本机127.0.0.1通公网 IPConnection timed out阿里云安全组默认 DROP静默丢包控制台放行 9000本地测公网 IP才验得了链路6永远无法快进Not possible to fast-forward远端 main 被 force push 重写本地分叉服务器改为git fetch reset --hard纯跟随角色7脚本突然不可执行触发后无任何输出reset --hard会把执行位重写为 644接收端用[bash, script]显式执行不依赖执行位8静默失败日志只有deploy triggered没下文子进程异常被线程吞掉加 try/except任何错误写进日志六、日常使用gitpush gitee main# 部署tail-n40/var/log/webhook-deploy.log# 查部署日志七、写在最后三条可迁移的经验身份一致 权限修补服务器上谁来跑systemd User、文件归谁chown、密钥归谁SSH key三件事对齐能省掉大半权限报错。错误要可见自动化链路每一环都要留日志systemd journald 部署日志文件没反应比报错难查十倍。网络排障有顺序本机 → 公网 IP → 云安全组 → 系统防火墙一层层测timed out几乎都是安全组 DROPrefused才是服务没起。如果对你有帮助欢迎点赞收藏。有问题评论区见。

相关新闻

双足人形机器人一体化大脑:从实验室到工程化落地

双足人形机器人一体化大脑:从实验室到工程化落地

2026/8/27 7:57:37

几个月前,一个做具身智能的朋友发来一段视频:实验室里的双足人形机器人,在走廊上来回走了两三分钟,中途遇到一个纸箱,自己停下来绕了过去,然后又按指令走进一个房间。视频不长,但团队里几个人对…

AI编程深度解读:Claude Code登顶,Cursor意外下滑,90%开发者已离不开Agent

AI编程深度解读:Claude Code登顶,Cursor意外下滑,90%开发者已离不开Agent

2026/8/27 7:57:37

📋 目录 一、引言:AI编程进入新阶段 二、核心数据解读 三、深度分析:数据背后的范式转移 四、实践建议:如何选择AI编程工具 五、开源项目实战:OpenCode入门指南 六、结论与展望 参考资料 一、引言:A…

宇树与智元对比:从运动控制到具身智能的完整开发路线

宇树与智元对比:从运动控制到具身智能的完整开发路线

2026/8/27 7:57:37

当具身智能成为技术圈最热的话题之后,很多开发者都面临同一个问题:想入门机器人开发,到底应该从哪个平台开始?宇树科技以四足机器人起家,硬件和运动控制能力非常扎实;智元机器人则从发布开源数据集 AgiBot …

数学建模实战:基于Matlab的垃圾收运路径优化算法与应用

数学建模实战:基于Matlab的垃圾收运路径优化算法与应用

2026/8/27 8:47:39

1. 从垃圾围城到数学方程:一个建模者的实战视角 如果你问我,数学建模离我们有多远?我会说,它可能就在你家楼下的垃圾桶里。这不是一句玩笑话。作为一名在数学建模竞赛里摸爬滚打多年,也参与过一些实际市政咨询项目的“…

Java IDEA - 各种快捷键设置汇总(提高工具使用效率)

Java IDEA - 各种快捷键设置汇总(提高工具使用效率)

2026/8/27 8:47:39

目录 (速查快捷键,点击标题则跳转到对应快捷键的设置)(不断更新中,需要的可以收藏) 一、序列化Serializable设置 (光标放在类上 -> alt enter即可) 二、回退/前进 到上一个查看的类 /…

数学建模聚类算法实战:从K-Means到DBSCAN的思维转换与应用

数学建模聚类算法实战:从K-Means到DBSCAN的思维转换与应用

2026/8/27 8:47:39

1. 从“分类”到“聚类”:数学建模中一个根本性的思维转换 如果你参加过数学建模比赛,或者正在准备,大概率听过“聚类算法”这个词。很多新手拿到一个涉及数据分组的题目,第一反应是去找“标准答案”——比如,题目里给…

Codex实战指南:从环境配置到开发工作流落地

Codex实战指南:从环境配置到开发工作流落地

2026/8/27 8:47:39

我第一次打开 Codex 时,心里想的还是“聊天窗口里写代码”那套老经验。后来发现,Codex 的工作方式完全是另一个路径:它不只是给出代码建议,而是会自己读文件、跑命令、看报错、然后继续改。这个区别,决定了你接下来的所…

ContextMenuMgr Plus:Windows右键菜单清理与防护实战

ContextMenuMgr Plus:Windows右键菜单清理与防护实战

2026/8/27 8:47:39

这次我们来看一个 GitHub 上关注度比较高的开源 Windows 工具:ContextMenuMgr Plus。它的定位很直接:管理 Windows 右键菜单。很多人电脑用久了之后,右键菜单会变得特别长,打开文件资源管理器都变卡,还时不时冒出来一些…

Hugging Face 是什么?-Day29

Hugging Face 是什么?-Day29

2026/8/27 8:37:39

关键词:Hugging Face, AI Hub, Transformers, 开源模型, 机器学习平台一、Hugging Face 是什么? Hugging Face(https://huggingface.co) 是全球最大的开源人工智能社区与模型托管平台,被誉为 “AI 领域的 GitHub”。它…

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

2026/8/26 1:50:39

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

2026/8/27 7:25:23

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

2026/8/26 17:50:58

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

Go语言构建企业级AI服务网关:统一管理英伟达等AI接口调用

Go语言构建企业级AI服务网关:统一管理英伟达等AI接口调用

2026/8/27 0:07:12

1. 项目概述:从零构建一个企业级的AI服务网关 最近在帮一个做内容审核的团队做技术架构升级,他们原来的业务里,每天有几十万张图片和短视频需要过审,最初是接了几个开源的AI模型自己部署,但效果和性能一直不太稳定。后…

LeetCode Hot100(51-60)算法精解与面试技巧

LeetCode Hot100(51-60)算法精解与面试技巧

2026/8/27 0:07:12

1. 题目背景与核心价值"hot100(51-60)"这个标题看起来像是某个编程题库或算法练习集中的一组题目编号。在技术社区中,类似命名通常指向LeetCode、牛客网等平台的热门题目集合。作为刷过300题的算法老手,我理解这类题目的核心价值在于&#xff…

CRC校验实战:从模2除法到HJ212协议排错

CRC校验实战:从模2除法到HJ212协议排错

2026/8/27 0:07:12

1. 为什么一个“校验码”能扛住工业现场90%的数据 corruption? 你有没有遇到过这样的场景:嵌入式设备通过RS-485上传温湿度数据,上位机偶尔收到一帧乱码——温度显示成-273℃,湿度跳到999%,但串口波形看起来完全正常&a…

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/22 2:02:26

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/26 18:07:30

2026年真正好用的AI论文工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/26 17:57:52

告别游戏崩溃:XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…