初始化兜爸心选 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:
douba
2026-10-29 06:20:35 +00:00
commit 72648b4914
29 changed files with 1899 additions and 0 deletions

27
scripts/rollback.mjs Normal file
View 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} 确认。`);