20-无人售货柜项目完整版本迭代实战:从开发、测试、灰度、量产全流程
20-无人售货柜项目完整版本迭代实战从开发、测试、灰度、量产全流程前言大家好我是黒漂技术佬。前面 16 篇文章我们从 Git 分支模型讲到 CI/CD、代码规范、安全审计几乎把版本管理和 DevOps 的工具链都翻了一遍。这篇是整个系列的收官之作——我们把所有知识串起来用一个真实的无人售货柜项目迭代走一遍从需求到量产的完整流程。一、项目背景一次典型的版本迭代迭代目标在售货柜上新增AI 视觉识别取货功能——用户打开柜门后任意取走商品摄像头自动识别拿走了什么自动结算。涉及的三端端技术栈仓库版本号后端微服务Java SpringBoot K8svending-backendv2.4.0安卓固件Android NDK(C) 瑞芯微 SDKvending-firmwarev3.1.0小程序UniApp Vue3vending-miniappv2.4.0团队编制后端 2 人、安卓 2 人、算法 1 人、前端 1 人、测试 1 人、产品 1 人。总计 8 人。二、Phase 1需求评审 → 建立分支体系2.1 需求评审D-14 ~ D-10产品经理输出 PRD产品需求文档核心功能点拆解特性AI 视觉识别结算 子任务拆分 [后端] 新增识别结果处理接口对接视觉算法服务 [后端] 支付模块改造支持先拿后付模式 [固件] 摄像头实时采集与图片上传 [固件] 柜门状态检测开门时触发采集关门时触发结算 [算法] 模型升级轻量化 YOLOv8 部署到瑞芯微 NPU [前端] 新增取货结算中加载动画 [前端] 结算结果展示页拿走了什么、多少钱2.2 创建分支D-10评审通过后各端从develop拉出 feature 分支# 后端gitcheckout-bfeature/ai-vision-recognition develop# 固件gitcheckout-bfeature/ai-camera-collection develop# 前端gitcheckout-bfeature/ai-settlement-ui develop关键分支命名统一规范feature/功能模块-简短描述所有 team member 一眼能看出这条分支是干什么的。三、Phase 2并行开发D-10 ~ D-110 个工作日3.1 后端开发要点// 识别结果处理微服务核心代码结构RestControllerRequestMapping(/api/v2/vision)publicclassVisionRecognitionController{PostMapping(/recognize)publicResultRecognitionResponserecognize(RequestBodyRecognitionRequestreq){// 1. 接收图片 URL调用 YOLO 推理服务ListDetectedItemitemsvisionService.detect(req.getImageUrl());// 2. 匹配 SKU 数据库获取商品信息与价格ListSkuItemresultsskuService.matchItems(items,req.getDeviceId());// 3. 创建待结算订单先拿后付模式PendingOrderorderorderService.createUnpaidOrder(results,req.getDeviceId());returnResult.success(RecognitionResponse.from(order));}}3.2 固件开发要点安卓端用 JNI 调用 C 层的摄像头采集// native_camera.cpp —— 摄像头采集核心逻辑externCJNIEXPORT jstring JNICALLJava_com_vending_camera_CameraManager_captureAndUpload(JNIEnv*env,jobject thiz){// 1. 从 /dev/video0 采集一帧原始图像cv::Mat framecaptureFrame(0,640,480);// 2. 瑞芯威 NPU 上运行轻量分类模型判断柜内是否有手/有人boolhasInteractionrknnInference(frame);// 3. 如果有交互编码为JPEG上传到OSSif(hasInteraction){std::vectorucharjpegencodeToJpeg(frame,85);returnuploadToOss(jpeg);// 返回图片URL}returnenv-NewStringUTF();}3.3 每日提交规范每个 feature 分支每天至少提交一次甚至多次遵循 Conventional Commitsgitcommit-mfeat(vision): 实现YOLO识别结果与SKU数据库的匹配逻辑 - 新增 SkuMatcher 类基于置信度阈值(0.6)过滤误检 - 支持条码商品与散装称重商品两种匹配模式 - 匹配失败时返回默认兜底商品 Refs: #5201为什么强调每天提交小步提交的好处减少 merge 冲突的概率出了问题容易定位Code Review 时 Review 的是增量而非一大坨四、Phase 3联调与测试D0 ~ D34.1 提 Merge Request各端开发完成后提交 MR 合并到developMR 标题: feat: AI视觉识别结算功能 源分支: feature/ai-vision-recognition 目标分支: develop MR 描述模板: ## 变更概述 - 新增识别结果处理微服务接口 - 支付模块改造支持先拿后付 - 新增摄像头采集与上传模块 ## 测试计划 - [ ] 单元测试覆盖率 80% - [ ] 接口自动化测试通过 - [ ] 联调测试后端 固件 算法 ## 影响范围 - 支付模块有 Breaking Change: /api/v1/pay/confirm → /api/v2/pay/confirm4.2 Code Review CI 校验MR 触发 CI 流水线自动执行stages:-lint-test-security-buildlint:stage:lintscript:-mvn checkstyle:check# Java代码规范-npx eslint src/# 前端代码规范test:stage:testscript:-mvn test# 单元测试-mvn verify# 集成测试security:stage:securityscript:-trufflehog git file://.--since-commit HEAD~20--fail-mvn dependency-check:check# 依赖漏洞扫描build:stage:buildscript:-mvn package-DskipTests-docker build-t registry.example.com/vending-backend:2.4.0-rc1 .-docker push registry.example.com/vending-backend:2.4.0-rc14.3 联调踩坑联调阶段发现的典型问题问题 1算法模型在 PC 上跑 50ms部署到瑞芯微 NPU 上跑 300ms。排查后发现 NPU 推理前需要先做 INT8 量化直接用 FP32 跑会退回到 CPU 推理。解决增加一条 CI 任务自动将 PyTorch 模型转为 RKNN 格式并量化。问题 2后端接口返回字段名totalAmount前端写成了total_amountJSON 反序列化失败。解决统一接口契约用 Swagger 文档同步三端。五、Phase 4灰度发布D4 ~ D65.1 灰度策略设计灰度不是随便找几台机器试试而是有层次有策略的渐进式发布灰度阶段 1D410%2台线下测试柜 3台低流量门店柜 观察指标识别准确率 95%、结算时间 3秒、无异常扣款 灰度阶段 2D530%扩展至 20 台覆盖不同光照环境商场/写字楼/学校 观察指标不同场景识别率差异 3%、投诉率无明显上升 灰度阶段 3D660%扩展至 50 台 观察指标系统稳定性、丢单率、运维告警频率 全量D7100%全量推送剩余 80 台5.2 K8s 灰度部署后端服务用 K8s 的 Canary 发布策略# 稳定版本90% 流量apiVersion:apps/v1kind:Deploymentmetadata:name:vending-backend-stablespec:replicas:9template:spec:containers:-name:backendimage:vending-backend:2.3.2---# 灰度版本10% 流量apiVersion:apps/v1kind:Deploymentmetadata:name:vending-backend-canaryspec:replicas:1template:spec:containers:-name:backendimage:vending-backend:2.4.0-rc1通过 Service 的标签选择器加权路由Ingress Nginx Canary将 10% 流量导入灰度实例。5.3 固件灰度固件 OTA 平台按设备 ID 控制推送范围# OTA 管理后台调用curl-XPOST http://ota-server/api/campaign/create\-d{ version: 3.1.0, devices: [VM-001, VM-002, VM-010, VM-020, VM-030], release_note: AI视觉识别功能灰度测试, max_retry: 3 }六、Phase 5全量发布与版本管理收尾D76.1 合并到 master 并打 Tag灰度验证通过后将 develop 合并到 mastergitcheckout mastergitmerge --no-ff developgittag-av2.4.0-mfeat: AI视觉识别结算功能正式发布 新增 - YOLOv8 轻量化模型部署到瑞芯微 NPU - 先拿后付结算模式 - 低光照自动补光扫码 修复 - 电磁锁 SPI 通信超时问题 - 弱网环境支付重复扣款 发布范围全量 80 台售货柜gitpush origin master--tags6.2 三端版本对齐端版本号Tag部署方式后端v2.4.0v2.4.0K8s Deployment 滚动更新固件v3.1.0v3.1.0OTA 平台分批推送小程序v2.4.0v2.4.0微信审核后全量发布6.3 自动生成发布说明# CI 自动执行从上一个版本到当前版本的所有变化npx standard-version# 结果输出在 CHANGELOG.md 中# ## [2.4.0] - 2024-06-20# ### Features# * **vision**: AI视觉识别结算功能 (#5201)# * **scan**: 低光照自动补光 (#4892)# ...6.4 归档与文档更新版本发布后在项目 Wiki 中更新接口文档更新Swagger 自动同步运维手册更新新增识别服务的监控项和告警阈值用户文档更新小程序使用指南七、完整流程串联一张图看懂全流程需求评审 → 分支创建 → 开发提交 → MR CI校验 ↓ ↓ ↓ ↓ PRD feature/* 每天commit lint/test/security ↓ ↓ 10天开发 Code Review ↓ ↓ 联调测试 → 灰度发布 → 全量发布 → 版本归档 ↓ ↓ ↓ ↓ develop 10%→30%→ merge to CHANGELOG 集成测试 60%→100% master wiki 关键检查点 [D-14] 需求评审完成 [D-10] 分支创建 任务分包 [D-1] 功能开发完成MR 提交 [D3] 联调测试通过 [D6] 灰度验证通过 [D7] 全量发布 版本归档八、系列总结版本管理与 DevOps 的关键认知这个系列从第 1 篇到第 20 篇我们覆盖了Git 分支模型GitFlow、分支命名、合并策略commit 规范Conventional Commits、小步提交CI/CD 流水线代码检查、自动测试、自动构建容器化部署Docker 化、K8s 部署、灰度与回滚热修复流程紧急分支、双向合并、快速回退版本日志CHANGELOG 自动化、版本追溯安全规范密钥管理、代码扫描、配置隔离但工具只是手段真正重要的是团队建立起版本管理的纪律不在 master 上直接改代码哪怕只改一行提交信息写出做了什么、为什么不是fix bug合并前过 CI Code Review哪怕只改了一个配置文件线上变更可回滚哪怕这次肯定没问题每一次发布都有据可查CHANGELOG 不是装饰品这些纪律不是束缚而是在保护团队——保护你在出问题时能快速定位、在扩容时能平滑扩展、在交接时能无痛过渡。全文完。感谢阅读这个系列我们下个系列见。

