diff --git a/apps/ai-game-creator-shell/package.json b/apps/ai-game-creator-shell/package.json index ae8f2b9fc..50f3050c7 100644 --- a/apps/ai-game-creator-shell/package.json +++ b/apps/ai-game-creator-shell/package.json @@ -8,6 +8,7 @@ "dev-server": "node scripts/start-dev-server.mjs", "dev-stack": "node scripts/start-dev-stack.mjs", "build": "node scripts/build-release.mjs", + "release:upload": "node scripts/release-upload.mjs", "skill-pack:check": "node scripts/check-skill-pack.mjs", "skill-pack:sync": "node scripts/check-skill-pack.mjs --write", "skill-pack:test": "node --test scripts/check-skill-pack.test.mjs", diff --git a/apps/ai-game-creator-shell/scripts/build-release.mjs b/apps/ai-game-creator-shell/scripts/build-release.mjs index c970c8555..643723e57 100644 --- a/apps/ai-game-creator-shell/scripts/build-release.mjs +++ b/apps/ai-game-creator-shell/scripts/build-release.mjs @@ -22,7 +22,7 @@ const packageJson = JSON.parse( const defaultOssBaseUrl = 'https://agc-dev.oss-rg-china-mainland.aliyuncs.com/agc'; -function runTauriBuild(args) { +export function runTauriBuild(args = []) { const noBundle = args.includes('--no-bundle'); const hasTarget = args.includes('--target'); const targetArgs = noBundle || hasTarget ? [] : ['--target', releaseTarget]; diff --git a/apps/ai-game-creator-shell/scripts/release-upload.mjs b/apps/ai-game-creator-shell/scripts/release-upload.mjs new file mode 100644 index 000000000..5b602512a --- /dev/null +++ b/apps/ai-game-creator-shell/scripts/release-upload.mjs @@ -0,0 +1,34 @@ +import { spawnSync } from 'node:child_process'; +import path from 'node:path'; + +const bucket = process.env.AGC_OSS_BUCKET?.trim() || 'agc-dev'; +const endpoint = + process.env.AGC_OSS_ENDPOINT?.trim() || 'oss-rg-china-mainland.aliyuncs.com'; +if (!/^[a-z0-9][a-z0-9.-]{1,62}$/u.test(bucket) || /[\r\n\0]/u.test(endpoint)) { + throw new Error('OSS bucket 或 endpoint 配置无效'); +} +process.env.AGC_UPDATE_OSS_BASE_URL ||= `https://${bucket}.${endpoint}/agc`; + +const { generateUpdateManifest, runTauriBuild } = await import( + './build-release.mjs' +); + +function runOssutil(args) { + const binary = process.env.OSSUTIL_BIN?.trim() || 'ossutil'; + const result = spawnSync(binary, [...args, '--endpoint', endpoint], { + stdio: 'inherit', + shell: false, + }); + if (result.error) { + throw new Error(`无法执行 ${binary},请先安装并配置 ossutil`); + } + if (result.status !== 0) process.exit(result.status ?? 1); +} + +runTauriBuild([]); +const { artifact, manifestPath, manifest } = generateUpdateManifest(); +const artifactKey = `agc/${manifest.version}/${path.basename(artifact)}`; +runOssutil(['cp', artifact, `oss://${bucket}/${artifactKey}`]); +runOssutil(['cp', manifestPath, `oss://${bucket}/agc/latest.json`]); +console.log(`[ai-game-creator-shell] 已上传 oss://${bucket}/${artifactKey}`); +console.log(`[ai-game-creator-shell] 已上传 oss://${bucket}/agc/latest.json`); diff --git a/docs/technical/【技术方案】AGC客户端更新检查与下载-2026-08-31.md b/docs/technical/【技术方案】AGC客户端更新检查与下载-2026-08-31.md index 3d92339e7..9c5f26e0b 100644 --- a/docs/technical/【技术方案】AGC客户端更新检查与下载-2026-08-31.md +++ b/docs/technical/【技术方案】AGC客户端更新检查与下载-2026-08-31.md @@ -32,3 +32,5 @@ AGC 每次启动时由根窗口检查一次公开 OSS 更新清单。清单默 当前发布目标固定为 Windows x64 NSIS。执行 `npm run ai-game-creator-shell:build` 会向 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 的清单。可通过 `AGC_BUILD_TARGET` 显式覆盖目标(发布仍应使用 Windows x64),通过 `AGC_UPDATE_ARTIFACT` 指定要发布的安装包,通过 `AGC_UPDATE_OSS_BASE_URL` 指定 OSS 前缀,通过 `AGC_UPDATE_RELEASE_NOTES` 写入发布说明;`--no-bundle` smoke 构建不会生成清单。 每次发布安装包上传完成后,再上传同一目录生成的 `latest.json`,确保 `downloadUrl` 指向已存在的 OSS 对象;清单和安装包均使用公开可读对象,不在清单中保存凭据、签名或本地路径。构建脚本不自动上传 OSS,避免把 AccessKey 写入本地配置或 CI 日志。 + +如需一键构建并上传,可执行 `npm run ai-game-creator-shell:release:upload`。该命令要求本机已安装并配置 `ossutil`,先构建 Windows x64 NSIS,再上传安装包和 `latest.json`。默认上传到 `agc-dev` / `oss-rg-china-mainland.aliyuncs.com`,也可用 `AGC_OSS_BUCKET`、`AGC_OSS_ENDPOINT` 和 `OSSUTIL_BIN` 覆盖;凭据由 ossutil 本机配置读取,不能写入仓库或命令行参数。 diff --git a/package.json b/package.json index 617fb24cd..3002ad3fa 100644 --- a/package.json +++ b/package.json @@ -170,6 +170,7 @@ "ai-game-creator-shell:dev": "npm --prefix apps/ai-game-creator-shell run dev", "ai-game-creator-shell:dev-server": "npm --prefix apps/ai-game-creator-shell run dev-server", "ai-game-creator-shell:build": "npm --prefix apps/ai-game-creator-shell run build --", + "ai-game-creator-shell:release:upload": "npm --prefix apps/ai-game-creator-shell run release:upload", "ai-game-creator-shell:llm-status": "npm --prefix apps/ai-game-creator-shell run llm-status --", "ai-game-creator-shell:agent-task": "npm --prefix apps/ai-game-creator-shell run agent-task --", "agc:chat": "npm --prefix apps/ai-game-creator-shell run chat --",