部署的同时进行CDN预热刷新

This commit is contained in:
boybook
2025-03-20 23:16:16 +08:00
parent 3eeb636922
commit 21f6f9d464
5 changed files with 740 additions and 10 deletions

View File

@@ -20,7 +20,7 @@ concurrency:
jobs:
# 构建工作
build:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout
@@ -49,14 +49,13 @@ jobs:
with:
path: docs/.vitepress/dist
# 部署工作
deploy:
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
needs: build
runs-on: ubuntu-latest
steps:
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v4
- name: Refresh CDN Cache
env:
TENCENT_CLOUD_SECRET_ID: ${{ secrets.TENCENT_CLOUD_SECRET_ID }}
TENCENT_CLOUD_SECRET_KEY: ${{ secrets.TENCENT_CLOUD_SECRET_KEY }}
TENCENT_CLOUD_ZONE_ID: ${{ secrets.TENCENT_CLOUD_ZONE_ID }}
run: node scripts/cdn-fresh.mjs

File diff suppressed because one or more lines are too long

131
package-lock.json generated
View File

@@ -17,6 +17,7 @@
"marked": "^15.0.7",
"mermaid": "^11.5.0",
"openai": "^4.87.4",
"tencentcloud-sdk-nodejs": "^4.1.0",
"vitepress": "^1.6.3",
"vitepress-plugin-mermaid": "^2.0.17",
"vue": "^3.5.13"
@@ -2041,6 +2042,19 @@
"node": ">=0.4.0"
}
},
"node_modules/agent-base": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
"integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"debug": "4"
},
"engines": {
"node": ">= 6.0.0"
}
},
"node_modules/agentkeepalive": {
"version": "4.6.0",
"resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.6.0.tgz",
@@ -2096,6 +2110,16 @@
"dev": true,
"license": "MIT"
},
"node_modules/bignumber.js": {
"version": "9.1.2",
"resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz",
"integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==",
"dev": true,
"license": "MIT",
"engines": {
"node": "*"
}
},
"node_modules/birpc": {
"version": "0.2.19",
"resolved": "https://registry.npmjs.org/birpc/-/birpc-0.2.19.tgz",
@@ -3229,6 +3253,19 @@
"node": ">= 0.4"
}
},
"node_modules/get-stream": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
"integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/glob-parent": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
@@ -3389,6 +3426,20 @@
"url": "https://github.com/sponsors/wooorm"
}
},
"node_modules/https-proxy-agent": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
"integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
"dev": true,
"license": "MIT",
"dependencies": {
"agent-base": "6",
"debug": "4"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/humanize-ms": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz",
@@ -3465,6 +3516,19 @@
"node": ">=0.12.0"
}
},
"node_modules/is-stream": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
"integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/is-what": {
"version": "4.1.16",
"resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz",
@@ -3492,6 +3556,16 @@
"js-yaml": "bin/js-yaml.js"
}
},
"node_modules/json-bigint": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz",
"integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"bignumber.js": "^9.0.0"
}
},
"node_modules/katex": {
"version": "0.16.21",
"resolved": "https://registry.npmjs.org/katex/-/katex-0.16.21.tgz",
@@ -4445,6 +4519,56 @@
"dev": true,
"license": "MIT"
},
"node_modules/tencentcloud-sdk-nodejs": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/tencentcloud-sdk-nodejs/-/tencentcloud-sdk-nodejs-4.1.0.tgz",
"integrity": "sha512-WifbzmRola9FVl1YIZJuZP7NjpAVToAfPv4IiQYOWj2tlHYwNBO8BfKOcn0WJh+Csn7Be8YehyZl4L5EoEgnkg==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
"form-data": "^3.0.0",
"get-stream": "^6.0.0",
"https-proxy-agent": "^5.0.0",
"is-stream": "^2.0.0",
"json-bigint": "^1.0.0",
"node-fetch": "^2.2.0",
"tslib": "1.13.0",
"uuid": "^9.0.1"
},
"engines": {
"node": ">=10"
}
},
"node_modules/tencentcloud-sdk-nodejs/node_modules/form-data": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.3.tgz",
"integrity": "sha512-q5YBMeWy6E2Un0nMGWMgI65MAKtaylxfNJGJxpGh45YDciZB4epbWpaAfImil6CPAPTYB4sh0URQNDRIZG5F2w==",
"dev": true,
"license": "MIT",
"dependencies": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.8",
"es-set-tostringtag": "^2.1.0",
"mime-types": "^2.1.35"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/tencentcloud-sdk-nodejs/node_modules/uuid": {
"version": "9.0.1",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
"integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",
"dev": true,
"funding": [
"https://github.com/sponsors/broofa",
"https://github.com/sponsors/ctavan"
],
"license": "MIT",
"bin": {
"uuid": "dist/bin/uuid"
}
},
"node_modules/tinyexec": {
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz",
@@ -4493,6 +4617,13 @@
"node": ">=6.10"
}
},
"node_modules/tslib": {
"version": "1.13.0",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz",
"integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==",
"dev": true,
"license": "0BSD"
},
"node_modules/ufo": {
"version": "1.5.4",
"resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.4.tgz",

View File

@@ -20,6 +20,7 @@
"marked": "^15.0.7",
"mermaid": "^11.5.0",
"openai": "^4.87.4",
"tencentcloud-sdk-nodejs": "^4.1.0",
"vitepress": "^1.6.3",
"vitepress-plugin-mermaid": "^2.0.17",
"vue": "^3.5.13"

123
scripts/cdn-fresh.mjs Normal file
View File

@@ -0,0 +1,123 @@
import dotenv from 'dotenv';
import tencentcloud from 'tencentcloud-sdk-nodejs';
import path from 'path';
import { fileURLToPath } from 'url';
import fs from 'fs';
// 加载环境变量
dotenv.config();
// 获取当前文件的目录
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
// 从环境变量中获取腾讯云 API 密钥
const SECRET_ID = process.env.TENCENT_CLOUD_SECRET_ID;
const SECRET_KEY = process.env.TENCENT_CLOUD_SECRET_KEY;
const ZONE_ID = process.env.TENCENT_CLOUD_ZONE_ID;
const ONLINE_WIKI_URL = "https://mcwiki.easecation.net"; // 最后不能带/
// 检查密钥是否存在
if (!SECRET_ID || !SECRET_KEY || !ZONE_ID) {
console.error('错误: 请确保环境变量中设置了 TENCENT_CLOUD_SECRET_ID, TENCENT_CLOUD_SECRET_KEY 和 TENCENT_CLOUD_ZONE_ID');
process.exit(1);
}
// 获取腾讯云 API 客户端
const TeoClient = tencentcloud.teo.v20220901.Client;
// 实例化客户端
const clientConfig = {
credential: {
secretId: SECRET_ID,
secretKey: SECRET_KEY,
},
region: "", // EdgeOne 服务不需要指定地域
profile: {
httpProfile: {
endpoint: "teo.tencentcloudapi.com",
},
},
};
const client = new TeoClient(clientConfig);
console.log('开始刷新 CDN 缓存...');
try {
const response = await client.CreatePurgeTask({
ZoneId: ZONE_ID,
Type: "purge_prefix",
Method: "invalidate",
Targets: [
ONLINE_WIKI_URL
]
});
console.log('刷新 CDN 缓存完成:', response);
} catch (error) {
console.error('刷新目录缓存失败:', error);
throw error;
}
console.log('开始预热部分页面...');
// 提取docs/.vitepress/dist/assets中匹配xxx.md.xxx.js形式的文件
const assetsDir = path.resolve(__dirname, '../docs/.vitepress/dist/assets');
const files = fs.readdirSync(assetsDir).filter(file => file.match(/\.md\.[a-zA-Z0-9]+\.js$/));
const prefetchPages = [
"mcdocs/0-欢迎",
"mcdocs/1-ModAPI/事件/事件索引表",
"mcdocs/1-ModAPI/事件/UI",
"mcdocs/1-ModAPI/事件/世界",
"mcdocs/1-ModAPI/事件/实体",
"mcdocs/1-ModAPI/事件/控制",
"mcdocs/1-ModAPI/事件/方块",
"mcdocs/1-ModAPI/事件/模型",
"mcdocs/1-ModAPI/事件/物品",
"mcdocs/1-ModAPI/事件/玩家",
"mcdocs/1-ModAPI/事件/联机大厅",
"mcdocs/1-ModAPI/事件/音效",
"mcdocs/1-ModAPI/接口/Api索引表",
"mcdocs/1-ModAPI/枚举值/索引",
"mcguide/0-欢迎",
"mcguide/20-玩法开发/13-模组SDK编程/2-Python脚本开发/0-脚本开发入门",
"mcguide/18-界面与交互/2-从零开始创建UI",
"mcguide/16-美术/6-模型和动作/00-模型制作方案",
"mcguide/20-玩法开发/15-自定义游戏内容/1-自定义物品/1-自定义基础物品",
"mcguide/20-玩法开发/15-自定义游戏内容/2-自定义方块/0-自定义方块概述",
"mcguide/20-玩法开发/15-自定义游戏内容/3-自定义生物/01-自定义基础生物",
"mcguide/20-玩法开发/15-自定义游戏内容/4-自定义维度/1-自定义维度",
"mconline/0-欢迎",
"wiki/guide/introduction",
"wiki/modsdk/modsdk-intro",
"wiki/blocks/blocks-intro",
"wiki/items/items-intro",
"wiki/entities/entity-intro-bp",
"wiki/json-ui/json-ui-intro"
];
const prefetchPagesTag = prefetchPages.map(page => page.replaceAll("/", "_") + ".md");
const targetsJs = files
.filter(file => prefetchPagesTag.filter(tag => file.indexOf(tag) >= 0).length > 0)
.map(file => `${ONLINE_WIKI_URL}/assets/${file}`);
const targetsHtml = prefetchPages.map(file => `${ONLINE_WIKI_URL}/${file}.html`);
try {
const response = await client.CreatePrefetchTask({
ZoneId: ZONE_ID,
Targets: [
ONLINE_WIKI_URL,
ONLINE_WIKI_URL + "/wiki",
...targetsHtml,
...targetsJs
]
});
console.log('预热 CDN 完成:', response);
} catch (error) {
console.error('CDN 预热失败:', error);
throw error;
}