相关新闻

GenericAgent游戏辅助:7大核心工具打造自动化任务与策略优化终极方案

GenericAgent游戏辅助:7大核心工具打造自动化任务与策略优化终极方案

GenericAgent游戏辅助:7大核心工具打造自动化任务与策略优化终极方案 【免费下载链接】GenericAgent Self-evolving agent: grows skill tree from 3.3K-line seed, achieving full system control with 6x less token consumption 项目地址: https://gitcode.com…

2026/8/12 22:05:40 阅读更多 →
MFC自定义位图按钮实现:Owner-Draw方案与状态管理详解

MFC自定义位图按钮实现:Owner-Draw方案与状态管理详解

1. 项目概述 在Windows桌面应用开发中,尤其是使用经典的MFC框架时,界面美观度一直是开发者需要面对的挑战。系统自带的按钮控件样式单一,往往与追求专业、现代化视觉效果的软件格格不入。这时,自定义按钮,特别是使用位…

2026/8/12 22:05:40 阅读更多 →
19-研发安全规范:代码防泄露、密钥过滤、敏感配置隔离

19-研发安全规范:代码防泄露、密钥过滤、敏感配置隔离

19-研发安全规范:代码防泄露、密钥过滤、敏感配置隔离 前言 大家好,我是黒漂技术佬。 先讲个真实的故事:某团队在 GitHub 上开源了一个 Demo 项目,顺手把生产环境的数据库密码也传上去了。第二天,数据库被清了&#xf…

