ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

v3.0.0-beta.23 - 2026-09-16

v3.0.0-beta.23 - 2026-09-16 v3.0.0-beta.23 - 2026-09-16【免费下载链接】wailsCreate beautiful applications using Go项目地址: https://gitcode.com/gh_mirrors/wa/wailsAddedAllow overriding the GTK application ID on Linux in PR by overlordtmFixedLinux single-instance claims bus name under apps own ID in PR by overlordtmCancel aborted custom-scheme requests on Linux in PR by leaanthony条目采用 - 描述 in PR by 作者 的统一形态其中 PR 链接是后续校验与去重的重要锚点。 ## 三、自动化生成PR 合入后自动补写条目 v3/scripts/auto-changelog.go 是核心的写手它在 PR 事件上运行把 PR 信息自动转化为一条符合规范的 changelog 条目并插入 v3/UNRELEASED_CHANGELOG.md。其完整流程见 [auto-changelog.go](https://link.gitcode.com/i/96f47d2358f6e36c2cbe5a28798f926a) 1. **环境变量校验**必须提供 PR_NUMBER、GITHUB_TOKEN、OPENROUTER_API_KEY、GITHUB_REPOSITORY否则直接退出。 2. **拉取 PR 信息**通过 GitHub REST API 获取 PR 标题、作者与变更文件列表分页拉取每页 100 条。 3. **内部变更跳过**使用常规提交类型前缀ci、chore、build、test、style识别内部变更流水线、依赖升级、构建/测试管道等这些不面向用户不出现在发布说明中[internalTypes 定义](https://link.gitcode.com/i/4c48ddad876524ffc229efe22bd2ee51)。识别正则锚定在行首、忽略大小写、容忍可选的 (scope) 与破坏性 !^(?i)([a-z])(([^)]*))?!?:该判断失败开放——没有常规提交前缀的标题不会被当作内部变更避免误删真实变更。 4. **获取 CodeRabbit Walkthrough**在 PR 评论中翻页查找 coderabbitai[bot] 的评论提取 !-- walkthrough_start -- 与 !-- walkthrough_end -- 之间的内容作为变更摘要状态性评论如Review skipped会被拒绝不会进入模型上下文。 5. **LLM 生成条目**把 PR Title CodeRabbit Walkthrough 组装为上下文调用 OpenRouter 上的 google/gemini-2.5-flash-lite 模型temperature0.1要求模型输出**仅含** section 与 entry 两个字段的原始 JSON。 6. **安全清洗sanitizeEntry**这是防提示注入的关键环节[sanitizeEntry](https://link.gitcode.com/i/13aabf0ca0de9f4bfd61748d2d12b184) - 把所有空白包括注入的换行折叠为单个空格防止破坏 Markdown 结构 - 删除全部 HTML/JSX 标签img src...、script 等 - 剥离 [ ] 使条目永远渲染为纯文本而非链接、图片或代码片段 - 硬性截断到 120 字符以内。 7. **文档链接补全**若该 PR 改动了 docs/mpress/content/ 下的 .mpd 页面排除 changelog.mpd 自身且条目属于 Added 或 feat 类型 PR则根据 MPD frontmatter 中的 slug 字段推导文档 URL最多内联 3 个链接超过则折叠为see the documentation site (N pages updated)。URL 由源码路径确定性推导模型无法凭空捏造。 8. **插入条目**insertEntry 用正则 (?m)(^## Section\n(?:!--[^\n]*--\n)*) 定位到对应小节标题之后插入 bullet若小节不存在则在 --- 分隔符之前新建小节[insertEntry](https://link.gitcode.com/i/636279c71cd0df6841c198ecd4f9c7d8)。 上述流程中文档 slug 的解析支持 JSON 转义guides\u002fcustom-route与多语言前缀zh-cn、ja、ko 等且有完整的单元测试覆盖[auto-changelog_test.go](https://link.gitcode.com/i/1c2b114f1c31147f34ab24872b1434d4)。 ## 四、位置校验防止条目误入已发布版本 v3/scripts/validate-changelog.go 在每次 PR 中检查**本次 PR 新增的行不得落在已发布版本的小节里**。它通过 git 提供的 added/deleted 行对比工作核心逻辑[validate-changelog.go](https://link.gitcode.com/i/f1c7cab7d1f66800a265554a41eff05d) 1. 逐行扫描 changelog跟踪当前所属小节 2. 只检查本 PR 新增且落在已发布版本小节名为 [Unreleased] 或形如 v3.0.0-* 之外的版本号的行 3. 对疑似错放的条目执行两类豁免判断 - **同源修正CORRECTION**删除行与新增行位于同一发布小节且引用同一个不可变的 issue/PR或仅存在代码跨度code) 与强调*text*之间的格式差异[isSameSourceCorrection](https://link.gitcode.com/i/6d4f00d5253ddd2d21110613fef07900) - **已发布回填BACKFILL**该行与已发布 Release Notes 中某行完全一致且带规范 PR 链接才允许放行[isPublishedBackfill](https://link.gitcode.com/i/13fa73f0e803c1cb3bc24ed9e8a681b9)。 4. 无法豁免的行触发自动修复把错放条目从原位置移除按类别分组重新插入 [Unreleased] 小节缺失类别时自动创建 ### 类别输出 VALIDATION_RESULTfixed。 校验器对 PR 链接有严格的白名单校验只有 https://github.com/wailsapp/wails/pull/[0-9] 才被认可嵌入攻击性 URL如重定向、子域伪造一律拒绝见 [validate-changelog_test.go](https://link.gitcode.com/i/3b9f305b2f91d2bf6b5279aa03f38a96) 的测试用例。 ## 五、发布管线并发安全地把条目写到 master 生成与校验后的条目最终要合入主干v3/scripts/publish-changelog.py 负责这一最后一公里其设计要点[publish-changelog.py](https://link.gitcode.com/i/a8f52f98b48d61db1a13e216afaab03f) - **分离式发布**在**临时 detached worktree** 中基于最新的 origin/master 重放条目绝不直接改动调用方工作区避免把作者本地未提交内容一并推上去。 - **有界重试**默认最多 5 次尝试、每次间隔 2 秒fetch/checkout 等瞬时 Git 失败可自动恢复。 - **重复检测**以 https://github.com/repo/pull/number) 为唯一标记若该标记已出现在 master 的 UNRELEASED_CHANGELOG.md 或归档 docs/mpress/content/changelog.mpd 中则跳过发布。 - **并发安全**当两个发布者竞争同一小节时后推者会先 fetch 最新 master 再重放自己的条目最终两个条目恰好各出现一次[test_competing_push_and_replay](https://link.gitcode.com/i/f6965d6f458927f619d0df197b782295) 用 pre-push hook 人为制造 push 竞争验证了这一点。 - **失败安全**提交被拒绝pre-commit hook 失败或重试耗尽时保留原始错误并清理临时 worktree生成的条目仍留在原 checkout 中绝不静默丢失。 发布完成后夜间发布工作流还会用 v3/scripts/check-changelog-runs.py 做一次**证据完整性门禁**[check-changelog-runs.py](https://link.gitcode.com/i/291148edaa9f28f67a0c16949dd80629)用 git describe 定位上一个 v3 发布 tag拉取 auto-changelog-v3.yml 工作流在 tag 之后的所有运行记录对其中属于本次发布快照git merge-base --is-ancestor 判定、失败即关闭且结论不是 success/skipped 的运行直接阻断发布要求先恢复失败的 changelog 运行。 ## 六、从收集器到发布说明内容提取与正式归档 当 UNRELEASED_CHANGELOG.md 积累到可发布状态时v3/tasks/release/release.go 的 --create-release-notes 参数负责把它转换成干净的 release_notes.md完整说明见 [v3/tasks/release/RELEASE_NOTES_CREATION.md](https://link.gitcode.com/i/7d63b640d4811f19b92e78c3e74072a5) bash # 默认输出到 ../../release_notes.md go run release.go --create-release-notes # 自定义输出路径 go run release.go --create-release-notes /path/to/output.md # 仅检查是否存在内容 go run release.go --check-only # 提取内容到 stdout go run release.go --extract-changelog【免费下载链接】wailsCreate beautiful applications using Go项目地址: https://gitcode.com/gh_mirrors/wa/wails创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进