修改部署js
This commit is contained in:
@@ -15,6 +15,15 @@ const fs = require('fs');
|
||||
const path = require('path');
|
||||
const { execSync } = require('child_process');
|
||||
|
||||
// CDN SDK (可选,如果安装了的话)
|
||||
let CdnClient = null;
|
||||
try {
|
||||
const tencentcloud = require('tencentcloud-sdk-nodejs-cdn');
|
||||
CdnClient = tencentcloud.cdn.v20180606.Client;
|
||||
} catch (e) {
|
||||
// CDN SDK 未安装,稍后会提示用户
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
// 配置加载
|
||||
// ============================================================================
|
||||
@@ -284,25 +293,86 @@ async function uploadBuildDir() {
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
// CDN 刷新(可选)
|
||||
// CDN 刷新
|
||||
// ============================================================================
|
||||
|
||||
/**
|
||||
* 刷新 CDN 缓存
|
||||
* 注意:需要额外配置 CDN API 权限
|
||||
* 自动刷新 index.html 等关键文件,确保用户获取最新版本
|
||||
*/
|
||||
async function refreshCDN() {
|
||||
if (!config.CDN_DOMAIN) {
|
||||
console.log('\n\x1b[33m[提示]\x1b[0m 未配置 CDN 域名,跳过 CDN 刷新');
|
||||
console.log(' 如需自动刷新 CDN,请在 .env.cos 中配置 CDN_DOMAIN');
|
||||
return;
|
||||
return { success: false, reason: 'no_domain' };
|
||||
}
|
||||
|
||||
// 检查是否安装了 CDN SDK
|
||||
if (!CdnClient) {
|
||||
console.log('\n\x1b[33m[提示]\x1b[0m CDN SDK 未安装,跳过自动刷新');
|
||||
console.log(' 安装命令: npm install tencentcloud-sdk-nodejs-cdn --save-dev');
|
||||
console.log(' 或手动刷新: https://console.cloud.tencent.com/cdn/refresh');
|
||||
return { success: false, reason: 'no_sdk' };
|
||||
}
|
||||
|
||||
console.log('\n\x1b[36m[CDN]\x1b[0m 刷新 CDN 缓存...');
|
||||
console.log(` 域名: ${config.CDN_DOMAIN}`);
|
||||
console.log('\n\x1b[33m[提示]\x1b[0m 由于文件名包含 hash,通常不需要手动刷新 CDN');
|
||||
console.log(' 如需刷新,请到腾讯云 CDN 控制台操作:');
|
||||
console.log(' https://console.cloud.tencent.com/cdn/refresh');
|
||||
|
||||
try {
|
||||
// 初始化 CDN 客户端
|
||||
const cdnClient = new CdnClient({
|
||||
credential: {
|
||||
secretId: config.COS_SECRET_ID,
|
||||
secretKey: config.COS_SECRET_KEY,
|
||||
},
|
||||
region: '', // CDN 为全局服务,region 留空
|
||||
profile: {
|
||||
signMethod: 'TC3-HMAC-SHA256',
|
||||
httpProfile: {
|
||||
reqMethod: 'POST',
|
||||
reqTimeout: 30,
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
// 需要刷新的关键文件(不带 hash 的文件)
|
||||
const domain = config.CDN_DOMAIN.replace(/^https?:\/\//, '');
|
||||
const urlsToRefresh = [
|
||||
`https://${domain}/index.html`,
|
||||
`https://${domain}/`,
|
||||
`https://${domain}/asset-manifest.json`,
|
||||
`https://${domain}/manifest.json`,
|
||||
];
|
||||
|
||||
console.log(' 刷新文件:');
|
||||
urlsToRefresh.forEach(url => console.log(` - ${url}`));
|
||||
|
||||
// 调用 PurgeUrlsCache 接口
|
||||
const result = await cdnClient.PurgeUrlsCache({
|
||||
Urls: urlsToRefresh,
|
||||
});
|
||||
|
||||
console.log(`\n\x1b[32m[✓]\x1b[0m CDN 刷新任务已提交`);
|
||||
console.log(` 任务ID: ${result.TaskId}`);
|
||||
console.log(' 刷新生效时间约 5 分钟');
|
||||
|
||||
return { success: true, taskId: result.TaskId };
|
||||
|
||||
} catch (err) {
|
||||
console.error(`\n\x1b[33m[警告]\x1b[0m CDN 刷新失败: ${err.message}`);
|
||||
|
||||
// 提供常见错误的解决方案
|
||||
if (err.code === 'AuthFailure.SecretIdNotFound' || err.code === 'AuthFailure.SignatureFailure') {
|
||||
console.log(' 请检查 API 密钥是否正确');
|
||||
} else if (err.code === 'UnauthorizedOperation') {
|
||||
console.log(' 请确保 API 密钥有 CDN 刷新权限');
|
||||
console.log(' 权限策略: QcloudCDNFullAccess 或自定义 cdn:PurgeUrlsCache');
|
||||
}
|
||||
|
||||
console.log('\n 可手动刷新: https://console.cloud.tencent.com/cdn/refresh');
|
||||
|
||||
return { success: false, reason: 'api_error', error: err.message };
|
||||
}
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
@@ -329,8 +399,8 @@ async function main() {
|
||||
// 3. 上传文件
|
||||
const { uploaded, failed } = await uploadBuildDir();
|
||||
|
||||
// 4. CDN 刷新提示
|
||||
await refreshCDN();
|
||||
// 4. CDN 刷新
|
||||
const cdnResult = await refreshCDN();
|
||||
|
||||
// 5. 完成
|
||||
const duration = ((Date.now() - startTime) / 1000).toFixed(1);
|
||||
@@ -340,9 +410,13 @@ async function main() {
|
||||
console.log('╚════════════════════════════════════════════════════════════════╝');
|
||||
console.log(`\n 耗时: ${duration} 秒`);
|
||||
console.log(` 上传: ${uploaded} 个文件`);
|
||||
console.log(` CDN刷新: ${cdnResult.success ? '✓ 已提交' : '✗ 跳过'}`);
|
||||
|
||||
if (config.CDN_DOMAIN) {
|
||||
console.log(`\n 访问地址: https://${config.CDN_DOMAIN}`);
|
||||
if (cdnResult.success) {
|
||||
console.log(' 提示: CDN 刷新约需 5 分钟生效');
|
||||
}
|
||||
}
|
||||
|
||||
console.log('\n');
|
||||
|
||||
Reference in New Issue
Block a user