Make admin upgrade restart non-blocking

This commit is contained in:
FengLee
2026-05-10 00:01:01 +08:00
parent 24be9c550b
commit 66c82fd1ee

View File

@@ -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: '重启平台' });
}