跳至正文

批次预检与发布 ​

本页阅读位置

完成第一轮对话后,按当前业务需求深入。Spring 常规声明优先使用 RegistrationManifest 与注解;本页的底层 register / publish 或直连方法供协议细化与兼容集成参考。

SDK 示例 ​

java
var bundle = new ReleaseBundle(List.of(
    new ReleaseBundle.Resource("tools", "query-device", "1.0.0", 1),
    new ReleaseBundle.Resource("agents", "monitor-agent", "1.1.0", 2)
), new ReleaseBundle.Entry("monitor-agent", "1.1.0"), "上线设备查询能力");
var plan = client.previewRelease(bundle).join();
if (!Boolean.TRUE.equals(plan.get("valid"))) {
    throw new IllegalStateException("预检失败:" + plan.get("errors"));
}
String requestKey = UUID.randomUUID().toString(); // 同次提交重试保留此值
var record = client.publishRelease(bundle, (String)plan.get("planHash"),
    ((Number)plan.get("applicationRevision")).longValue(), requestKey).join();
var page = client.releases(50, 0).join();
var detail = client.release((String)record.get("id")).join();
kotlin
import dev.sparktide.sdk.kotlin.*
val bundle = releaseBundle {
    resource("tools", "query-device", "1.0.0", toolRevision)
    resource("agents", "monitor-agent", "1.1.0", agentRevision)
    defaultAgent("monitor-agent", "1.1.0")
    reason("上线设备查询能力")
}
val plan = client.previewRelease(bundle).awaitResult()
check(plan["valid"] == true) { "预检失败:${plan["errors"]}" }
val requestKey = java.util.UUID.randomUUID().toString()
val record = client.publishRelease(bundle, plan["planHash"] as String,
    (plan["applicationRevision"] as Number).toLong(), requestKey).awaitResult()

Java 示例说明:

client 是持有应用管理凭据的 PlatformClient;普通用户无发布权限。修订值从当前 Registry 读取,不能写死用于真实交付。示例版本要求所有未列出的依赖已经发布。

错误与重试 ​

预检无副作用;提交前任何草稿、依赖或应用变更都可能令计划失效。412 修订不匹配或 409 计划变化须重新读取并预检,再使用新键;网络异常先查询记录,同一次不确定结果重试保持原批次、计划头和键。SDK 不自动重放发布请求。

一次发布最多 64 项,不允许重复引用;对象构造后集合不可变。已发布版本保持不可编辑;回退使用默认入口管理方法,既有 Run 和业务副作用不自动回滚。记录只读查询按应用隔离,分页 nextOffset=null 表示结束。

文档来源与验证记录
字段内容
状态已确认
日期2026-09-30
来源ReleaseBundle、PlatformClient、ReleaseDsl、发布协议
责任人SparkTide 维护者
关联任务B08、G05
结论SDK 明确声明资源修订并预检整批,不暗中逐个发布依赖
证据Java HTTP 请求头和正文测试、Kotlin DSL 测试、平台发布集成测试
适用版本:0.1 发布线 · 最近核对:2026-10-09 · SparkTide 产品文档

汇聚智能,驱动涌现。