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