feat: 上传版本包后同步发布latest.apk

This commit is contained in:
2026-11-02 14:27:56 +08:00
parent 804e1a8f2b
commit 569b671b7b
+44 -18
View File
@@ -13,6 +13,7 @@
* *
* 版本号取 src/manifest.json 的 versionName。 * 版本号取 src/manifest.json 的 versionName。
* 场景值取对应 .env 的 VUE_APP_UPGRADE_NAME,拼成 /version/{upgradeName}/{version}.apk。 * 场景值取对应 .env 的 VUE_APP_UPGRADE_NAME,拼成 /version/{upgradeName}/{version}.apk。
* 版本包上传成功后,再把同一份安装包上传为 /version/{upgradeName}/latest.apk。
* 运行时输入 ERP 手机号和密码获取 token。多个账套时再选择一次。 * 运行时输入 ERP 手机号和密码获取 token。多个账套时再选择一次。
*/ */
const fs = require('fs'); const fs = require('fs');
@@ -217,6 +218,35 @@ async function uploadToUpyun({ bucket, authorization, policy, filePath, fileName
return body; return body;
} }
function toPublicUrl(target, saveKey, uploaded) {
if (uploaded.url && String(uploaded.url).startsWith('http')) return uploaded.url;
return `${CDN_HOST[target]}${saveKey}`;
}
async function uploadApkFile({ apiBase, token, apkPath, saveKey, fileName, status }) {
console.log(`场景路径: ${saveKey}`);
console.log('正在获取签名...');
const sign = await getCdnSign({
apiBase,
token,
saveKey,
status,
});
if (!sign.bucket || !sign.authorization || !sign.policy) {
throw new Error('签名返回缺少 bucket、authorization 或 policy');
}
console.log(`正在上传 ${fileName}...`);
const uploaded = await uploadToUpyun({
bucket: sign.bucket,
authorization: sign.authorization,
policy: sign.policy,
filePath: apkPath,
fileName,
});
console.log('上传成功');
return uploaded;
}
async function main() { async function main() {
const args = parseArgs(process.argv.slice(2)); const args = parseArgs(process.argv.slice(2));
if (!args.file || !args.target) { if (!args.file || !args.target) {
@@ -253,6 +283,8 @@ async function main() {
const status = args.target === 'prod' ? 2 : 1; const status = args.target === 'prod' ? 2 : 1;
const fileName = `${version}.apk`; const fileName = `${version}.apk`;
const saveKey = `/version/${upgradeName}/${fileName}`; const saveKey = `/version/${upgradeName}/${fileName}`;
const latestFileName = 'latest.apk';
const latestSaveKey = `/version/${upgradeName}/${latestFileName}`;
const apiBase = API_BASE; const apiBase = API_BASE;
const token = await login(apiBase, { const token = await login(apiBase, {
phone: args.phone, phone: args.phone,
@@ -261,33 +293,27 @@ async function main() {
}); });
console.log(`版本号: ${version}`); console.log(`版本号: ${version}`);
console.log(`场景路径: ${saveKey}`);
const cdnLabel = args.target === 'prod' ? '正式 CDN' : '测试 CDN'; const cdnLabel = args.target === 'prod' ? '正式 CDN' : '测试 CDN';
console.log(`CDN: ${cdnLabel}(只影响下载地址,生产环境也可以从测试 CDN 安装)`); console.log(`CDN: ${cdnLabel}(只影响下载地址,生产环境也可以从测试 CDN 安装)`);
console.log('正在获取签名...'); const uploaded = await uploadApkFile({
const sign = await getCdnSign({
apiBase, apiBase,
token, token,
apkPath,
saveKey, saveKey,
fileName,
status, status,
}); });
if (!sign.bucket || !sign.authorization || !sign.policy) { console.log(toPublicUrl(args.target, saveKey, uploaded));
throw new Error('签名返回缺少 bucket、authorization 或 policy');
}
console.log('正在上传 APK...'); const latestUploaded = await uploadApkFile({
const uploaded = await uploadToUpyun({ apiBase,
bucket: sign.bucket, token,
authorization: sign.authorization, apkPath,
policy: sign.policy, saveKey: latestSaveKey,
filePath: apkPath, fileName: latestFileName,
fileName, status,
}); });
console.log('上传成功'); console.log(toPublicUrl(args.target, latestSaveKey, latestUploaded));
const pathUrl = uploaded.url && String(uploaded.url).startsWith('http')
? uploaded.url
: `${CDN_HOST[args.target]}${saveKey}`;
console.log(pathUrl);
} }
main().catch((error) => { main().catch((error) => {