AGC 版本号以仓库为准,新增 bump-version 提升版本命令

- 发布/构建不再自动递增版本、不再支持 AGC_RELEASE_VERSION 自由指定版本,改为读取仓库已提交的版本

- prepareReleaseVersion 只校验五个版本来源一致并返回仓库版本,不再改写版本文件

- 新增 apps/ai-game-creator-shell/scripts/bump-version.mjs,默认提升 patch,支持 minor/major/显式版本,写入五处并本地提交

- release:upload 发布前通过 assertVersionNotBelowOss 防降级:仓库版本低于 OSS 线上版本时中止,并提示先运行 bump-version

- 新增根 npm run ai-game-creator-shell:bump-version 别名,并在 AGC 更新技术方案文档与 Jenkinsfile 中移除自由版本参数说明
This commit is contained in:
2026-09-07 12:52:03 +08:00
parent 65551cd827
commit 78088e422a
8 changed files with 217 additions and 50 deletions
@@ -30,27 +30,50 @@ AGC 每次启动时由根窗口检查一次公开 OSS 更新清单。清单默
## 发布约定
> ⚠️ 发布新版本时,版本号提升只发生在构建/上传工作区内,**不会自动回写仓库**。
> 因此每次发布完成后,必须手动把版本号变更提交回 `master`(范围覆盖
> `package.json`、根 `package-lock.json`、`tauri.conf.json`、`Cargo.toml`、`Cargo.lock`
> 中的 AGC 包条目,且五处保持一致),否则仓库源码版本会长期停留在旧值,
> dev 客户端每次启动都会误报“发现新版本”,OSS 已发布版本与源码严重背离。
> 提交标题建议使用“提升 AGC 版本至 x.y.z”。
> 🔑 版本号以仓库为准。发布流程不再自动递增版本,也不再支持 `AGC_RELEASE_VERSION` 自由指定版本。
> 发布前必须先运行版本提升命令,把目标版本写回仓库并提交,发布只读取这份已提交的版本。
当前发布目标固定为 Windows x64 NSIS。执行 `npm run ai-game-creator-shell:build` 会先读取
`VITE_AGC_UPDATE_MANIFEST_URL`(默认 `https://agc-dev.oss-rg-china-mainland.aliyuncs.com/agc/latest.json`)的
`latest.json`,取本地与 OSS 的较高版本并递增一个 patch,然后同步更新 package、Tauri 和 Cargo
版本后再向 Tauri 传入 `--target x86_64-pc-windows-msvc` 构建。OSS 清单首次不存在时按本地版本递增;
OSS 请求失败、清单格式错误或版本无效会终止发布,避免覆盖线上版本。构建完成后自动扫描 `.exe`
安装包,并在 `apps/ai-game-creator-shell/src-tauri/target/x86_64-pc-windows-msvc/release/bundle/latest.json`
生成包含版本、下载地址、大小和 SHA-256 的清单。可通过 `AGC_BUILD_TARGET` 显式覆盖目标(发布仍应使用
Windows x64),通过 `AGC_UPDATE_ARTIFACT` 指定要发布的安装包,通过 `AGC_UPDATE_OSS_BASE_URL` 指定
OSS 前缀,通过 `AGC_RELEASE_VERSION` 指定三段版本号(仅在明确需要复现指定版本时使用),通过
`AGC_UPDATE_RELEASE_NOTES` 写入发布说明,支持多行文本且保留内部换行;`--no-bundle` smoke 构建不会读取 OSS、修改版本或生成清单。
**发布前先提升版本(开发者执行)**
执行以下任一命令,会把 AGC 版本写入 `package.json`、根 `package-lock.json`、
`tauri.conf.json`、`Cargo.toml`、`Cargo.lock` 五处并**本地提交**(不会推送):
```bash
# 提升一个 patch(默认),例如 0.1.19 -> 0.1.20
npm run ai-game-creator-shell:bump-version
npm run ai-game-creator-shell:bump-version -- patch
# 提升 minor / major
npm run ai-game-creator-shell:bump-version -- minor
npm run ai-game-creator-shell:bump-version -- major
# 指定明确的三段版本(一般只用于复现/回填)
npm run ai-game-creator-shell:bump-version -- --version 0.1.25
```
提交标题固定为“提升 AGC 版本至 x.y.z”。只做本地提交,push 由开发者自行确认。
**发布只读仓库版本(`npm run ai-game-creator-shell:build` 与 `release:upload`)**
构建/发布不再改写版本文件,而是读取仓库已提交版本,并在发布前做两件事:
1. 校验五个版本来源一致,不一致会中止,防止漂移。
2. 通过 `assertVersionNotBelowOss` 读取 OSS `latest.json`:若仓库版本**低于**线上版本会中止,
并提示先运行 `bump-version`,避免回退线上版本;OSS 读取失败或清单格式错误同样会中止。
仓库版本等于或高于线上版本才放行。
当前发布目标固定为 Windows x64 NSIS,会向 Tauri 传入 `--target x86_64-pc-windows-msvc` 构建。
构建完成后自动扫描 `.exe` 安装包,并在
`apps/ai-game-creator-shell/src-tauri/target/x86_64-pc-windows-msvc/release/bundle/latest.json`
生成包含版本、下载地址、大小和 SHA-256 的清单,版本取仓库 `package.json` 的 `version`。
可通过 `AGC_BUILD_TARGET` 显式覆盖目标(发布仍应使用 Windows x64),通过 `AGC_UPDATE_ARTIFACT`
指定要发布的安装包,通过 `AGC_UPDATE_OSS_BASE_URL` 指定 OSS 前缀,通过 `AGC_UPDATE_RELEASE_NOTES`
写入发布说明(支持多行文本且保留内部换行);`--no-bundle` smoke 构建不会读取 OSS、修改版本或生成清单。
每次发布安装包上传完成后,再使用 ossutil 的 `--force` 覆盖上传同一目录生成的 `latest.json`,确保固定的 latest 指针和 `downloadUrl` 指向已存在的 OSS 对象;未显式强制覆盖时,ossutil 在目标已存在时会交互询问并按默认值跳过,不能作为 Jenkins 非交互发布方式。清单和安装包均使用公开可读对象,不在清单中保存凭据、签名或本地路径。构建脚本本身不负责上传 OSS,发布流水线通过 `release:upload` 完成上传。
如需一键构建并上传,可执行 `npm run ai-game-creator-shell:release:upload`。该命令要求本机已安装并配置 `ossutil`,
先按上述规则比较 OSS 版本、递增 patch、构建 Windows x64 NSIS,再上传安装包和 `latest.json`。默认上传到
先按上述规则取仓库版本并校验、构建 Windows x64 NSIS,再上传安装包和 `latest.json`。默认上传到
`agc-dev` / `oss-rg-china-mainland.aliyuncs.com`,也可用 `AGC_OSS_BUCKET`、`AGC_OSS_ENDPOINT` 和 `OSSUTIL_BIN`
覆盖;本机执行时凭据由 ossutil 本机配置读取,不能写入仓库或命令行参数。
@@ -70,6 +93,6 @@ Jenkins Checkout 的 `git clean -fdx` 会清理该构建目录,因此每次全
Jenkins Job 在“Build and upload”阶段通过受保护凭据 ID `AliyunAccessKeyId` 和
`AliyunaccessKeySecret` 注入 AccessKey,仅在当前进程运行时传给 ossutil,不写入仓库、workspace 或构建日志;
本机运行仍使用 ossutil 配置。凭据必须具备 `PutObject` 权限;OSS 对客户端保持公共读即可,公共读本身不授予
Jenkins 上传权限。由于版本号取决于 OSS 当前清单,Job 已关闭并发构建;若 Jenkins
上存在多个 AGC 发布 Job,还应使用同一个 Lockable Resource 串行化发布。Job 参数
`AGC_RELEASE_VERSION` 留空时自动递增,填写后会使用指定版本并更新对应的 `latest.json`,因此回滚或测试旧版本前应确认不会覆盖线上更新入口。
Jenkins 上传权限。由于版本号以仓库为准、发布只读仓库版本且禁止回退线上版本,Job 已关闭并发构建;若 Jenkins
上存在多个 AGC 发布 Job,还应使用同一个 Lockable Resource 串行化发布。发布前请先在仓库上运行
`npm run ai-game-creator-shell:bump-version` 提升并提交版本,再触发发布流水线。