From 53070e0390216d2319058a13805995c609a3c4ae Mon Sep 17 00:00:00 2001 From: kdletters Date: Thu, 3 Sep 2026 10:36:43 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E6=8C=81=20AGC=20=E5=A4=9A=E8=A1=8C?= =?UTF-8?q?=E5=8F=91=E5=B8=83=E8=AF=B4=E6=98=8E=20Jenkins=20=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E6=94=B9=E4=B8=BA=E5=A4=9A=E8=A1=8C=E6=96=87=E6=9C=AC?= =?UTF-8?q?=E8=BE=93=E5=85=A5=20=E5=AE=A2=E6=88=B7=E7=AB=AF=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E6=8F=90=E7=A4=BA=E4=BF=9D=E7=95=99=E6=8D=A2=E8=A1=8C?= =?UTF-8?q?=E5=B9=B6=E6=94=AF=E6=8C=81=E6=BB=9A=E5=8A=A8=20=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E6=B8=85=E5=8D=95=E4=B8=8E=E5=AE=A2=E6=88=B7=E7=AB=AF?= =?UTF-8?q?=E5=A4=9A=E8=A1=8C=E8=AF=B4=E6=98=8E=E6=B5=8B=E8=AF=95=20?= =?UTF-8?q?=E5=90=8C=E6=AD=A5=20AGC=20=E6=9B=B4=E6=96=B0=E5=8F=91=E5=B8=83?= =?UTF-8?q?=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../scripts/build-release.test.mjs | 14 ++++++++++++++ apps/ai-game-creator-shell/src/styles.css | 7 ++++--- apps/ai-game-creator-shell/tests/appUpdate.test.ts | 12 ++++++++++++ ...技术方案】AGC客户端更新检查与下载-2026-08-31.md | 4 ++-- jenkins/Jenkinsfile.ai-game-creator-shell-build | 2 +- 5 files changed, 33 insertions(+), 6 deletions(-) diff --git a/apps/ai-game-creator-shell/scripts/build-release.test.mjs b/apps/ai-game-creator-shell/scripts/build-release.test.mjs index 798bd206f..d2853082f 100644 --- a/apps/ai-game-creator-shell/scripts/build-release.test.mjs +++ b/apps/ai-game-creator-shell/scripts/build-release.test.mjs @@ -41,6 +41,20 @@ test('manifest contains version, download URL and integrity fields', () => { assert.equal(typeof manifest.size, 'number'); }); +test('manifest preserves multiline release notes', () => { + const previous = process.env.AGC_UPDATE_RELEASE_NOTES; + process.env.AGC_UPDATE_RELEASE_NOTES = '第一行\n第二行\r\n第三行'; + try { + const manifest = createUpdateManifest( + new URL('../package.json', import.meta.url).pathname, + ); + assert.equal(manifest.releaseNotes, '第一行\n第二行\r\n第三行'); + } finally { + if (previous === undefined) delete process.env.AGC_UPDATE_RELEASE_NOTES; + else process.env.AGC_UPDATE_RELEASE_NOTES = previous; + } +}); + test('next release version follows the higher local or OSS version', () => { assert.equal(compareVersions('0.1.15', '0.1.12'), 1); assert.equal(nextPatchVersion('0.1.12', '0.1.15'), '0.1.16'); diff --git a/apps/ai-game-creator-shell/src/styles.css b/apps/ai-game-creator-shell/src/styles.css index 38f586369..ee8e4e96d 100644 --- a/apps/ai-game-creator-shell/src/styles.css +++ b/apps/ai-game-creator-shell/src/styles.css @@ -55,9 +55,10 @@ body { } .app-update-notice p { max-width: 320px; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; + max-height: 120px; + overflow-y: auto; + overflow-wrap: anywhere; + white-space: pre-wrap; } .app-update-notice button { flex: 0 0 auto; diff --git a/apps/ai-game-creator-shell/tests/appUpdate.test.ts b/apps/ai-game-creator-shell/tests/appUpdate.test.ts index 1348ce9c2..8bbe1e596 100644 --- a/apps/ai-game-creator-shell/tests/appUpdate.test.ts +++ b/apps/ai-game-creator-shell/tests/appUpdate.test.ts @@ -32,4 +32,16 @@ describe('AGC update manifest', () => { }), ).toBeNull(); }); + + it('preserves multiline release notes', () => { + expect( + parseAppUpdateManifest({ + version: '0.1.13', + downloadUrl: 'https://oss.example/agc.exe', + releaseNotes: '第一行\n第二行\r\n第三行', + }), + ).toMatchObject({ + releaseNotes: '第一行\n第二行\r\n第三行', + }); + }); }); diff --git a/docs/technical/ã€æŠ€æœ¯æ–¹æ¡ˆã€‘AGC客户端更新检查与下载-2026-08-31.md b/docs/technical/ã€æŠ€æœ¯æ–¹æ¡ˆã€‘AGC客户端更新检查与下载-2026-08-31.md index 455c37670..29eae7a7f 100644 --- a/docs/technical/ã€æŠ€æœ¯æ–¹æ¡ˆã€‘AGC客户端更新检查与下载-2026-08-31.md +++ b/docs/technical/ã€æŠ€æœ¯æ–¹æ¡ˆã€‘AGC客户端更新检查与下载-2026-08-31.md @@ -38,7 +38,7 @@ OSS è¯·æ±‚å¤±è´¥ã€æ¸…啿 ¼å¼é”™è¯¯æˆ–版本无效会终止å‘布,é¿å…覆 生æˆåŒ…å«ç‰ˆæœ¬ã€ä¸‹è½½åœ°å€ã€å¤§å°å’Œ 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_UPDATE_RELEASE_NOTES` 写入å‘布说明,支æŒå¤šè¡Œæ–‡æœ¬ä¸”ä¿ç•™å†…部æ¢è¡Œï¼›`--no-bundle` smoke 构建ä¸ä¼šè¯»å– OSSã€ä¿®æ”¹ç‰ˆæœ¬æˆ–ç”Ÿæˆæ¸…å•。 æ¯æ¬¡å‘布安装包上传完æˆåŽï¼Œå†ä½¿ç”¨ ossutil çš„ `--force` 覆盖上传åŒä¸€ç›®å½•生æˆçš„ `latest.json`,确ä¿å›ºå®šçš„ latest 指针和 `downloadUrl` 指å‘已存在的 OSS 对象;未显å¼å¼ºåˆ¶è¦†ç›–时,ossutil 在目标已存在时会交互询问并按默认值跳过,ä¸èƒ½ä½œä¸º Jenkins éžäº¤äº’å‘布方å¼ã€‚清å•和安装包å‡ä½¿ç”¨å…¬å¼€å¯è¯»å¯¹è±¡ï¼Œä¸åœ¨æ¸…å•中ä¿å­˜å‡­æ®ã€ç­¾å或本地路径。构建脚本本身ä¸è´Ÿè´£ä¸Šä¼  OSS,å‘å¸ƒæµæ°´çº¿é€šè¿‡ `release:upload` 完æˆä¸Šä¼ ã€‚ @@ -56,7 +56,7 @@ Jenkins Agent æœåŠ¡å¿…é¡»èƒ½åœ¨åŒä¸€ç”¨æˆ·çŽ¯å¢ƒä¸­æ‰¾åˆ°è¿™äº›å‘½ä»¤ã€‚Tauri `tauri.windows.conf.json` 中的 `bundle.useLocalToolsDir: true`,把固定版本的 NSIS 工具缓存到 `src-tauri/target/.tauri/NSIS`,ä¸ä¾èµ– Jenkins æœåŠ¡è´¦æˆ·çš„ `%LOCALAPPDATA%\tauri` 或 PATH 中的系统 NSIS。 Jenkins Checkout çš„ `git clean -fdx` 会清ç†è¯¥æž„å»ºç›®å½•ï¼Œå› æ­¤æ¯æ¬¡å…¨æ–°å·¥ä½œåŒºå¯èƒ½é‡æ–°ä¸‹è½½ NSIS;这åªå½±å“æž„å»ºè€—æ—¶ï¼Œä¸æ”¹å˜å·¥å…·æ¥æºæˆ–执行æƒé™è¦æ±‚。 -æµæ°´çº¿æ‰§è¡Œæ ¹ workspace çš„ `npm ci`,然åŽè°ƒç”¨ +æµæ°´çº¿å‚æ•° `AGC_UPDATE_RELEASE_NOTES` 使用 Jenkins `text` 类型,å¯ç›´æŽ¥è¾“入多行å‘布说明;执行根 workspace çš„ `npm ci`,然åŽè°ƒç”¨ `npm run ai-game-creator-shell:release:upload`,并归档 Windows 安装包ã€`latest.json` 与æºç  commit。 æµæ°´çº¿ä¼šå°†æœªå¯¼å‡ºçš„ç©ºå‚æ•°æŒ‰ç©ºå­—符串处ç†ï¼š`COMMIT_HASH` 留空时沿用 Jenkins SCM å½“å‰æäº¤ï¼Œ`OSSUTIL_BIN` 留空时使用节点 PATH 中的 `ossutil`,ä¸ä¼šå›  PowerShell 对空环境å˜é‡è°ƒç”¨ `.Trim()` 而æå‰å¤±è´¥ã€‚ diff --git a/jenkins/Jenkinsfile.ai-game-creator-shell-build b/jenkins/Jenkinsfile.ai-game-creator-shell-build index 8803fa375..3e304cf63 100644 --- a/jenkins/Jenkinsfile.ai-game-creator-shell-build +++ b/jenkins/Jenkinsfile.ai-game-creator-shell-build @@ -22,7 +22,7 @@ pipeline { string(name: 'SOURCE_BRANCH', defaultValue: 'master', description: 'æºç åˆ†æ”¯') string(name: 'COMMIT_HASH', defaultValue: '', description: 'å¯é€‰ï¼ŒæŒ‡å®šå±žäºŽ SOURCE_BRANCH çš„ Git commit') string(name: 'AGC_RELEASE_VERSION', defaultValue: '', description: 'å¯é€‰ï¼ŒæŒ‡å®šä¸‰æ®µç‰ˆæœ¬å·ï¼›ç•™ç©ºåˆ™æŒ‰ OSS 与本地版本自动递增 patch') - string(name: 'AGC_UPDATE_RELEASE_NOTES', defaultValue: '', description: 'å¯é€‰ï¼Œå†™å…¥ latest.json çš„å‘布说明') + text(name: 'AGC_UPDATE_RELEASE_NOTES', defaultValue: '', description: 'å¯é€‰ï¼Œæ”¯æŒå¤šè¡Œæ–‡æœ¬ï¼Œå†™å…¥ latest.json çš„å‘布说明') string(name: 'OSSUTIL_BIN', defaultValue: 'ossutil', description: 'ossutil 或 ossutil.exe çš„ç»å¯¹è·¯å¾„/命令å') }