From 66c82fd1ee95d9a5f2e3188055efea2649462cf7 Mon Sep 17 00:00:00 2001 From: FengLee Date: Sun, 10 May 2026 00:01:01 +0800 Subject: [PATCH] Make admin upgrade restart non-blocking --- scripts/admin-upgrade-runner.mjs | 36 ++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/scripts/admin-upgrade-runner.mjs b/scripts/admin-upgrade-runner.mjs index 0511313..4ebb924 100755 --- a/scripts/admin-upgrade-runner.mjs +++ b/scripts/admin-upgrade-runner.mjs @@ -178,24 +178,17 @@ async function main() { run('pnpm', ['run', 'build'], { cwd: projectRoot, label: '构建平台' }); logStep('平台构建完成', '生产构建已完成'); - updateState({ step: 'restart', progress: 86, message: '正在重启平台进程' }); - logStep('重启平台', '冷更新需要重启平台进程,重启后升级状态会从磁盘继续读取'); - restartPlatform(); - logStep('平台重启命令完成', '平台重启命令已执行,开始等待健康检查'); - - updateState({ step: 'health_check', progress: 94, message: '正在检查平台健康状态' }); - logStep('健康检查', '正在确认平台接口恢复正常'); - waitForHealth(); - logStep('冷更新完成', '平台已重启并通过健康检查'); - + updateState({ step: 'restart', progress: 94, message: '构建已完成,正在后台重启平台进程' }); + logStep('冷更新完成', '升级文件已应用并完成构建,将在后台重启平台进程'); updateState({ status: 'succeeded', step: 'completed', progress: 100, - message: '冷更新成功,平台已重启并通过健康检查', + message: '冷更新成功,平台正在后台重启', finishedAt: new Date().toISOString(), restartRequired: true, }); + restartPlatform({ detached: true }); } async function rollbackAfterFailure(message) { @@ -229,10 +222,7 @@ async function rollbackAfterFailure(message) { try { logStep('回滚后重建', '冷更新失败后正在重新构建回滚版本'); run('pnpm', ['run', 'build'], { cwd: projectRoot, label: '回滚后重新构建' }); - logStep('回滚后重启', '正在重启回滚后的平台版本'); - restartPlatform(); - waitForHealth(); - logStep('回滚后健康检查通过', '平台已恢复到升级前版本'); + logStep('回滚后重启', '将后台重启回滚后的平台版本'); } catch (error) { throw new Error(`回滚后平台恢复检查失败: ${error instanceof Error ? error.message : String(error)}`); } @@ -247,6 +237,9 @@ async function rollbackAfterFailure(message) { error: originalError, finishedAt: new Date().toISOString(), }); + if (mode === 'cold') { + restartPlatform({ detached: true }); + } } function parseArgs(argv) { @@ -471,8 +464,19 @@ function restoreSourceBackup(source) { ], { cwd: projectRoot, label: '恢复源码快照' }); } -function restartPlatform() { +function restartPlatform(options = {}) { const restartCommand = process.env.UPGRADE_RESTART_COMMAND || detectRestartCommand(); + if (options.detached) { + const logFile = path.join(jobDir, 'restart.log'); + const detachedCommand = `nohup bash -lc ${JSON.stringify(restartCommand)} >> ${JSON.stringify(logFile)} 2>&1 &`; + spawnSync('bash', ['-lc', detachedCommand], { + cwd: projectRoot, + env: { ...process.env, COREPACK_HOME: process.env.COREPACK_HOME || '/tmp/corepack' }, + encoding: 'utf8', + }); + logStep('后台重启平台', `已触发后台重启命令,日志:${logFile}`); + return; + } run('bash', ['-lc', restartCommand], { cwd: projectRoot, label: '重启平台' }); }