fix(ci): ensure correct version calculation and git ls-remote filtering in release workflow (#12683)

This commit is contained in:
Sandy Tao
2025-11-07 13:06:55 -08:00
committed by GitHub
parent c883403147
commit f3a8b73717
3 changed files with 47 additions and 18 deletions

View File

@@ -47,6 +47,10 @@ function getArgs() {
description: 'Override the calculated preview version.',
string: true,
})
.option('stable-base-version', {
description: 'Base version to use for calculating next preview/nightly.',
string: true,
})
.help(false)
.version(false)
.parse();
@@ -255,22 +259,35 @@ function getAndVerifyTags({ npmDistTag, args } = {}) {
};
}
function getStableBaseVersion(args) {
let latestStableVersion = args['stable-base-version'];
if (!latestStableVersion) {
const { latestVersion } = getAndVerifyTags({
npmDistTag: TAG_LATEST,
args,
});
latestStableVersion = latestVersion;
}
return latestStableVersion;
}
function promoteNightlyVersion({ args } = {}) {
const { latestVersion, latestTag } = getAndVerifyTags({
const latestStableVersion = getStableBaseVersion(args);
const { latestTag: previousNightlyTag } = getAndVerifyTags({
npmDistTag: TAG_NIGHTLY,
args,
});
const baseVersion = latestVersion.split('-')[0];
const versionParts = baseVersion.split('.');
const major = versionParts[0];
const minor = versionParts[1] ? parseInt(versionParts[1]) : 0;
const nextMinor = minor + 1;
const major = semver.major(latestStableVersion);
const minor = semver.minor(latestStableVersion);
const nextMinor = minor + 2;
const date = new Date().toISOString().slice(0, 10).replace(/-/g, '');
const gitShortHash = execSync('git rev-parse --short HEAD').toString().trim();
return {
releaseVersion: `${major}.${nextMinor}.0-nightly.${date}.${gitShortHash}`,
npmTag: TAG_NIGHTLY,
previousReleaseTag: latestTag,
previousReleaseTag: previousNightlyTag,
};
}
@@ -329,10 +346,8 @@ function getStableVersion(args) {
}
function getPreviewVersion(args) {
const { latestVersion: latestNightlyVersion } = getAndVerifyTags({
npmDistTag: TAG_NIGHTLY,
args,
});
const latestStableVersion = getStableBaseVersion(args);
let releaseVersion;
if (args['preview_version_override']) {
const overrideVersion = args['preview_version_override'].replace(/^v/, '');
@@ -343,8 +358,10 @@ function getPreviewVersion(args) {
);
releaseVersion = overrideVersion;
} else {
releaseVersion =
latestNightlyVersion.replace(/-nightly.*/, '') + '-preview.0';
const major = semver.major(latestStableVersion);
const minor = semver.minor(latestStableVersion);
const nextMinor = minor + 1;
releaseVersion = `${major}.${nextMinor}.0-preview.0`;
}
const { latestTag: previousPreviewTag } = getAndVerifyTags({

View File

@@ -80,7 +80,10 @@ describe('getVersion', () => {
it('should calculate the next preview version from the latest nightly', () => {
vi.mocked(execSync).mockImplementation(mockExecSync);
const result = getVersion({ type: 'preview' });
const result = getVersion({
type: 'preview',
'stable-base-version': '0.7.0',
});
expect(result.releaseVersion).toBe('0.8.0-preview.0');
expect(result.npmTag).toBe('preview');
expect(result.previousReleaseTag).toBe('v0.7.0-preview.1');
@@ -136,7 +139,10 @@ describe('getVersion', () => {
};
vi.mocked(execSync).mockImplementation(mockWithDeprecated);
const result = getVersion({ type: 'preview' });
const result = getVersion({
type: 'preview',
'stable-base-version': '0.7.0',
});
// It should base the preview off 0.8.0, not the deprecated 0.9.0
expect(result.releaseVersion).toBe('0.8.0-preview.0');
});
@@ -178,7 +184,10 @@ describe('getVersion', () => {
};
vi.mocked(execSync).mockImplementation(mockWithConflict);
const result = getVersion({ type: 'preview' });
const result = getVersion({
type: 'preview',
'stable-base-version': '0.7.0',
});
// Should have skipped preview.0 and landed on preview.1
expect(result.releaseVersion).toBe('0.8.0-preview.1');
});