feat(update): add Onebox self-upgrade flow

This commit is contained in:
2026-05-24 11:49:43 +00:00
parent 4812621376
commit 05235ec284
10 changed files with 487 additions and 48 deletions
+12 -42
View File
@@ -8,6 +8,7 @@ import { getErrorMessage } from './utils/error.ts';
import { Onebox } from './classes/onebox.ts';
import { OneboxDaemon } from './classes/daemon.ts';
import { OneboxSystemd } from './classes/systemd.ts';
import { OneboxUpdateManager } from './classes/update-manager.ts';
import type { IAppVersionConfig } from './classes/appstore-types.ts';
export async function runCli(): Promise<void> {
@@ -500,60 +501,29 @@ async function handleUpgradeCommand(): Promise<void> {
logger.info('Checking for updates...');
try {
// Get current version
const currentVersion = projectInfo.version;
const updateManager = new OneboxUpdateManager();
const status = await updateManager.getUpdateStatus({ force: true });
if (status.error) {
throw new Error(status.error);
}
// Fetch latest version from Gitea API
const apiUrl = 'https://code.foss.global/api/v1/repos/serve.zone/onebox/releases/latest';
const curlCmd = new Deno.Command('curl', {
args: ['-sSL', apiUrl],
stdout: 'piped',
stderr: 'piped',
});
const curlResult = await curlCmd.output();
const response = new TextDecoder().decode(curlResult.stdout);
const release = JSON.parse(response);
const latestVersion = release.tag_name as string; // e.g., "v1.11.0"
// Normalize versions for comparison (ensure both have "v" prefix)
const normalizedCurrent = currentVersion.startsWith('v')
? currentVersion
: `v${currentVersion}`;
const normalizedLatest = latestVersion.startsWith('v')
? latestVersion
: `v${latestVersion}`;
console.log(` Current version: ${normalizedCurrent}`);
console.log(` Latest version: ${normalizedLatest}`);
console.log(` Current version: ${status.currentVersion}`);
console.log(` Latest version: ${status.latestVersion}`);
console.log('');
// Compare normalized versions
if (normalizedCurrent === normalizedLatest) {
if (!status.updateAvailable) {
logger.success('Already up to date!');
return;
}
logger.info(`New version available: ${latestVersion}`);
logger.info(`New version available: ${status.latestVersion}`);
logger.info('Downloading and installing...');
console.log('');
// Download and run the install script
const installUrl = 'https://code.foss.global/serve.zone/onebox/raw/branch/main/install.sh';
const installCmd = new Deno.Command('bash', {
args: ['-c', `curl -sSL ${installUrl} | bash`],
stdin: 'inherit',
stdout: 'inherit',
stderr: 'inherit',
});
const installResult = await installCmd.output();
if (!installResult.success) {
logger.error('Upgrade failed');
Deno.exit(1);
}
const upgrade = await updateManager.runUpgradeForeground(status);
console.log('');
logger.success(`Upgraded to ${latestVersion}`);
logger.success(upgrade.message);
} catch (error) {
logger.error(`Upgrade failed: ${getErrorMessage(error)}`);
Deno.exit(1);