- src/:从线上 shop.douba.top/public/app 拉取的页面源码(v0.3.8) - 版本号、更新日期、安装包大小改为模板变量,统一由 site.config.json 管理, 安装包大小在构建时从 APK 实际字节数计算 - scripts/build.mjs:构建到 dist/,校验 APK、模板变量与资源引用 - scripts/deploy.mjs:与线上比对差异 → 上传 → 备份 → 原子切换 → 线上验证 - scripts/rollback.mjs、scripts/preview.mjs:回滚与本地预览 - AGENTS.md:项目说明、发版流程与服务器/nginx 约定 由 AI 助手协助完成。
28 lines
1.1 KiB
JavaScript
28 lines
1.1 KiB
JavaScript
// 回滚:把线上目录换回最近一次发布前的备份
|
|
// node scripts/rollback.mjs 回滚到最近的备份
|
|
// node scripts/rollback.mjs --list 列出可用备份
|
|
import { spawnSync } from 'node:child_process';
|
|
import { loadConfig } from './build.mjs';
|
|
|
|
const { host, siteDir, publicUrl } = loadConfig().deploy;
|
|
const live = `${siteDir}/public/app`;
|
|
const backups = `${siteDir}/.deploy/backups`;
|
|
const list = process.argv.includes('--list');
|
|
|
|
const script = list
|
|
? `ls -1d ${backups}/app-* 2>/dev/null | sort -r || echo "(没有备份)"`
|
|
: `
|
|
latest=$(ls -1d ${backups}/app-* 2>/dev/null | sort -r | head -1)
|
|
[ -n "$latest" ] || { echo "没有可回滚的备份" >&2; exit 1; }
|
|
mv ${live} ${siteDir}/.deploy/rolled-back-$(date +%Y%m%d-%H%M%S)
|
|
mv "$latest" ${live}
|
|
echo "已回滚到 $latest"
|
|
`;
|
|
|
|
const r = spawnSync('ssh', ['-o', 'BatchMode=yes', host, 'bash -s'], {
|
|
input: `set -euo pipefail\n${script}`,
|
|
stdio: ['pipe', 'inherit', 'inherit'],
|
|
});
|
|
if (r.status !== 0) process.exit(r.status ?? 1);
|
|
if (!list) console.log(`请打开 ${publicUrl} 确认。`);
|