Skip to content

Commit 8880b32

Browse files
committed
ci(release): better parsing and exclusions
1 parent fc1d525 commit 8880b32

File tree

4 files changed

+424
-736
lines changed

4 files changed

+424
-736
lines changed

packages/actions/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
"@discordjs/scripts": "workspace:^",
4848
"@vercel/blob": "^0.22.3",
4949
"@vercel/postgres": "^0.8.0",
50+
"commander": "^12.1.0",
5051
"meilisearch": "^0.38.0",
5152
"p-limit": "^5.0.0",
5253
"tslib": "^2.6.2",

packages/actions/src/releasePackages/generateReleaseTree.ts

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ async function getReleaseEntries() {
8585
return releaseEntries;
8686
}
8787

88-
export async function generateReleaseTree(packageName?: string) {
88+
export async function generateReleaseTree(packageName?: string, exclude?: string[]) {
8989
let releaseEntries = await getReleaseEntries();
9090
// Try to early return if the package doesn't have deps
9191
if (packageName) {
@@ -135,6 +135,31 @@ export async function generateReleaseTree(packageName?: string) {
135135
releaseEntries = unreleased;
136136
}
137137

138+
// Prune exclusions
139+
if (exclude) {
140+
const neededPackages = new Set<string>();
141+
const excludedReleaseTree: ReleaseEntry[][] = [];
142+
143+
for (const releaseBranch of releaseTree.reverse()) {
144+
const newThisBranch: ReleaseEntry[] = [];
145+
146+
for (const entry of releaseBranch) {
147+
if (exclude.includes(entry.name) && !neededPackages.has(entry.name)) {
148+
continue;
149+
}
150+
151+
newThisBranch.push(entry);
152+
for (const dep of entry.dependsOn ?? []) {
153+
neededPackages.add(dep);
154+
}
155+
}
156+
157+
if (newThisBranch.length) excludedReleaseTree.unshift(newThisBranch);
158+
}
159+
160+
return excludedReleaseTree;
161+
}
162+
138163
if (!packageName) {
139164
return releaseTree;
140165
}

packages/actions/src/releasePackages/index.ts

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,24 @@
1-
import process from 'node:process';
21
import { getInput } from '@actions/core';
2+
import { program } from 'commander';
33
import { generateReleaseTree } from './generateReleaseTree.js';
44
import { releasePackage } from './releasePackage.js';
55

6-
const argInput = process.argv[2];
7-
const useableArg = argInput === 'discord.js' || argInput?.startsWith('@discordjs/');
8-
const packageName = getInput('package') || useableArg ? argInput : '';
6+
program
7+
.name('release packages')
8+
.description('releases monorepo packages with proper sequencing')
9+
.argument('[package]', "release a specific package (and it's dependencies)", getInput('package'))
10+
.option(
11+
'-e, --exclude <packages...>',
12+
'exclude specific packages from releasing (will still release if necessary for another package)',
13+
getInput('exclude').split(','),
14+
)
15+
.parse();
916

10-
const tree = await generateReleaseTree(packageName);
17+
const { exclude } = program.opts<{ exclude: string[] }>();
18+
const packageName = program.args[0]!;
19+
20+
const tree = await generateReleaseTree(packageName, exclude);
21+
console.log(tree);
1122
for (const branch of tree) {
1223
console.log(`Releasing ${branch.map((entry) => `${entry.name}@${entry.version}`).join(', ')}`);
1324
await Promise.all(branch.map(async (release) => releasePackage(release)));

0 commit comments

Comments
 (0)