OpenTelemetry Go SDK 发布流程实战指南:从语义约定升级到 GPG 签名发布
OpenTelemetry Go SDK 发布流程实战指南从语义约定升级到 GPG 签名发布【免费下载链接】inngestThe leading workflow orchestration platform. Run stateful step functions and AI workflows on serverless, servers, or the edge.项目地址: https://gitcode.com/GitHub_Trending/in/inngest本指南以本仓库中随依赖一并 vendored 的 vendor/go.opentelemetry.io/otel/RELEASING.md 为骨架完整还原 OpenTelemetry Go SDKgo.opentelemetry.io/otel从语义约定Semantic Conventions升级到版本预发布、打 Tag、GPG 签名、正式 Release 与发布后收尾的端到端流程。作为 inngest 这类深度使用 OTel 的 Go 项目理解这套流程不仅有助于跟踪上游版本演进本仓库当前锁定otel v1.43.0还能在需要为多模块 Go 仓库设计发布管线时直接复用其 make 目标与版本管理约定。读完本文你将掌握semconv-generate、gorelease、prerelease、add-tags等核心命令的正确用法以及 Go 模块发布中Tag 不可删除带来的红线约束。发布前的项目结构认知为什么需要一套仪式化流程OpenTelemetry Go 仓库不是单一 Go module而是由数十个相互依赖的子模块构成的多模块仓库。这一点从 vendor/go.opentelemetry.io/otel/versions.yaml 可以直观看到仓库按 module-sets 对模块进行分组每个集合共享同一个版本号module-sets: stable-v1: version: v1.43.0 modules: - go.opentelemetry.io/otel - go.opentelemetry.io/otel/exporters/otlp/otlptrace - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc - go.opentelemetry.io/otel/metric - go.opentelemetry.io/otel/sdk - go.opentelemetry.io/otel/trace # ...stable-v1 集合共 16 个模块 experimental-metrics: version: v0.65.0 modules: - go.opentelemetry.io/otel/exporters/prometheus experimental-logs: version: v0.19.0 modules: - go.opentelemetry.io/otel/log - go.opentelemetry.io/otel/sdk/log # ... experimental-schema: version: v0.0.16 modules: - go.opentelemetry.io/otel/schema从该文件可见稳定模块集与实验模块集采用不同的版本号策略稳定集v1.43.0实验集v0.x而excluded-modules列出不需要打版本标签的内部工具模块。这种多模块 分组版本的结构决定了发布不能靠手工改go.mod而必须依赖一套由 make 目标驱动、由multimod工具执行的自动化流程——这正是 RELEASING.md 要解决的痛点。一个额外的背景约束让流程更加严格Go 模块的版本 Tag 一旦推送无法真正删除Golang 官方 issue #34189 明确说明这一点。打错标签会直接影响所有下游go get用户因此文档在多个环节反复强调版本号必须一致、发布前必须验证。第一步创建Version Releaseissue整个发布流程以创建一个Version Releaseissue 作为起点。该 issue 用于追踪发布过程中所有待办事项语义约定升级、breaking changes 验证、预发布、打 Tag、签名、发布、里程碑收尾等每一步完成后勾选对应条目直至最后关闭 issue。这是发布流程的总清单也是团队协作时的单一事实来源。第二步Semantic Convention 升级新版本的 [OpenTelemetry Semantic Conventions]语义约定规范意味着需要为semconv包生成新的代码。这是整个发布流程中技术含量最高的一步分为生成、导入更新、属性迁移三个子阶段。2.1 使用semconv-generate生成新包生成动作由semconv-generatemake 目标完成步骤为设置TAG环境变量为要生成的语义约定版本号在仓库根目录运行make semconv-generate。官方示例export TAGv1.30.0 # 改成你要生成的语义约定版本 make semconv-generate # 使用上面导出的 TAG该命令会在 vendor/go.opentelemetry.io/otel/semconv 下创建一个新的子包例如semconv/v1.40.0。本仓库 vendored 的目录中实际保留了v1.17.0、v1.20.0、v1.21.0、v1.37.0、v1.39.0、v1.40.0等多个历史版本每个版本都自带MIGRATION.md迁移文档、attribute_group.go、schema.go等生成产物印证了每次升级新增一个独立版本子包、旧版本保留供兼容的演进模式。从 vendor/go.opentelemetry.io/otel/Makefile 可以看到该目标的真实实现它首先强制校验TAG必须存在[ $(TAG) ] || ( echo TAG unset... ; exit 1 )然后通过docker run启动 OpenTelemetry 官方的weaver镜像执行registry generate从语义约定仓库的指定 Tag 拉取模型配合semconv/templates模板生成 Go 代码最后用semconvkit工具对生成产物做后处理$(SEMCONVKIT) -semconv $(SEMCONVPKG) -tag $(TAG)。生成完毕后应检查产物是否符合预期再提交 Pull Request 合入。同时需要更新 vendor/go.opentelemetry.io/otel/CHANGELOG.md加入如下格式的条目记得把NEW VERSION、PREVIOUS VERSION和 PR 编号替换为实际值- 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/cdc90c540955da71ca95d7de58bac5bc) for information on how to upgrade from go.opentelemetry.io/otel/semconv/PREVIOUS VERSION. (#PR_NUMBER)Tip:将版本号改为与实际发布的版本一致。2.2 更新全仓库的 semconv 导入新 semconv 模块生成后需要把代码库中所有旧版本的 semconv 导入更新为新版本例如// 更新前 semconv go.opentelemetry.io/otel/semconv/v1.37.0 go.opentelemetry.io/otel/semconv/v1.37.0/otelconv // 更新后 semconv go.opentelemetry.io/otel/semconv/v1.39.0 go.opentelemetry.io/otel/semconv/v1.39.0/otelconv完成后运行make检查是否有编译或测试失败。本仓库作为 OTel 的下游消费者同样存在这类导入例如 pkg/telemetry/trace/tracer.go 与 pkg/telemetry/metrics/metrics.go 都通过semconv go.opentelemetry.io/otel/semconv/v1.20.0引用semconv.SchemaURL、semconv.ServiceNameKey等常量来构建资源与 Span 属性——上游发布新 semconv 版本后消费方按同样模式升级导入即可。2.3 处理属性变更某些 semconv 版本会新增、重命名甚至合并属性改变属性值的语义。迁移时应更新代码以使用取代旧属性的新属性遵循最新的语义约定同时遗留属性仍可根据OTEL_SEMCONV_STABILITY_OPT_IN环境变量的设置继续发射以实现稳定性渐进迁移。官方曾通过 issue #7806 记录此类迁移的跟踪与执行方式可作为复杂属性迁移的参考案例。2.4 Go contrib linter 更新升级 semconv 后还需要更新opentelemetry-go-contrib仓库的.golangci.yml强制其 lint 使用新的 semconv 版本保证整个生态的版本一致性。第三步Breaking changes 验证make gorelease发布前必须确认公共 API 没有出现非预期的破坏性变更。运行make gorelease该目标会对仓库内每个模块执行goreleasegolang.org/x/exp/cmd/gorelease对比上一个已发布版本与当前代码的公共 API 差异。从 Makefile 的实现看它通过$(OTEL_GO_MOD_DIRS:%gorelease/%)模式逐个进入每个 Go module 目录执行$(GORELEASE)输出格式为gorelease in DIR。若发现意外变更需在合并前修正。第四步验证 contrib 仓库兼容性如果主仓库的改动会影响 contrib 仓库必须先按 contrib 仓库 RELEASING.md 中 Verify OTel changes 一节的步骤验证兼容性确保生态内其他仓库不会被本次发布破坏。第五步Pre-Release 预发布预发布阶段负责把版本号变更与 CHANGELOG 准备成一份可评审的改动集。确定发布范围并更新版本先在 versions.yaml 中决定本次要发布的 module set 及其新版本号把该改动提交到一个新的分支。更新子模块的 go.mod 依赖让各个子模块的 go.mod 指向即将发布的新版本。运行prereleasemake 目标make prerelease MODSETmodule set它会创建一个名为prerelease_module set_new tag的分支承载所有发布相关改动。Makefile 中该目标实际执行$(MULTIMOD) prerelease -m ${MODSET}且前置依赖verify-mods$(MULTIMOD) verify校验模块配置若未设置MODSET环境变量会直接报错退出。验证改动git diff ...prerelease_module set_new tag确认所有模块的版本都已被更新为new tag确认无误后合并到预发布分支git merge prerelease_module set_new tag更新 CHANGELOG这是对下游用户最可见的一步规范包括确保本次发布的所有相关改动都已收录且使用非贡献者也能读懂的语言描述。可通过git --no-pager log --prettyoneline last tag..HEAD直接核对自上一个 Tag 以来的所有提交将所有Unreleased下的改动移动到新章节章节标题遵循[new tag] - date of release格式新章节必须放在!-- Released section --注释之下使其在未来发布时受到保护、不会被覆盖更新文末所有相关链接。关于已发布章节受保护这一点仓库中的 verify_released_changelog.sh 提供了自动化保障该脚本用awk分别提取基线版本与当前版本中!-- Released section --到!-- Released section ended --之间的内容并做diff一旦发现已发布章节被修改即报错退出防止发布历史被事后篡改。推送并创建 PR推送到 upstream 并创建 Pull RequestPR 描述中务必附上从 CHANGELOG 整理的发布要点。第六步打 Tag注意两个红线预发布 PR 被批准合并后就该给合并提交打版本标签了。文档在此强调两条IMPORTANT红线必须使用与 Pre-Release 阶段完全相同的 Tag。如果两者不一致仓库会处于损坏状态。只要在预发布与打 Tag 之间不修改versions.yaml就不会出问题。Go 模块的错误版本 Tag 无法移除官方 issue #34189一旦推送错误版本会导致严重后果官方曾因此遭遇事故见 issue #331。推送前务必确认版本正确。打 Tag 的命令为make add-tags MODSETmodule set COMMITcommit hash其中COMMIT是主分支上合并 PR 的那个提交哈希只有当当前工作目录的HEAD不是正确提交时才需要显式指定。Makefile 中该目标执行$(MULTIMOD) tag -m ${MODSET} -c ${COMMIT}默认COMMIT为HEAD。随后把所有标签推送到 upstream 远程注意是主仓库而非你的 fork且必须包含所有子模块的标签git push upstream new tag git push upstream submodules-path/new tag ...第七步签名发布产物CNCF 合规要求为满足 CNCF 最佳实践需要对发布产物做 GPG 签名。流程如下从 Tags 页面下载新 Tag 对应的.tar.gz与.zip两个归档签名前可用官方提供的 attest 脚本校验归档内容查询你的 GPG 密钥 IDgpg --list-secret-keys --keyid-formatlong密钥 ID 是sec rsa4096/或类似输出后面的 16 位字符串设置环境变量并对两个产物分别做分离式detached签名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第八步创建 GitHub Release最后为new tag在 GitHub 上创建 Release正文应包含本次发布在 CHANGELOG 中的全部发布说明。IMPORTANTGitHub Releases 一旦创建即不可变签名产物.tar.gz、.tar.gz.asc、.zip、.zip.asc四个文件必须在创建 Release 时一并上传之后无法补充或修改。第九步Post-Release 收尾正式发布后还有四项收尾工作发布 contrib 仓库确认无误后为依赖本次发布的 contrib 仓库按其 RELEASING.md 流程发布新版本。更新官网文档更新 OpenTelemetry 官网 Go instrumentation 文档content/en/docs/languages/go目录将引用的包版本提升到刚发布的版本并确保所有代码示例仍然可以编译、内容准确。关闭里程碑milestone把本次发布修复的所有 issue 与合并的 PR 归入对应里程碑——可用官方提供的两个 GitHub 搜索查询找出已关闭但未纳入里程碑的 issue 与已合并但未纳入里程碑的 PR——全部归入后关闭里程碑便于追溯每次发布包含的改动。关闭Version Releaseissue待 issue 中的 todo list 全部完成关闭该 issue整个发布周期结束。从发布者到消费者inngest 如何随 OTel 版本演进理解上游发布流程对本仓库这类重度 OTel 消费者同样有实际价值。当前仓库在 go.mod 中锁定了go.opentelemetry.io/otel v1.43.0及其子模块otel/trace、otel/metric、otel/sdk、otel/sdk/metric、otlptrace/otlptracegrpc等并通过 vendor 机制将源码固定在仓库内。当上游按上述流程发布新版本时消费方需要关注两类变更模块版本升级将go.mod中的版本号提升到新稳定集版本重新 vendor 后执行构建与测试对应上游流程中的更新 semconv 导入 make验证环节语义约定属性迁移上游发布新 semconv 版本如v1.40.0后消费方可以选择继续使用旧版本子包如当前 pkg/telemetry/trace/tracer.go 使用的semconv/v1.20.0保持稳定或按迁移文档升级到新版本——这正是 RELEASING.md 中新版本生成、旧版本保留、属性可迁移设计意图的体现。发布流程速查清单阶段关键动作核心命令/文件起点创建Version Releaseissue 追踪 todoissue语义约定升级生成新 semconv 包并更新导入export TAG... make semconv-generateversions.yamlBreaking changes 验证对比公共 APImake gorelease预发布更新版本号与 CHANGELOGmake prerelease MODSETmodule set打 Tag给合并提交打全部子模块标签make add-tags MODSET... COMMIT...git push upstream签名GPG 分离签名 tar.gz/zipgpg --local-user $KEY_ID --armor --detach-sign ...发布创建不可变的 GitHub Release附带.tar.gz/.asc/.zip/.asc收尾contrib 发布、官网文档、里程碑、关闭 issueCHANGELOG 与里程碑核对上述全流程的核心参考实现均可在 vendor/go.opentelemetry.io/otel/Makefilesemconv-generate、gorelease、prerelease、add-tags目标、vendor/go.opentelemetry.io/otel/versions.yamlmodule-sets 分组与 vendor/go.opentelemetry.io/otel/CHANGELOG.mdKeep a Changelog 格式与 Released section 保护中进一步研读。【免费下载链接】inngestThe leading workflow orchestration platform. Run stateful step functions and AI workflows on serverless, servers, or the edge.项目地址: https://gitcode.com/GitHub_Trending/in/inngest创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

