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/11/9 7:47:27 阅读更多 →
MFC自定义位图按钮实现:Owner-Draw方案与状态管理详解

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

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

2026/11/10 9:31:53 阅读更多 →
19-研发安全规范:代码防泄露、密钥过滤、敏感配置隔离

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

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

2026/11/4 18:10:04 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/11/13 5:13:25 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/11/13 5:13:25 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/11/13 5:13:25 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/11/12 18:22:26 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/11/12 18:22:25 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/11/13 5:13:25 阅读更多 →

日新闻

周新闻

月新闻