OpenTelemetry Go 发布流程详解:semconv 生成、gorelease 校验与 GPG 签名(containerd 依赖视角)

发布时间:2026/9/13 8:47:28

OpenTelemetry Go 发布流程详解:semconv 生成、gorelease 校验与 GPG 签名(containerd 依赖视角) OpenTelemetry Go 发布流程详解semconv 生成、gorelease 校验与 GPG 签名containerd 依赖视角【免费下载链接】containerdAn open and reliable container runtime项目地址: https://gitcode.com/GitHub_Trending/co/containerd本文基于 containerd 仓库中 vendored 的 OpenTelemetry Go 发布流程文档完整拆解 OpenTelemetry Go SDK 的一次正式发布所经历的各个环节语义约定semconv包的生成与迁移、破坏性变更校验、multimod 驱动的版本预发布与打 tag、GPG 签名以及发布后收尾工作并结合本仓库 vendor 目录中的 Makefile、versions.yaml 与 semconv 子包实际状态说明这些流程如何映射为可验证的产物。一、整体流程概览OpenTelemetry Go 的一次标准版本发布在文档中划分为以下阶段每一步都有明确的执行者动作和可验证的产物创建Version Releaseissue用一个 issue 跟踪整个发布流程的待办清单Semantic Convention Upgrade若本次发布伴随新的语义约定版本需生成新的semconv子包、更新全库导入、处理属性变更Breaking changes validation用make gorelease确认公开 API 没有非预期的破坏性变更Pre-Release确定发布的模块集module set更新versions.yaml运行make prerelease生成版本变更分支完善 Changelog 并提 PRTagPR 合并后用make add-tags为合并提交打 tag 并推送到上游Sign artifacts用 GPG 对发布产物.tar.gz/.zip签名Release在 GitHub 上创建不可变的 Release并一次性上传全部签名产物Post-Release发布 contrib 仓库对应版本、更新官网文档、关闭 milestone 与Version Releaseissue。二、Semantic Convention 升级从规范到 Go 包2.1 生成新的 semconv 子包OpenTelemetry 语义约定Semantic Conventions每发布一个版本就需要生成一个对应的go.opentelemetry.io/otel/semconv/VERSION子包。文档给出的操作步骤是将环境变量TAG设置为目标语义约定版本运行make semconv-generate目标。export TAGv1.30.0 # 改为你要生成的语义约定版本 make semconv-generate # 使用导出的 TAG该命令会在semconv目录下创建新的子包。提交 PR 前需确认生成结果正确。源码级印证本仓库 vendor 的 Makefile 中semconv-generate目标的实际实现比文档描述更具体——它并非纯 Go 生成器而是通过 Docker 运行 Weaver 模板引擎从dependencies.Dockerfile中解析出 weaver 镜像强制校验TAG已设置否则直接报错退出将semconv/templates目录与目标目录semconv/${TAG}挂载进容器从语义约定的官方 tag 归档$(TAG).zip[model]加载模型并渲染 Go 代码最后用自研的semconvkit工具对生成结果做后处理。这意味着生成的包是模板化、可重复构建的产物而非手写代码。2.2 本仓库中的 semconv 子包实际状态containerd 当前 vendor 快照中同时存在三个 semconv 版本子包体现了按版本并存、迁移时逐版本切换的设计子包路径说明vendor/go.opentelemetry.io/otel/semconv/v1.17.0早期版本含http.go、resource.go、trace.go等文件vendor/go.opentelemetry.io/otel/semconv/v1.37.0引入attribute_group.go与rpcconv/子包vendor/go.opentelemetry.io/otel/semconv/v1.43.0当前版本新增httpconv/、otelconv/等指标约定子包每个版本子包都自带MIGRATION.md与schema.go。以 v1.37.0/MIGRATION.md 为例它逐条列出了从 v1.36.0 升级时被移除的声明如ContainerRuntime、一批GenAISystem*属性等并指出未标注为 deprecated 的移除项是因为缺乏适用性或使用使用者如有依赖应向上游提 issue。而 v1.43.0/MIGRATION.md 则声明该版本对 v1.42.0 是 drop-in replacement——这说明迁移文档的轻重随版本变化而不同升级前必须先读对应版本的迁移说明。2.3 更新 Changelog 与全库导入生成新子包后文档要求同步更新CHANGELOG.md并按如下模板描述新增包NEW VERSION与PREVIOUS VERSION需替换为实际版本- The go.opentelemetry.io/otel/semconv/NEW VERSION package. The package contains semantic conventions from the NEW VERSION version of the OpenTelemetry Semantic Conventions. See the [migration documentation](https://link.gitcode.com/i/87347ff631b1429a60d51185f46b9db5) for information on how to upgrade from go.opentelemetry.io/otel/semconv/PREVIOUS VERSION. (#PR_NUMBER)随后更新代码库中所有 semconv 导入以引用新版本// Before semconv go.opentelemetry.io/otel/semconv/v1.37.0 go.opentelemetry.io/otel/semconv/v1.37.0/otelconv // After semconv go.opentelemetry.io/otel/semconv/v1.39.0 go.opentelemetry.io/otel/semconv/v1.39.0/otelconv改完后运行make检查是否有编译或测试失败。在 containerd 的 vendor 代码中可以印证这种全局引用同一版本的约定例如 otel SDK 的 resource 包内 container.go、process.go 等文件统一导入semconv go.opentelemetry.io/otel/semconv/v1.43.0containerd 自研的 otelttrpc 与 contrib 的 otelgrpc 也各自固定引用某个具体版本升级时需要成组替换。2.4 处理属性变更与稳定性开关某些 semconv 版本会新增属性或改动现有属性简单到重命名复杂到属性合并、属性值变更。文档的处理原则是代码应迁移到取代旧属性的新属性遵循最新语义约定但遗留属性仍可能按OTEL_SEMCONV_STABILITY_OPT_IN环境变量的取值继续发射以兼顾向后兼容。该环境变量在 vendor 代码中确有落点例如 otelgrpc/config.go 会读取它来决定使用哪一代语义约定。另外文档提醒升级 semconv 后还应更新 opentelemetry-go-contrib 仓库的.golangci.yml以强制要求新的 semconv 版本避免 contrib 与新 SDK 混用旧约定。三、Breaking Changes 校验gorelease文档建议运行make gorelease该目标调用 goreleasegolang.org/x/exp/cmd/gorelease工具对每个 Go module 逐包比对公开 API 变化确认没有非预期的破坏性变更。从 Makefile 可以看到gorelease是作为本地工具构建到.tools目录的gorelease/%目标按 module 目录循环执行因此它天然适配 OpenTelemetry Go 的多模块仓库结构。工具本身存在的问题可向上游 Go 项目反馈文档中给出了对应的 issue 指引。四、Pre-Release版本集、分支与 Changelog4.1 确定模块集与 versions.yaml预发布的第一步是决定本次要发布哪些模块集module set并更新 versions.yaml 中的版本然后提交到新分支。本仓库 vendor 的 versions.yaml 展示了实际结构stable-v1版本v1.46.0包含go.opentelemetry.io/otel、/trace、/sdk、/exporters/otlp/*等稳定模块experimental-metricsv0.68.0如exporters/prometheus、metric/xexperimental-logsv0.22.0log 相关模块experimental-schemav0.0.19excluded-modules排除工具模块modules段还声明了各 exporter 的version-refs指向各自的./internal/version.go供 multimod 校验版本一致性。containerd 主工程的 go.mod 正是锁定在这套版本上go.opentelemetry.io/otel v1.46.0、/exporters/otlp/otlptrace{,/otlptracegrpc,/otlptracehttp} v1.46.0、/sdk v1.46.0、/trace v1.46.0且 vendor/go.opentelemetry.io/otel/version.go 中Version()返回1.46.0三者完全自洽。4.2 make prerelease 与分支合并文档的 Pre-Release 步骤为运行 prerelease 目标它会自动创建prerelease_module set_new tag分支承载全部版本变更make prerelease MODSETmodule set检查差异应看到所有 module 的版本号被改为new tag确认无误后合并进你的发布分支git diff ...prerelease_module set_new tag git merge prerelease_module set_new tag更新 CHANGELOG.md确认本次发布的所有相关变更都已写入且措辞对非贡献者可读可用git --no-pager log --prettyoneline last tag..HEAD对照提交历史核对将所有Unreleased变更移入新小节标题格式为[new tag] - date of release新小节必须位于!-- Released section --注释保护之下避免未来被意外覆盖更新文档底部的链接引用。推送上游并创建 PRPR 描述中附上整理好的 Changelog 变更。源码级印证Makefile 中prerelease目标实际是$(MULTIMOD) prerelease -m ${MODSET}即由 OpenTelemetry 构建工具的 multimod 执行且前置依赖verify-modsmultimod verify先校验版本声明的一致性MODSET 未设置时直接报错退出。而已发布小节不可篡改这一约定有专门的 CI 脚本 verify_released_changelog.sh 支撑它从基线分支检出上一版 CHANGELOG.md用 awk 提取!-- Released section --到!-- Released section ended --之间的区间与当前版本 diff只要已发布区间被改动即失败退出。五、Tag打标签与推送PR 合并后为合并提交打 tag。文档给出了两条关键警告必须使用与 Pre-Release 步骤完全相同的 tag否则仓库会处于损坏状态只要两步之间不改versions.yaml就没问题Go module 的 tag 一旦推送就无法删除推错版本会引发难以收拾的连锁问题务必确认无误再推。具体操作对每个要发布的模块集运行make add-tags MODSETmodule set COMMITcommit hash只有当工作目录 HEAD 不是正确提交时才需要显式传COMMIT默认值为HEAD见 Makefile 中COMMIT ? HEAD与$(MULTIMOD) tag -m ${MODSET} -c ${COMMIT}。将 tag 推送到上游远端而非自己的 fork注意子模块的 tag 也要一并推送git push upstream new tag git push upstream submodules-path/new tag ...多模块仓库意味着一个逻辑版本对应多组 tag如v1.46.0与sdk/v1.46.0漏推任何一个子模块 tag 都会让下游go get失败——这正是文档反复强调确保推送所有子模块的原因。六、Sign artifactsGPG 签名为符合 CNCF 最佳实践发布产物必须签名。流程为从新版本 tag 的 tag 页下载.tar.gz与.zip归档两个归档都要签名签名前可用文档推荐的校验脚本核对归档内容。查询自己的 GPG 密钥 IDgpg --local-user --list-secret-keys --keyid-formatlong密钥 ID 是sec rsa4096/或类似前缀后面的 16 位字符串。设置环境变量并分别签名两个产物export VERSIONversion # 例如 v1.32.0 export KEY_IDyour-gpg-key-id gpg --local-user $KEY_ID --armor --detach-sign opentelemetry-go-$VERSION.tar.gz gpg --local-user $KEY_ID --armor --detach-sign opentelemetry-go-$VERSION.zip验签gpg --verify opentelemetry-go-$VERSION.tar.gz.asc opentelemetry-go-$VERSION.tar.gz gpg --verify opentelemetry-go-$VERSION.zip.asc opentelemetry-go-$VERSION.zip七、Release 与 Post-ReleaseRelease为new tag创建 GitHub Release正文包含本次发布的全部 Changelog 内容。文档特别强调GitHub Release 一经创建即不可变签名产物.tar.gz、.tar.gz.asc、.zip、.zip.asc共四个文件必须在创建时一次性上传事后再也无法补充或修改。Post-Release包含四个收尾动作contrib 仓库验证兼容后为使用本次发布的 opentelemetry-go-contrib 仓库做对应版本发布官网文档更新 OpenTelemetry 官网的 Go instrumentation 文档把所有引用的包版本 bump 到刚发布的版本并确保代码示例仍可编译、准确无误关闭 milestone用 GitHub 搜索找出未纳入 milestone 的已关闭 issue 和已合并 PR补录进对应 milestone 后关闭它保证每个版本包含哪些变更可追溯关闭Version Releaseissue待办清单全部完成后关闭标志本次发布流程结束。八、对 containerd 使用者的实际意义对 containerd 这类以 Go module 依赖方式引入 OpenTelemetry 的项目理解上游发布流程有两点直接价值版本锁定是强约束。containerd 的 go.mod 将 otel 全线锁在v1.46.0stable-v1 模块集且otelgrpc、otelhttp等 contrib 组件也固定在同一批版本上游一次 prerelease 中若某个模块集版本号与 containerd 锁定不一致升级时必须整组迁移这正是 multimod 按 module set 统一打 tag 的下游体现。semconv 升级是行为变更点。vendor 快照中并存 v1.17.0 / v1.37.0 / v1.43.0 三代约定包说明上游遵循新版本子包与旧版本并存的策略containerd 的 tracing 相关依赖如 otelttrpc引用的版本决定其发射哪一代属性升级时需对照对应MIGRATION.md与OTEL_SEMCONV_STABILITY_OPT_IN的语义确认行为兼容性。适用前提以上流程描述的是 OpenTelemetry Go 上游仓库的发布操作本文所有路径与命令均基于 containerd 仓库中 vendored 的文档vendor/go.opentelemetry.io/otel/RELEASING.md及其配套的 Makefile、versions.yaml、CHANGELOG.md 核实prerelease、add-tags、semconv-generate等 make 目标需在 otel 仓库的工作副本中执行而非在本仓库中执行。【免费下载链接】containerdAn open and reliable container runtime项目地址: https://gitcode.com/GitHub_Trending/co/containerd创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/13 8:47:28

高通Camera架构实战:CamX调度、Chi-CDK插件与HAL3流控深度解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/13 8:47:28

WebUSB+Chrome侧边栏实现免安装Android投屏与提单

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/13 10:47:33

Agent-Client协议架构设计与性能优化实战

1. Agent Client Protocol 全景解析:架构设计与核心机制在分布式系统与云计算领域,Agent-Client通信协议(Agent Client Protocol)作为基础设施层的核心技术,承担着控制指令下发、状态同步和数据传输的关键职能。过去十…

2026/9/13 10:47:33

Lithe-IDEA:基于IntelliJ Platform的轻量级Java开发环境构建指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/13 10:47:33

Milvus 2.6.8实战:Docker部署、外部MinIO与混合检索全攻略

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/13 10:47:33

5分钟本地搭建AI证件照平台:ONNXRuntime+Gradio+OpenCV实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/13 10:47:33

MAXScript批量将BIP转FBX:动捕动作自动化处理实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/13 10:42:33

Arm项目工程健康度扫描工具mango深度解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/13 0:01:16

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/13 0:01:16

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/12 6:29:36

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/12 14:32:17

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/12 6:37:43

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码