import path from 'node:path'; import url from 'node:url'; import { execSync } from 'node:child_process'; import { runBuild } from './build.ts'; // lib/ 在 cms/ 下,仓库根取上上级目录 const __dirname = path.dirname(url.fileURLToPath(import.meta.url)); const REPO_ROOT = path.resolve(__dirname, '../..'); const ENV_ID = (process.env.TCB_ENV_ID || 'tcbjssdk-cdn-5g9n6m9scceec659').trim(); const CMS_ENV = process.env.CMS_ENV === 'prod' ? 'prod' : 'pre'; export async function runPublish() { if (!process.env.API_KEYID || !process.env.API_KEY) { throw new Error('缺少 API_KEYID / API_KEY 环境变量'); } // 构建产物到 cms/dist/(不按 env 分层) await runBuild(); // tcb cli 未安装时才全局安装 if (!has('tcb --version')) sh('npm i -g @cloudbase/cli@latest'); sh('tcb login --apiKeyId "$API_KEYID" --apiKey "$API_KEY" --yes'); // 部署 dist/ 到托管子目录 cms/ // --yes 跳过确认;--verbose 输出详细日志;--concurrency/--retry-count 提升上传可靠性 sh( `tcb hosting deploy cms/dist cms/${CMS_ENV} -e ${ENV_ID} --yes --verbose --concurrency 5 --retry-count 3`, { COS_SDK_KEEPALIVE: 'false', USE_INTERNAL_ENDPOINT: 'true' }, ); sh(`tcb hosting list -e ${ENV_ID} --yes`); const cdnBase = (process.env.CDN_BASE ?? '').trim(); console.log(`\n[publish] done. 目录: ${cdnBase}/cms/${CMS_ENV}`); } function sh(command: string, env: Record = {}) { console.log(`\n[publish] $ ${command}`); execSync(command, { stdio: 'inherit', cwd: REPO_ROOT, env: { ...process.env, ...env } }); } function has(command: string) { try { execSync(command, { stdio: 'pipe' }); return true; } catch { return false; } } const __mainFile = url.fileURLToPath(import.meta.url); if (process.argv[1] && path.resolve(process.argv[1]) === __mainFile) { runPublish().catch((err) => { console.error(err); process.exit(1); }); }