Skip to content

发布 ​

LoggerJS 使用 Changesets 管理版本,并通过 GitHub Actions 的 release workflow 发布到 npm。

本地验证 ​

准备发布前,先运行完整的发布演练:

bash
pnpm release:dry-run

它会运行常规质量门禁,验证公开导出和 API 报告,用 npm pack --dry-run --json 检查每个包,把按发布方式打出的 tarball 安装到临时的消费方项目中做冒烟测试,打印 Changesets 状态,并运行 pnpm publish -r --dry-run --access public --no-git-checks --json。

不实际发布的 canary 验证:

bash
pnpm release:canary:dry-run

真正的 canary dist-tag 只应在带版本号的预发布分支或 workflow 中使用:

bash
pnpm check
changeset publish --tag canary

新组件发布检查 ​

如果一次发布新增了公开的 transport 或 integration 子路径,确认变更中包含:

  • docs/TRANSPORTS.md 或 docs/INTEGRATIONS.md 中的稳定性分级;
  • 由 pnpm verify:component-docs 检查的导入边界文档;
  • 与组件相符的运行时验证:浏览器生命周期/存储行为用浏览器 E2E,edge/运行时相关的说法用运行时冒烟测试,本地服务用基于 Docker 的真实服务测试,托管厂商用外部服务冒烟测试;
  • pnpm size:check 的体积预算数据,任何预算上调都要在变更中说明理由;
  • 生产文档中写清投递、重试、隐私和凭据存放方面的注意事项。

每次发版 ​

  • 在发版提交上手动运行 Soak workflow,设置更长时长(major 版本用 60 分钟),确认两个浸泡测试都通过。每个浸泡测试在单独的 job 中运行,超时上限为 90 分钟。
  • 审查 packages/*/test/golden/ 下的任何 diff:它会改变收集端收到的内容,需要写进发版说明。
  • 发布之后,把 examples/browser-basic/package.json 中的 @loggerjs/browser-previous 指向刚发布的版本,让升级测试始终打开上一个已发布版本写入的数据,并把 pnpm-workspace.yaml 中 minimumReleaseAgeExclude 的精确版本替换为该别名现在安装的版本。从 1.0 开始只有 browser 包:core 是它的 peer dependency,所以该别名使用工作区里的 core。
  • release workflow 成功后,为该 tag 创建 GitHub Release,并且不要创建新的 tag,例如 gh release create v1.2.0 --verify-tag --title 1.2.0 --latest --notes "**Full Changelog**: https://github.com/jskits/loggerjs/compare/v1.1.0...v1.2.0"。每个已发布的版本都有对应的 GitHub Release。npm 可能需要几分钟才能在各处显示新版本,所以在宣布发布之前,请反复检查 registry,直到每个包都显示该版本。

npm 发布 ​

发布 workflow 是 .github/workflows/release.yml。每个可发布的 @loggerjs/* 包都应在 npmjs.com 上配置 Trusted Publisher:

  • Organization or user: jskits
  • Repository: loggerjs
  • Workflow filename: release.yml
  • Allowed action: npm publish

workflow 通过 npm Trusted Publisher/OIDC 发布,不读取 NPM_AUTH_TOKEN、NPM_TOKEN 或 NODE_AUTH_TOKEN。

  • permissions.id-token: write 允许 GitHub Actions 签发 OIDC token,npm 会在 npm publish 期间用它换取发布权限。
  • actions/setup-node 只为发布命令设置 npm registry,不配置长期有效的 token。
  • 发布任务运行在 GitHub 托管的 Ubuntu runner 上,使用 Node 24 并升级到 npm 11,以获得最新的 Trusted Publisher 支持。
  • 发布前,发布任务会运行 pnpm release:publish:preflight,为每个尚未发布的包交换一次 GitHub OIDC token。这样可以在发布任何新版本之前发现缺失或不匹配的 Trusted Publisher 配置。
  • 每个可发布的包都设置了 publishConfig.provenance=true,发布步骤设置 NPM_CONFIG_PROVENANCE=true,发布脚本也会显式给 pnpm publish 传入 --provenance。
  • npm whoami 不适合作为 Trusted Publisher 的预检,因为 OIDC 认证只在发布操作期间存在。

npm 要求 provenance 来自公开的源码仓库,并且包的 repository 元数据必须与该仓库一致。

普通提交不会触发发布。发布流程是:先用 pnpm version-packages 消费待处理的 changesets(它同时会重新生成列出包版本的站点参考页),提交更新后的包版本信息和重新生成的文档,并让这次提交通过常规 CI。版本提交合入 main 后,创建并推送与新版本号一致的 release tag,例如 v0.5.6;.github/workflows/release.yml 只监听 v* tag 的推送,并拒绝不在 origin/main 可达范围内的 tag。如果仍有待处理的 changesets,发布任务会直接失败;否则它会为每个尚未发布的包验证 npm OIDC 权限,运行 pnpm release:publish,用 pnpm publish --provenance 发布每个尚未发布的 workspace 包,然后用幂等的 changeset tag 命令创建各包的 release tag,最后推送 @loggerjs/* 包 tag。

如果 npm 在发布或 pnpm release:publish:preflight 期间返回认证错误,请检查每个包的 Trusted Publisher 配置是否与仓库所有者、仓库名、workflow 文件名、可选的 environment 名称以及 allowed action 完全一致。npm 只在交换 OIDC 权限或尝试发布时才会检查这些字段。发布脚本可以安全重跑:已发布的包版本会被跳过,只发布剩余的包。

参考:

相关链接 ​

基于 MIT License 发布。