VimWiki文本对象指南:用viw等文本对象提升编辑效率

VimWiki文本对象指南:用viw等文本对象提升编辑效率

VimWiki文本对象指南:用viw等文本对象提升编辑效率 【免费下载链接】vimwiki Personal Wiki for Vim 项目地址: https://gitcode.com/GitHub_Trending/vi/vimwiki VimWiki 是 Vim 中构建个人 Wiki 的强大插件,而它自带的文本对象(ah、…

2026/9/18 23:40:20 阅读更多 →
2026年按摩椅深度测评

2026年按摩椅深度测评

按摩椅行业正经历一场深刻变革。2025年,高端按摩椅线上销售额同比增长超过25%,而销量增幅仅为个位数,说明消费者不再满足于“有个椅子捶捶背”,而是愿意为真正的健康管理能力买单。消费升级趋势清晰——中高端产品尤其是万元级按摩…

2026/9/18 23:40:20 阅读更多 →
.NET Hybrid Globalization 混合模式解析:Apple 移动平台上的平台原生全球化实现

.NET Hybrid Globalization 混合模式解析:Apple 移动平台上的平台原生全球化实现

.NET Hybrid Globalization 混合模式解析:Apple 移动平台上的平台原生全球化实现 【免费下载链接】runtime .NET is a cross-platform runtime for cloud, mobile, desktop, and IoT apps. 项目地址: https://gitcode.com/GitHub_Trending/runtime6/runtime …

