初始化兜爸心选 App 官网项目(构建与发布)
- 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 助手协助完成。
This commit is contained in:
27
scripts/rollback.mjs
Normal file
27
scripts/rollback.mjs
Normal file
@@ -0,0 +1,27 @@
|
||||
// 回滚:把线上目录换回最近一次发布前的备份
|
||||
// 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} 确认。`);
|
||||
Reference in New Issue
Block a user