Skip to content

Commit a91f475

Browse files
authored
feat(scripts): allow forcing releases (#3221)
1 parent 20af702 commit a91f475

File tree

6 files changed

+50
-34
lines changed

6 files changed

+50
-34
lines changed

config/release.config.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@
126126
"lts": "2024-01-01",
127127
"end": "2026-08-01"
128128
},
129-
"3.0.0.beta.5": {
129+
"3.0.0.beta.6": {
130130
"start": "2024-06-21",
131131
"end": "2026-06-21",
132132
"prerelease": true

scripts/cli/index.ts

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { Argument, program } from 'commander';
2+
import semver from 'semver';
23

34
import { buildClients } from '../buildClients.js';
45
import { LANGUAGES, setVerbose } from '../common.js';
@@ -201,10 +202,20 @@ program
201202
.description('Releases the client')
202203
.addArgument(args.languages)
203204
.option(flags.verbose.flag, flags.verbose.description)
204-
.option('-m, --major', 'triggers a major release for the given language list')
205+
.option<semver.ReleaseType>(
206+
'-rt --releaseType <type>',
207+
'triggers a release for the given language list with the given releaseType',
208+
(value, _previous) => {
209+
if (semver.RELEASE_TYPES.includes(value as semver.ReleaseType)) {
210+
return value as semver.ReleaseType;
211+
}
212+
return 'patch';
213+
},
214+
undefined,
215+
)
205216
.option('-d, --dry-run', 'does not push anything to GitHub')
206217
.option('-gg, --generate-graph', 'only generates the graph')
207-
.action(async (langArgs: LangArg[], { verbose, major, dryRun, generateGraph }) => {
218+
.action(async (langArgs: LangArg[], { verbose, releaseType, dryRun, generateGraph }) => {
208219
setVerbose(Boolean(verbose));
209220

210221
if (generateGraph) {
@@ -219,7 +230,7 @@ program
219230

220231
await createReleasePR({
221232
languages: langArgs.includes(ALL) ? LANGUAGES : (langArgs as Language[]),
222-
major,
233+
releaseType,
223234
dryRun,
224235
});
225236
});

scripts/release/__tests__/createReleasePR.test.ts

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { afterAll, describe, expect, it, vi } from "vitest";
33
import releaseConfig from '../../../config/release.config.json' assert { type: 'json' };
44
import type { PassedCommit } from '../types.js';
55
import { LANGUAGES } from "../../common.js";
6+
import { ReleaseType } from "semver";
67

78
const gitAuthor = releaseConfig.gitAuthor;
89

@@ -458,7 +459,8 @@ describe('createReleasePR', () => {
458459
expect(versions.javascript.next).toEqual('1.0.0');
459460
});
460461

461-
it('allows forcing major releases', async () => {
462+
for (const releaseType of ['major', 'minor', 'patch', 'prerelease']) {
463+
it(`allows forcing ${releaseType} releases`, async () => {
462464
const versions = await decideReleaseStrategy({
463465
versions: {
464466
javascript: {
@@ -473,18 +475,14 @@ describe('createReleasePR', () => {
473475
},
474476
commits: [],
475477
languages: LANGUAGES,
476-
major: true
478+
releaseType: releaseType as ReleaseType,
477479
});
478480

479-
expect(versions.javascript.releaseType).toEqual('major');
480-
expect(versions.javascript.next).toEqual('1.0.0');
481-
482-
expect(versions.php.releaseType).toEqual('major');
483-
expect(versions.php.next).toEqual('1.0.0');
484-
485-
expect(versions.java.releaseType).toEqual('major');
486-
expect(versions.java.next).toEqual('1.0.0');
481+
expect(versions.javascript.releaseType).toEqual(releaseType);
482+
expect(versions.php.releaseType).toEqual(releaseType);
483+
expect(versions.java.releaseType).toEqual(releaseType);
487484
});
485+
}
488486

489487
it('allows releasing subset of clients', async () => {
490488
const versions = await decideReleaseStrategy({

scripts/release/createReleasePR.ts

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -213,13 +213,13 @@ export async function decideReleaseStrategy({
213213
versions,
214214
commits,
215215
languages,
216-
major,
216+
releaseType,
217217
dryRun,
218218
}: {
219219
versions: VersionsBeforeBump;
220220
commits: PassedCommit[];
221221
languages: Language[];
222-
major?: boolean;
222+
releaseType?: semver.ReleaseType;
223223
dryRun?: boolean;
224224
}): Promise<Versions> {
225225
const versionsToPublish: Versions = {};
@@ -253,11 +253,13 @@ export async function decideReleaseStrategy({
253253

254254
console.log(`Deciding next version bump for ${lang}.`);
255255

256-
if (dryRun) {
256+
// we force the release for this language in this case if there was no commits
257+
if (dryRun || releaseType) {
257258
nbGitDiff = 1;
259+
commitsPerLang.length = 1;
258260
}
259261

260-
if (!major && (nbGitDiff === 0 || commitsPerLang.length === 0)) {
262+
if (nbGitDiff === 0 || commitsPerLang.length === 0) {
261263
versionsToPublish[lang] = {
262264
...version,
263265
noCommit: true,
@@ -277,32 +279,36 @@ export async function decideReleaseStrategy({
277279
continue;
278280
}
279281

280-
let releaseType: semver.ReleaseType = 'patch';
282+
let langReleaseType: semver.ReleaseType = 'patch';
281283
let skipRelease = false;
282284
const commitTypes = new Set(commitsPerLang.map(({ type }) => type));
283285

284286
switch (true) {
285-
case major || commitsPerLang.some((commit) => commit.message.includes('BREAKING CHANGE')):
286-
releaseType = 'major';
287+
case commitsPerLang.some((commit) => commit.message.includes('BREAKING CHANGE')):
288+
langReleaseType = 'major';
287289
break;
288290
case semver.prerelease(currentVersion) && !currentVersion.endsWith('-SNAPSHOT'):
289-
releaseType = 'prerelease';
291+
langReleaseType = 'prerelease';
290292
break;
291293
case commitTypes.has('feat'):
292-
releaseType = 'minor';
294+
langReleaseType = 'minor';
293295
break;
294296
case !commitTypes.has('fix'):
295297
skipRelease = true;
296298
break;
297299
default:
298-
releaseType = 'patch';
300+
langReleaseType = 'patch';
301+
}
302+
303+
if (releaseType) {
304+
langReleaseType = releaseType;
299305
}
300306

301307
versionsToPublish[lang] = {
302308
...version,
303-
releaseType,
309+
releaseType: langReleaseType,
304310
skipRelease,
305-
next: getNextVersion(currentVersion, releaseType),
311+
next: getNextVersion(currentVersion, langReleaseType),
306312
};
307313
}
308314

@@ -486,11 +492,11 @@ export async function updateSLA(versions: Versions, graphOnly?: boolean): Promis
486492

487493
export async function createReleasePR({
488494
languages,
489-
major,
495+
releaseType,
490496
dryRun,
491497
}: {
492498
languages: Language[];
493-
major?: boolean;
499+
releaseType?: semver.ReleaseType;
494500
dryRun?: boolean;
495501
}): Promise<void> {
496502
if (!dryRun) {
@@ -504,7 +510,7 @@ export async function createReleasePR({
504510
versions: readVersions(),
505511
commits: validCommits,
506512
languages,
507-
major,
513+
releaseType,
508514
});
509515

510516
await updateSLA(versions, false);

website/docs/contributing/CLI/release-commands.md

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,12 @@ apic release <language... | all>
1616

1717
### Available options
1818

19-
| Option | Command | Description |
20-
|----------------|:----------------------|:--------------------------------------------------------------|
21-
| verbose | -v, --verbose | Make the process verbose, display logs from third party tools |
22-
| dry run | -d, --dry-run | Locally generate a new release but do not push to GitHub |
23-
| generate graph | -gg, --generate-graph | Generates the SLA graph for the given parameters |
19+
| Option | Command | Description |
20+
|----------------|:----------------------|:------------------------------------------------------------------------------------------------ |
21+
| verbose | -v, --verbose | Make the process verbose, display logs from third party tools |
22+
| dry run | -d, --dry-run | Locally generate a new release but do not push to GitHub |
23+
| generate graph | -gg, --generate-graph | Generates the SLA graph for the given parameters |
24+
| releaseType | -rt, --releaseType | Forces the release script to create a release for the given client list of the given releaseType |
2425

2526
## Release
2627

website/static/img/ruby-sla.png

52 Bytes
Loading

0 commit comments

Comments
 (0)