关于 dtctl-release
面向 dtctl 维护者的发布流程技能,说明如何手动分两次触发 release-please,以及 Conventional Commits 如何决定版本和发布说明。
主要功能
- 01两次手动触发的发布流程
- 02Conventional Commits 版本规则
- 03发布 PR 审核与合并步骤
- 04二进制文件、校验和、签名及 SBOM 发布
- 05故障排查与发布清单
适用场景
- 01准备并发布 dtctl 版本
- 02排查发布 PR 未创建或发布未完成
- 03确认哪些提交类型会触发版本变更
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ dynatrace/ dtctl --skill dtctl-release安装后在 Claude Code 中输入/dtctl-release确认已加载。
详细介绍
dtctl 发布流程(release-please)
dtctl 发布使用 release-please,但需要手动触发——合并到 main 时不会自动发布任何内容。无需手动提升版本、无需编辑 CHANGELOG.md,也无需手动推送标签。发布说明和版本根据上次发布以来的 Conventional Commits 计算得出。
工作原理
.github/workflows/release.yml 工作流仅在你触发时运行(workflow_dispatch——Actions 选项卡上的“Run workflow”按钮,或 gh workflow run)。完整发布分为两次触发,中间需要合并一次:
- 触发 #1——
release-please作业会检查上次发布以来的 Conventional Commits,并创建或更新一个标题类似于chore(main): release 0.31.0的发布 PR。该 PR:- 更新
.release-please-manifest.json中的版本, - 更新
pkg/version/version.go中的后备版本(通过// x-release-please-version注解), - 并在 PR 正文中包含待发布说明。
- 更新
- 合并发布 PR,确认版本和说明符合预期后再合并。
- 触发 #2——release-please 会检测到已合并的发布 PR,创建 git 标签(
vX.Y.Z)和包含自动生成说明的 GitHub Release;release_created == true会作为goreleaser作业的运行条件。该作业会构建跨平台二进制文件、使用 cosign 为校验和签名、使用 syft 生成 SBOM,将所有内容附加到 Release(不会覆盖说明——release.mode: keep-existing),并推送更新后的 Homebrew cask 到dynatrace-oss/homebrew-tap。
⚠️ 别忘了触发 #2:仅合并发布 PR 不会发布任何内容,因为工作流只会在手动触发时运行。
按设计,仓库中没有 CHANGELOG.md 文件——GitHub Release 是权威的更新日志(release-please-config.json 中的 skip-changelog: true)。
版本提升由提交类型决定
| 提交前缀 | 提升类型(1.0 前) | 示例 |
|---|---|---|
feat: | MINOR | 0.30.3 → 0.31.0 |
fix: / perf: | PATCH | 0.30.3 → 0.30.4 |
feat!: / fix!: 或 BREAKING CHANGE: 页脚 | MINOR(1.0 前) | 0.30.3 → 0.31.0 |
docs: / test: / chore: / ci: / refactor: | 单独不会触发发布 | — |
因此,“控制版本”的方法是编写规范的 Conventional Commits 提交信息(参见 CONTRIBUTING.md)。PR 会通过 squash 合并,因此PR 标题会成为影响发布的提交信息。
发布新版本
# 1. Dispatch the workflow to build/update the release PR from commits since the last release
gh workflow run release.yml
gh run watch # wait for the release-please run to finish
# 2. Review the proposed version + notes, then merge the release PR
gh pr list --search "chore(main): release in:title" --state open
gh pr merge <number> --squash
# 3. Dispatch AGAIN to create the tag + GitHub Release and publish artifacts
gh workflow run release.yml
gh run watch
# 4. Confirm
gh release view "$(gh release list --limit 1 --json tagName -q '.[0].tagName')"
标签、GitHub Release、二进制文件、签名、SBOM 和 Homebrew cask 均由第二次触发生成。
润色发布说明(可选)
release-please 会按提交类型分组生成带有 PR 链接的说明。默认内容通常已经很好。如果想要更丰富的文字,可以在发布后编辑 GitHub Release——GoReleaser 使用 keep-existing,因此不会覆盖你的修改:
gh release edit vX.Y.Z --notes-file notes.md
故障排除
- 没有创建发布 PR——你是否触发了工作流?它不会在合并时运行;请运行
gh workflow run release.yml。如果工作流已运行但仍没有 PR,可能是上次发布以来没有可发布的提交(只有docs/chore/test等),或者某个提交不符合 Conventional Commits 规范。检查gh run list --workflow=release.yml。 - 合并发布 PR 后没有发布任何内容——这是预期行为:请第二次触发工作流,让 release-please 创建标签和 Release,并运行 GoReleaser。
- 版本提升不正确——这是由提交类型导致的。要指定特定的版本提升,请在
main上的提交中使用Release-As: x.y.z页脚。 - 已创建 Release,但没有二进制文件——检查发布工作流运行中的
goreleaser作业;release-please作业必须输出release_created: true,该作业才会运行。 - Homebrew 未更新——检查
HOMEBREW_TAP_APP_ID/HOMEBREW_TAP_APP_PRIVATE_KEY密钥和 GoReleaser 步骤日志;skip_upload: auto会有意跳过预发布标签。
检查清单
- 所有预期变更均已作为符合规范的提交合并到
main - 触发第 1 次:
gh workflow run release.yml→ 已创建或更新发布 PR - 打开的发布 PR 反映了预期版本和说明
- 合并发布 PR(压缩合并)
- 触发第 2 次:
gh workflow run release.yml→ 已创建标签和 Release -
release.yml运行成功,release-please和goreleaser作业均通过 - GitHub Release 显示了二进制文件、校验和、签名和 SBOM
- [ ](可选)通过
gh release edit润色发布说明