2026/8/12 22:05:40 阅读更多 →

最新新闻

MCP协议与LangChain集成:构建跨进程调用的AI Agent能力联邦

MCP协议与LangChain集成:构建跨进程调用的AI Agent能力联邦

1. 从“语言孤岛”到“能力联邦”:为什么我们需要跨进程调用?如果你最近在折腾AI Agent,尤其是用LangChain这类框架,大概率会遇到一个让人头疼的瓶颈:你的Agent被“锁死”了。它可能是一个用Python写得飞起的智能体&am…

2026/8/12 22:53:19 阅读更多 →
OpenCore Legacy Patcher技术解析:老旧Mac硬件兼容性修复与现代化升级方案

OpenCore Legacy Patcher技术解析:老旧Mac硬件兼容性修复与现代化升级方案

OpenCore Legacy Patcher技术解析:老旧Mac硬件兼容性修复与现代化升级方案 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher OpenCore Legacy Patch…

2026/8/12 22:53:19 阅读更多 →
Excel数据透视表:从零到精通的动态数据分析与决策指南

Excel数据透视表:从零到精通的动态数据分析与决策指南

1. 从“数据泥潭”到“决策利器”:为什么你离不开数据透视表 如果你每天的工作都离不开Excel,并且经常需要处理一堆看起来杂乱无章、但又必须从中提炼出关键信息的表格,那么你大概率已经受够了反复使用 SUMIFS 、 COUNTIFS 和 VLOOKUP …

