Contributing Guide (Jingyun Center Backend)
本指南是后端工程规范与协作流程的落地文档,适用于本仓库(Go/Kratos/Ent/protobuf 微服务架构)。请在提交代码前通读本文,并按文档要求执行本地校验。
目录:
- 一、总体要求
- 二、开发环境与依赖
- 三、分支模型与提交规范
- 四、代码风格与静态检查
- 五、测试规范与覆盖率门禁
- 六、API/IDL 与代码生成
- 七、数据层与数据库规范(Ent/SQL)
- 八、消息队列与异步
- 九、安全与合规
- 十、可观测性与运维要求
- 十一、PR 门禁与评审清单
- 十二、变更类型与发布
- 附录:本地常用命令
一、总体要求
- 语言版本:Go 1.25.4(统一版本)
- 依赖管理:Go Modules;禁止 GOPATH 模式
- 代码生成:通过各服务 Makefile 统一生成,不得手动修改生成文件
- 持续集成:本地必须先通过 lint + test + 生成校验,再提交 PR
二、开发环境与依赖
- 基础依赖:protoc、Docker、Docker Compose、make
- 本地启动基础设施(如需):
- docker-compose -f deployments/docker-compose.local.yml up -d postgres-jingyun redis-jingyun consul rabbitmq
- 各服务构建流程(示例:gateway):
- make init → make api → make config → make ent → make generate → make build → make run
三、分支模型与提交规范
- 分支
- main 受保护;feature/、fix/、docs/用于日常开发;release/ 用于发版
- 提交信息(Conventional Commits)
- feat: 新功能
- fix: 修复缺陷
- docs: 文档变更
- refactor: 重构(非功能/修复)
- test: 测试相关
- chore/build/ci: 工具链、构建、CI 变更
- 示例:feat(agent): support workflow collection config CRUD
四、代码风格与静态检查
- 必须通过 golangci-lint(项目已有 .golangci.yml)。本地执行:golangci-lint run
- gofmt/goimports 无差异;go vet 必须通过
- 建议开启 staticcheck(golangci-lint 集成)
- 函数复杂度建议 ≤ 10;超过需拆分或在 PR 中说明理由
- 命名约定:
- 错误变量以 err 开头;布尔以 is/has/can 开头
- 导出类型/函数需有注释;避免无意义缩写
五、测试规范与覆盖率门禁
- 覆盖率要求
- 全局最低:90%
- 理想目标:95%+
- 核心域(agent/point/distribution 等 usecase):95%+
- 测试类型
- 单元测试:覆盖 biz/service 成功与错误路径
- 集成测试:涉及 DB/缓存/队列的最小链路
- 端到端:关键业务路径至少一条
- Mock 策略
- 使用数据库的服务:sqlmock + Ent;必须 mock.ExpectationsWereMet()
- Gateway:使用“函数字段 mock”,不使用 gomock
- 断言规范
- 必须使用统一断言助手函数,验证返回对象所有字段(assert_
<entity>Equal),禁止缺字段验证
- 必须使用统一断言助手函数,验证返回对象所有字段(assert_
- 场景覆盖
- 成功、参数缺失、依赖错误、NotFound、业务冲突、分页边界、可选参数分支(nil/true/false)
- 命名规范
- Test
<Service><Method><Scenario>
- Test
六、API/IDL 与代码生成
- 一律使用 protobuf 定义 gRPC/HTTP;HTTP 路由与字段行为注解齐全
- 参数校验使用 protoc-gen-validate;新增字段需补充校验
- 数组与复杂对象必须用 repeated 与 message,不得用 JSON 字符串
- OpenAPI 文档:make swagger 生成 openapi.yaml;PR 必须包含更新
- 兼容性:
- 版本化(v1…);禁止破坏性变更
- 删除字段走弃用流程(deprecated,保留至少两个小版本)
- 生成步骤(单服务):
- make init → make api → make config → make ent → make generate → make all
七、数据层与数据库规范(Ent/SQL)
- ORM 统一使用 Ent;schema 变更后必须生成并提交
- 事务使用 Ent Tx;禁止裸用 sql.Tx
- 迁移:通过迁移文件/目录管理,禁止生产环境手工改表
- 查询性能:
- 大表/高频查询需索引;PR 说明索引策略
- 复杂查询提供 explain 或性能说明
- 多租户:
- tenant_id 强隔离;Service 层必须校验租户上下文
八、消息队列与异步
- 统一使用 pkg/mq/rabbitmq 封装
- 消息结构需版本化,禁止破坏性变更
- 消费者必须幂等;失败重试与死信策略需明确
九、安全与合规
- 认证与授权:统一 JWT;S2S 使用短期 token
- 输入校验:proto + service 双层校验(长度、范围、格式)
- 日志脱敏:屏蔽密码、Token、支付信息等敏感字段
- 依赖合规:禁止引入高危 CVE 版本;定期更新与扫描
十、可观测性与运维要求
- 指标:暴露 Prometheus 指标(QPS、错误率、P95/P99 等关键业务指标)
- 追踪:OpenTelemetry 贯通跨服务;传递 trace/tenant/user 上下文
- 健康检查:提供 /health 与 gRPC 健康检查;依赖项检测
- 日志:结构化 JSON;info/warn/error 合理分级
十一、PR 门禁与评审清单
- 提交流程
- 本地生成代码并通过 verify(lint、fmt、vet、test、swagger)
- 提交 PR(净变更建议 < 800 行,过大请拆分)
- 必过项(CI/审核):
- 编译通过,测试通过且覆盖率达标
- golangci-lint、gofmt/goimports、go vet 通过
- 生成代码与 OpenAPI 已更新(git diff 干净)
- 安全:无明文 Secret;脱敏正确
- 可观测性:关键路径日志/指标/追踪齐全
- 数据库:索引/事务/锁与性能说明
- 配置:Consul/Env 合法,具备回滚策略
- Reviewer 清单:
- 业务正确性与异常路径
- 并发安全、超时、重试与熔断
- 错误码与日志
- 安全与脱敏
- 指标与追踪
- DB 查询与索引
- 配置变更与回滚
- 测试覆盖与断言完整性
十二、变更类型与发布
- 变更类型:feat/fix/docs/refactor/test/chore/build/ci
- 版本:语义化版本(MAJOR.MINOR.PATCH)
- 发布:
- 合并前:运行迁移/回滚验证
- 部署:灰度放量;异常阈值触发回滚
附录:本地常用命令
- 全仓工具初始化:make init(根)或进入服务目录执行
- 生成 API/配置/Ent/DI:make api | make config | make ent | make generate | make all
- 构建:make build;运行:make run(各服务)
- Lint:golangci-lint run;格式化:gofmt -s -w . && goimports -w .
- 测试:go test ./... -v -cover;生成覆盖率报告:go test ./... -coverprofile=coverage.out && go tool cover -html=coverage.out
- OpenAPI:make swagger
如对规范有异议或需豁免,请在 PR 描述中明确说明并 @ 核心维护者评审。