2026/9/18 23:40:20 阅读更多 →

最新新闻

PCANet结合遮挡定位的人脸识别:原理、实现与调优

PCANet结合遮挡定位的人脸识别:原理、实现与调优

简介:《PCANet下的遮挡定位人脸识别算法》是一篇发表在《计算机科学与探索》上的学术论文,面向人脸识别与深度学习研究人员,聚焦自然环境下遮挡导致识别率下降的难题。论文提出将深度学习和特征点遮挡检测相结合的PCANet遮挡定位识别算法&…

2026/9/19 0:34:53 阅读更多 →
粒子群优化设计多层微波吸收材料:从调参到物理驱动的智能设计闭环

粒子群优化设计多层微波吸收材料:从调参到物理驱动的智能设计闭环

简介:本资源是一篇聚焦国防隐身技术与电磁兼容应用的学术论文,面向材料科学、电磁场与微波技术、优化算法研究领域的高校师生及工程技术人员,解决多层微波吸收材料“薄、宽、低”性能协同优化的设计难题。全文基于粒子群优化(PSO&…

2026/9/19 0:34:53 阅读更多 →
scikit-learn 1.2 版本技术解读:set_output 全面落地、交互约束直方图提升与 API 迁移路线图

scikit-learn 1.2 版本技术解读:set_output 全面落地、交互约束直方图提升与 API 迁移路线图

scikit-learn 1.2 版本技术解读:set_output 全面落地、交互约束直方图提升与 API 迁移路线图 【免费下载链接】scikit-learn scikit-learn: machine learning in Python 项目地址: https://gitcode.com/gh_mirrors/sc/scikit-learn 导读 本文基于当前仓库的…

2026/9/19 0:34:53 阅读更多 →
动三轴试验滞回圈分段多项式拟合与参数提取方法

动三轴试验滞回圈分段多项式拟合与参数提取方法

简介:分段多项式拟合在动三轴试验数据处理中的应用是一篇PDF格式的学术论文,聚焦海洋平台地基土动三轴试验中离散、有限数据点的拟合难题,适合从事土动力学、岩土工程数据处理的研究人员与工程师阅读参考。文件包共1份PDF,大小836…

2026/9/19 0:34:53 阅读更多 →
Flink流批一体架构解析:从SQL统一到实时机器学习实践

Flink流批一体架构解析:从SQL统一到实时机器学习实践

简介:一份聚焦 Flink 流批一体技术架构的解决方案型 PPT,面向大数据架构师、实时计算开发人员及技术决策者,帮助快速理解流批融合的核心理念与落地路径。内容围绕“技术创新,变革未来”展开,系统介绍 Flink 的整体架构…

2026/9/19 0:34:53 阅读更多 →
在 Gatsby 中构建联系表单:无障碍表单设计与五种表单数据提交方案详解

在 Gatsby 中构建联系表单:无障碍表单设计与五种表单数据提交方案详解

在 Gatsby 中构建联系表单:无障碍表单设计与五种表单数据提交方案详解 【免费下载链接】gatsby React-based framework with performance, scalability, and security built in. 项目地址: https://gitcode.com/gh_mirrors/ga/gatsby 本文是 Gatsby 联系表单构…

2026/9/19 0:33:52 阅读更多 →

日新闻

BP神经网络时序预测:滑窗长度与多窗口平均策略

BP神经网络时序预测:滑窗长度与多窗口平均策略

简介:面向机器学习、深度学习与数据建模学习者的一份完整研究文献,聚焦BP神经网络在农业产量预测中的应用。文档以1980—2018年全国棉花产量为样本,系统讲解数据归一化处理、激活函数原理、多层神经网络结构搭建及训练流程,展示敏…

2026/9/19 0:00:30 阅读更多 →
Transformer训练实时监控实战:基于MindSpore的损失曲线可视化方案

Transformer训练实时监控实战:基于MindSpore的损失曲线可视化方案

上个月调一个Deformable DETR模型,在单卡上要跑将近两天。第二天早上我下意识打开终端翻日志,发现loss从凌晨两点就开始往上爬,一路从0.8涨到1.35,整整六个小时没人发现。那六个小时的训练不仅白跑,还霸占着卡——等于…

2026/9/19 0:00:30 阅读更多 →
OpenCloud 中的 Go 类型安全转换库 spf13/cast:从零值回退到泛型 API 的完整实战指南

OpenCloud 中的 Go 类型安全转换库 spf13/cast:从零值回退到泛型 API 的完整实战指南

OpenCloud 中的 Go 类型安全转换库 spf13/cast:从零值回退到泛型 API 的完整实战指南 【免费下载链接】opencloud 🌤️ OpenCloud is the open source platform for file management, sharing and collaboration. Simple and sovereign. 项目地址: htt…

2026/9/19 0:00:30 阅读更多 →

周新闻

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验 【免费下载链接】ai The AI Toolkit for TypeScript. From the creators of Next.js, the AI SDK is a free open-source library for building AI-powered applications and ag…

2026/9/16 19:03:19 阅读更多 →
Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化 【免费下载链接】refine A React Framework for building internal tools, admin panels, dashboards & B2B apps with unmatched flexibility. 项目地址: https://gitcode.com/GitH…

2026/9/17 7:57:36 阅读更多 →
Flutter应用改名全指南:从Android到iOS的配置与工具实践

Flutter应用改名全指南:从Android到iOS的配置与工具实践

刚接一个外包项目时,甲方要求把工程里临时用的应用名改成正式产品名。我本来觉得“改名”这种小事,打开配置文件改一行不就完了?结果真动手才发现,Flutter项目里“应用名称”根本不是一处配置,而是一整套散落在 Androi…

2026/9/17 10:19:14 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/16 22:31:27 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/15 21:39:18 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/16 22:32:59 阅读更多 →