v3.0.0-beta.23 - 2026-09-16
2026/9/19 9:14:14 网站建设 项目流程

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

【免费下载链接】wailsCreate beautiful applications using Go项目地址: https://gitcode.com/gh_mirrors/wa/wails

Added

  • Allow overriding the GTK application ID on Linux in PR by @overlordtm

Fixed

  • Linux single-instance claims bus name under app's own ID in PR by @overlordtm
  • Cancel 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` 模型(temperature=0.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_RESULT=fixed`。 校验器对 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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询