本文适用于 github.com/didi/ddes-openapi-sdk-java(发布产物 GAV:com.xiaojukeji.esapi:ddes-open-sdk)的版本规划、发布前检查和版本发布。
注意:用户引入的依赖是
com.xiaojukeji.esapi:ddes-open-sdk,不是父 POM 的com.xiaoju.sdk:ddes-openapi-sdk-java。版本号变更只针对前者。
项目采用 语义化版本 2.0.0:
主版本号.次版本号.修订号[-预发布标识]
示例:1.2.3、1.3.0、2.0.0、1.3.0-rc.1。
发布版本号必须同步更新以下位置:
ddes-open-sdk/pom.xml中的<version>(SDK 自身版本,即发布产物版本);sample/pom.xml与integration/pom.xml中引用的ddes-open-sdk依赖版本;CHANGELOG.md对应版本章节;- Git tag,格式为
v<版本号>。
父 POM(
com.xiaoju.sdk:ddes-openapi-sdk-java)与各模块自身的<version>(当前1.0.1)不随 SDK 发布版本变化,无需同步。
以下情况必须升级主版本号:
- 删除或重命名公开类、字段、方法或服务(如移除某个
service模块或v1方法); - 修改公开字段类型,例如
Long改为String、Integer改为String、List<Long>改为List<String>; - 修改 Lombok Builder 生成的方法参数类型或返回类型,导致已有调用代码无法编译;
- 修改
@JsonProperty的 JSON 字段名,导致序列化/反序列化行为不兼容; - 修改已有接口的请求路径、HTTP 方法或请求参数语义,导致已有调用方无法正常工作;
- 删除已废弃但仍在支持周期内的 API;
- 修改已有响应字段的语义,使已有调用方产生不兼容行为。
示例:
1.2.3 → 2.0.0
仅增加 Jackson 自定义反序列化容错能力、修复 number/string 混合响应解析问题,且不改变公开字段类型时,不属于主版本升级。
以下情况通常升级次版本号:
- 新增服务模块、接口方法、
Request或ApiReply模型; - 为已有模型新增可选字段;
- 新增向后兼容的 SDK 能力(如新的
Config选项、新的IHttpTransport实现); - 性能优化或内部实现调整,且不改变公开 API 行为。
示例:
1.2.3 → 1.3.0
新增的数值/布尔类型字段应使用包装类型(Integer/Long/Boolean 等)而非基本类型,以区分「未返回(null)」和「零值」,并遵循项目现有模型类型规范。
以下情况升级修订号:
- 修复不正确的请求构造、签名(
SignUtils)、加密(AesUtils)或响应解析(JacksonUtils); - 修复不影响公开 API 类型和方法签名的 Bug;
- 修复安全问题;
- 更新文档、示例或测试;
- 优化内部代码且不改变公开行为。
示例:
1.2.3 → 1.2.4
如果修复需要修改已有公开字段类型或 Builder 签名,即使目的是修复 Bug,也必须按破坏性变更处理,升级主版本号或提供兼容过渡方案。
发布前必须检查以下公开 API 是否发生变化:
ApiClient及其服务方法(如client.order()、client.member()等);- 各
service模块、V1类及其 API 方法; Request、ApiReply、BaseResp、ErrorInfo及各模型类;- 公开字段的名称、Java 类型(含包装类型与集合泛型)、
@JsonProperty标签; - Lombok
@Builder/@SuperBuilder生成的方法签名; core/utils包中的公开函数、接口(如IHttpTransport、ITokenHolder)、枚举(SignMethodEnum、EncryptTypeEnum)和常量;- 请求路径、HTTP 方法、请求参数和响应字段语义。
以下规则适用于新增或修复接口:
- 不修改已有字段或方法的类型和行为;
- 新接口定义独立的
Request、ApiReply、ErrorInfo等模型类型; - number/string 混合响应优先通过 Jackson 自定义反序列化或
JacksonUtils兼容,不以修改已有公开字段类型作为默认方案; - 大 ID、订单号等字段必须使用
Long或String承载,避免经过Double/Float中间层,确保精度; - 如果无法兼容旧类型,必须在
CHANGELOG.md中明确列出破坏性变更及迁移方式。
__obj__后缀便捷字段(如extraInfoObj对应 json-string 字段extra_info)属于公开 API 的一部分,新增/删除/改类型同样适用上述兼容性规则。
alpha:内部验证版本,功能或接口可能继续调整;beta:面向受控用户验证的版本,功能基本确定;rc:发布候选版本,仅允许修复阻塞发布的问题。
1.3.0-alpha.1
1.3.0-beta.1
1.3.0-rc.1
1.3.0
同一阶段修复问题时递增序号,例如 rc.1 → rc.2。正式版本发布后,不再沿用同一预发布 tag。
开发期的每日构建可使用 Maven
SNAPSHOT版本(如1.3.0-SNAPSHOT),但SNAPSHOT不得发布到 Maven Central release 仓库,正式发布必须是固定版本号。
每次发布必须在 CHANGELOG.md 增加版本章节,至少包含:
- 版本号和发布日期;
- 破坏性变更;
- 新增接口或能力;
- Bug 修复;
- 测试、工程化或构建相关变化;
- 需要用户迁移的代码示例或说明。
破坏性变更必须写明:
接口/模型、字段或方法、旧类型、新类型、迁移方式
如果最终恢复了历史公开类型(即把一度变更的字段类型改回原样),CHANGELOG 不应继续把该字段列为破坏性变更,但应说明仍保留的响应兼容逻辑。
发布人必须按顺序完成以下检查:
# 编译 SDK 主代码
mvn -q clean compile -pl ddes-open-sdk
# 运行 SDK 单元测试(Spock + JUnit,MockWebServer mock)
mvn test -pl ddes-open-sdk
# 含覆盖率(JaCoCo)的完整校验
mvn clean verify -pl ddes-open-sdk
# 覆盖率报告:ddes-open-sdk/target/site/jacoco/index.html
# 检查工作区干净、无空白符错误
git diff --check回放/集成测试位于 integration 子模块,默认不参与构建,需显式激活 profile:
mvn -Pintegration test如果环境限制导致 mock 测试无法运行,至少执行编译检查(mvn test-compile),并记录未执行的测试及原因;不得将「仅编译通过」表述为「全部测试通过」。
- 确认
git diff只包含本次发布相关内容; - 确认没有提交本地凭证、真实请求参数、响应 fixture 或敏感信息;
- 确认新增接口包含必要的模型测试、请求构造测试和响应反序列化测试;
- 确认加密接口覆盖
EncryptTypeEnum的NORMAL、AES128、AES256场景; - 确认
ddes-open-sdk/pom.xml、sample/pom.xml、integration/pom.xml、CHANGELOG.md与发布 tag 的版本号一致。
-
在功能分支完成开发、评审和测试;
-
根据本规范确定版本号;
-
更新
ddes-open-sdk/pom.xml(及sample、integration引用版本)和CHANGELOG.md; -
执行第 6 节全部发布前检查;
-
合并到主分支(
master); -
创建并推送 tag:
git tag -a v1.3.0 -m "release: v1.3.0" git push origin v1.3.0 -
发布到 Maven Central(Sonatype Central Portal,由
central-publishing-maven-plugin自动发布、maven-gpg-plugin自动签名,并附带 source/javadoc jar):mvn clean deploy -pl ddes-open-sdk
需在本地
settings.xml中配置<server>的central凭证,并保证 GPG 可用。autoPublish=true会自动推进 staging 发布。 -
确认目标版本可被获取:
mvn dependency:get -Dartifact=com.xiaojukeji.esapi:ddes-open-sdk:1.3.0
-
在发布记录中附上版本说明、测试结果和已知限制。
- 发布后发现阻塞问题时,优先停止继续传播该版本(注意:Maven Central 已发布版本不可删除或覆盖,只能在其后的修订版本中修复),并在发布记录中标明问题;
- 已公开发布的版本号不得复用或覆盖;
- 修复后必须递增修订号,重新执行发布前检查;
- 如果问题涉及公开 API 破坏性变更,必须重新评估主版本号和迁移方案;
- 回滚代码分支与撤回错误版本号是两个独立动作,不能通过重新推送同名 tag 替代。