Files
lunar-mini/mini/ci/resolve-version.cjs
T
gouki 320231808b
Publish Mini Program Dev Version / publish (push) Failing after 9s
fix(mini): 修复版本号被 MINIAPP_VERSION_OVERRIDE=1.0.1 永久冻结
- 删除冻结版本变量及工作流对它的引用(遗留的临时锁定变量)
- 版本编码改为保留 package.json 的 major.minor 基线,构建编号映射 patch(单调递增)
- 基线版本提升为 1.1.0,下次上传即为 1.1.4x(此前反复上传 1.0.1)
2026-08-09 18:36:19 +00:00

99 lines
2.9 KiB
JavaScript

/**
* Resolve the WeChat Mini Program upload version.
*
* WeChat requires x.y.z with each segment in 0..999.
* Server and miniapp versions are independent on purpose.
*
* Priority:
* 1. MINIAPP_VERSION_OVERRIDE — full manual version (rare / release pinning)
* 2. MINIAPP_BUILD_NUMBER — auto version from CI run number
* 3. package.json version — local / fallback
*/
const fs = require("node:fs");
const path = require("node:path");
function readPackageVersion(projectPath) {
const packageJson = JSON.parse(
fs.readFileSync(path.join(projectPath, "package.json"), "utf8"),
);
if (!packageJson.version) {
throw new Error("package.json version is missing.");
}
return String(packageJson.version);
}
function parseSemverParts(version) {
const parts = String(version)
.trim()
.split(".")
.map((part) => Number.parseInt(part, 10));
if (
parts.length < 1 ||
parts.some((part) => !Number.isInteger(part) || part < 0 || part > 999)
) {
throw new Error(
`Invalid version "${version}". WeChat requires x.y.z with each segment 0-999.`,
);
}
return {
major: parts[0] ?? 0,
minor: parts[1] ?? 0,
patch: parts[2] ?? 0,
};
}
/**
* Encode a monotonic CI build number into WeChat x.y.z.
* Keeps package.json major.minor as the baseline; build number maps to patch.
* Examples (base 1.1.0): build 45 → 1.1.45, build 999 → 1.1.999
* (patch wraps every 1000 builds; bump package.json minor before that)
*/
function versionFromBuildNumber(major, minor, buildNumber) {
if (!Number.isInteger(buildNumber) || buildNumber < 1) {
throw new Error("MINIAPP_BUILD_NUMBER must be a positive integer.");
}
if (!Number.isInteger(major) || major < 0 || major > 999) {
throw new Error("package.json major version must be an integer 0-999.");
}
if (!Number.isInteger(minor) || minor < 0 || minor > 999) {
throw new Error("package.json minor version must be an integer 0-999.");
}
const patch = buildNumber % 1000;
return `${major}.${minor}.${patch}`;
}
/** @param {Record<string, string | undefined>} [env] */
function resolveVersion(projectPath, env = process.env) {
const override = (env.MINIAPP_VERSION_OVERRIDE || "").trim();
if (override) {
parseSemverParts(override);
return override;
}
const packageVersion = readPackageVersion(projectPath);
const { major, minor } = parseSemverParts(packageVersion);
const buildRaw = (env.MINIAPP_BUILD_NUMBER || "").trim();
if (buildRaw) {
const buildNumber = Number.parseInt(buildRaw, 10);
return versionFromBuildNumber(major, minor, buildNumber);
}
// Legacy fixed override — prefer not to use; keeps version stuck across uploads.
const legacy = (env.MINIAPP_VERSION || "").trim();
if (legacy) {
parseSemverParts(legacy);
return legacy;
}
return packageVersion;
}
module.exports = {
parseSemverParts,
resolveVersion,
versionFromBuildNumber,
};