2026/8/12 22:53:19 阅读更多 →
动态规划与离散化:解决LeetCode 1626双约束优化问题

动态规划与离散化:解决LeetCode 1626双约束优化问题

1. 项目概述:从一道“棘手”的面试题说起 最近在带团队刷题和准备技术面试时,LeetCode 1626 “无矛盾的最佳球队”这道题反复被提及。很多有经验的C开发者初次接触时,也会觉得它比普通的动态规划(DP)问题要“绕”一些。…

2026/8/12 22:53:19 阅读更多 →
API额度周期管理实战:从监控预警到智能优化策略

API额度周期管理实战:从监控预警到智能优化策略

最近在对接一些大模型 API 时,你是否也遇到过调用额度限制的困扰?特别是当项目进入关键开发或测试阶段,额度突然耗尽,只能等待下一个计费周期重置,非常影响进度。本文将围绕一个常见的开发者场景——“如何有效管理和利…

2026/8/12 22:53:18 阅读更多 →
比千万人被优化更恐怖的,是全民默认“优化天经地义“

比千万人被优化更恐怖的,是全民默认“优化天经地义“

一、制定优化名单的人:只算账本,不算人心 手握优化权限的决策者,早已彻底活在单一的效率逻辑里。他们看报表、算人力成本、对比投入产出,每个人在他们眼中只是一串薪资数字、一组KPI数据。在这套核算体系中,中年员工薪…

2026/8/12 22:52:17 阅读更多 →

日新闻

Ubuntu 22.04安装与使用tree命令:高效管理Linux目录结构

Ubuntu 22.04安装与使用tree命令:高效管理Linux目录结构

1. 为什么需要一个“目录树”工具?在Linux世界里,尤其是Ubuntu这样的发行版,命令行是很多人的主战场。我们每天都要和文件、目录打交道。ls命令是查看目录内容的首选,它简洁、高效,能列出文件名、权限、大小等关键信息…

2026/8/12 9:33:34 阅读更多 →
博思AI智能体:意图识别、思考链与性能优化的工程实践

博思AI智能体:意图识别、思考链与性能优化的工程实践

在AI应用从“能用”走向“好用”的进程中,系统的响应速度、决策透明度与高并发稳定性是决定用户体验的关键。博思AI智能体近期完成了一次重要的专项优化,聚焦于意图识别、思考链展示与全链路压测三大核心领域,将系统从功能实现推向了工程卓越…

2026/8/12 9:33:34 阅读更多 →
子代理架构:AI智能体任务分解与协同执行的核心原理与实践

子代理架构:AI智能体任务分解与协同执行的核心原理与实践

1. 项目概述:为什么我们需要“子代理”?最近在折腾各种AI应用和自动化流程时,我越来越频繁地遇到一个瓶颈:单个AI智能体(Agent)的能力边界。无论是处理复杂的多步骤任务,还是需要同时调用多个专…

2026/8/12 9:33:34 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/12 1:11:09 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/12 1:11:09 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/12 1:11:08 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/11 17:09:45 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/12 1:11:10 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/11 17:09:45 阅读更多 →