Skip to content

Commit ecb0159

Browse files
committed
chore(scripts): add an option to attach a java debugger
1 parent f4ca029 commit ecb0159

File tree

8 files changed

+89
-40
lines changed

8 files changed

+89
-40
lines changed

docker-compose.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ services:
1414
- PYTHON_VERSION=${PYTHON_VERSION}
1515
command: tail -f /dev/null
1616
volumes: [./:/app]
17-
# ports:
18-
# - "5009:5009" # So we can debug the OpenAPI Generator process
17+
ports:
18+
- "5009:5009" # So we can debug the OpenAPI Generator process
1919

2020
ruby:
2121
container_name: apic_ruby

scripts/buildLanguages.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,10 @@ async function buildLanguage(language: Language, gens: Generator[], buildType: B
6969
case 'kotlin':
7070
// the playground specify search but it will still build everything
7171
const isTestClass = buildType === 'guides' || buildType === 'snippets';
72-
await run(`./gradle/gradlew -p ${cwd} ${isTestClass ? 'testClasses' : 'assemble'} ${language == 'kotlin' ? '-Pclient=Search' : ''}`, { language });
72+
await run(
73+
`./gradle/gradlew -p ${cwd} ${isTestClass ? 'testClasses' : 'assemble'} ${language == 'kotlin' ? '-Pclient=Search' : ''}`,
74+
{ language },
75+
);
7376
break;
7477
case 'php':
7578
// await runComposerInstall();

scripts/cli/index.ts

Lines changed: 32 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Argument, program } from 'commander';
1+
import { Argument, Option, program } from 'commander';
22
import semver from 'semver';
33

44
import { buildLanguages } from '../buildLanguages.ts';
@@ -29,10 +29,11 @@ const args = {
2929
};
3030

3131
const flags = {
32-
verbose: {
33-
flag: '-v, --verbose',
34-
description: 'make the generation verbose',
35-
},
32+
verbose: new Option('-v, --verbose', 'make the generation verbose'),
33+
debugger: new Option(
34+
'-d, --debugger',
35+
'runs the generator in debug mode, it will wait for a Java debugger to be attached',
36+
),
3637
};
3738

3839
program.name('cli');
@@ -49,16 +50,19 @@ program
4950
.description('Generate a specified client')
5051
.addArgument(args.language)
5152
.addArgument(args.clients)
52-
.option(flags.verbose.flag, flags.verbose.description)
53-
.action(async (langArg: LangArg, clientArg: string[], { verbose }) => {
53+
.addOption(flags.verbose)
54+
.addOption(flags.debugger)
55+
.action(async (langArg: LangArg, clientArg: string[], { verbose, debugger: withDebugger }) => {
5456
const { language, client, clientList } = transformSelection({
5557
langArg,
5658
clientArg,
5759
});
5860

5961
setVerbose(Boolean(verbose));
6062

61-
await generate(generatorList({ language, client, clientList }));
63+
console.log({ withDebugger });
64+
65+
await generate(generatorList({ language, client, clientList }), Boolean(withDebugger));
6266
});
6367

6468
const buildCommand = program.command('build').description('Build the clients or specs');
@@ -68,7 +72,7 @@ buildCommand
6872
.description('Build a specified client')
6973
.addArgument(args.language)
7074
.addArgument(args.clients)
71-
.option(flags.verbose.flag, flags.verbose.description)
75+
.addOption(flags.verbose)
7276
.action(async (langArg: LangArg, clientArg: string[], { verbose }) => {
7377
const { language, client, clientList } = transformSelection({
7478
langArg,
@@ -85,7 +89,7 @@ buildCommand
8589
.description('Build a specified playground')
8690
.addArgument(args.language)
8791
.addArgument(args.clients)
88-
.option(flags.verbose.flag, flags.verbose.description)
92+
.addOption(flags.verbose)
8993
.action(async (langArg: LangArg, clientArg: string[], { verbose }) => {
9094
const { language, client, clientList } = transformSelection({
9195
langArg,
@@ -102,7 +106,7 @@ buildCommand
102106
.description('Build a specified snippets')
103107
.addArgument(args.language)
104108
.addArgument(args.clients)
105-
.option(flags.verbose.flag, flags.verbose.description)
109+
.addOption(flags.verbose)
106110
.action(async (langArg: LangArg, clientArg: string[], { verbose }) => {
107111
const { language, client, clientList } = transformSelection({
108112
langArg,
@@ -119,7 +123,7 @@ buildCommand
119123
.description('Build a specified guides')
120124
.addArgument(args.language)
121125
.addArgument(args.clients)
122-
.option(flags.verbose.flag, flags.verbose.description)
126+
.addOption(flags.verbose)
123127
.action(async (langArg: LangArg, clientArg: string[], { verbose }) => {
124128
const { language, client, clientList } = transformSelection({
125129
langArg,
@@ -135,7 +139,7 @@ buildCommand
135139
.command('specs')
136140
.description('Build a specified spec')
137141
.addArgument(args.clients)
138-
.option(flags.verbose.flag, flags.verbose.description)
142+
.addOption(flags.verbose)
139143
.option('-s, --skip-cache', 'skip cache checking to force building specs')
140144
.option('-j, --json', 'outputs the spec in JSON instead of yml')
141145
.option('-d, --docs', 'generates the doc specs with the code snippets')
@@ -172,25 +176,26 @@ ctsCommand
172176
.description('Generate the CTS tests')
173177
.addArgument(args.language)
174178
.addArgument(args.clients)
175-
.option(flags.verbose.flag, flags.verbose.description)
179+
.addOption(flags.verbose)
180+
.addOption(flags.debugger)
176181
.option('--lv, --language-version <version>', 'the version of the language to use')
177-
.action(async (langArg: LangArg, clientArg: string[], { verbose, languageVersion }) => {
182+
.action(async (langArg: LangArg, clientArg: string[], { verbose, debugger: withDebugger, languageVersion }) => {
178183
const { language, client, clientList } = transformSelection({
179184
langArg,
180185
clientArg,
181186
});
182187

183188
setVerbose(Boolean(verbose));
184189

185-
await ctsGenerateMany(generatorList({ language, client, clientList }), languageVersion);
190+
await ctsGenerateMany(generatorList({ language, client, clientList }), withDebugger, languageVersion);
186191
});
187192

188193
ctsCommand
189194
.command('run')
190195
.description('Run the tests for the CTS')
191196
.addArgument(args.language)
192197
.addArgument(args.clients)
193-
.option(flags.verbose.flag, flags.verbose.description)
198+
.addOption(flags.verbose)
194199
.option('-e, --no-e2e', 'skip the e2e tests, that requires internet connection')
195200
.option('-c, --no-client', 'skip the client tests')
196201
.option('-r, --no-requests', 'skip the requests tests')
@@ -250,7 +255,7 @@ program
250255
.description('Format the specified folder for a specific language')
251256
.addArgument(args.requiredLanguage)
252257
.argument('folder', 'The folder to format')
253-
.option(flags.verbose.flag, flags.verbose.description)
258+
.addOption(flags.verbose)
254259
.action(async (language: string, folder: string, { verbose }) => {
255260
setVerbose(Boolean(verbose));
256261

@@ -262,25 +267,27 @@ program
262267
.description('Generate the snippets')
263268
.addArgument(args.language)
264269
.addArgument(args.clients)
265-
.option(flags.verbose.flag, flags.verbose.description)
266-
.action(async (langArg: LangArg, clientArg: string[], { verbose }) => {
270+
.addOption(flags.verbose)
271+
.addOption(flags.debugger)
272+
.action(async (langArg: LangArg, clientArg: string[], { verbose, debugger: withDebugger }) => {
267273
const { language, client, clientList } = transformSelection({
268274
langArg,
269275
clientArg,
270276
});
271277

272278
setVerbose(Boolean(verbose));
273279

274-
await docsGenerateMany(generatorList({ language, client, clientList }), 'snippets');
280+
await docsGenerateMany(generatorList({ language, client, clientList }), 'snippets', Boolean(withDebugger));
275281
});
276282

277283
program
278284
.command('guides')
279285
.description('Generate the guides')
280286
.addArgument(args.language)
281287
.addArgument(args.clients)
282-
.option(flags.verbose.flag, flags.verbose.description)
283-
.action(async (langArg: LangArg, clientArg: string[], { verbose }) => {
288+
.addOption(flags.verbose)
289+
.addOption(flags.debugger)
290+
.action(async (langArg: LangArg, clientArg: string[], { verbose, debugger: withDebugger }) => {
284291
const { language, client, clientList } = transformSelection({
285292
langArg,
286293
clientArg,
@@ -293,13 +300,14 @@ program
293300
existsSync(toAbsolutePath(`templates/${gen.language}/guides/${gen.client}`)),
294301
),
295302
'guides',
303+
Boolean(withDebugger),
296304
);
297305
});
298306

299307
program
300308
.command('release')
301309
.description('Releases the client')
302-
.option(flags.verbose.flag, flags.verbose.description)
310+
.addOption(flags.verbose)
303311
.option<semver.ReleaseType>(
304312
'--rt --release-type <type>',
305313
'triggers a release for the given language list with the given releaseType',

scripts/common.ts

Lines changed: 35 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import fsp from 'fs/promises';
22
import path from 'path';
33

44
import { Octokit } from '@octokit/rest';
5+
import chalk from 'chalk';
56
import type { ExecaError } from 'execa';
67
import { execa, execaCommand } from 'execa';
78
import { remove } from 'fs-extra';
@@ -270,13 +271,40 @@ export function isVerbose(): boolean {
270271
return verbose;
271272
}
272273

273-
export async function callGenerator(gen: Generator): Promise<void> {
274-
await run(
275-
// Use the following line if you want to be able to attach a debugger to the generators
276-
// `JAVA_OPTS="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=\*:5009" yarn openapi-generator-cli --custom-generator=generators/build/libs/algolia-java-openapi-generator-1.0.0.jar generate --generator-key ${gen.key}`,
277-
`yarn openapi-generator-cli --custom-generator=generators/build/libs/algolia-java-openapi-generator-1.0.0.jar generate --generator-key ${gen.key}`,
278-
{ language: 'java' },
279-
);
274+
export async function callGenerator(gen: Generator, withDebugger: boolean): Promise<void> {
275+
const cmd = `yarn openapi-generator-cli --custom-generator=generators/build/libs/algolia-java-openapi-generator-1.0.0.jar generate --generator-key ${gen.key}`;
276+
if (!withDebugger) {
277+
await run(cmd, { language: 'java' });
278+
return;
279+
}
280+
281+
console.log(chalk.yellow('Running the generator in debug mode, waiting for debugger to be attached on port 5009'));
282+
283+
/*
284+
example .vscode/launch.json config to attach the debugger
285+
{
286+
"version": "0.2.0",
287+
"configurations": [
288+
{
289+
"type": "java",
290+
"name": "APIC Generator",
291+
"request": "attach",
292+
"hostName": "localhost",
293+
"port": "5009"
294+
}
295+
]
296+
}
297+
*/
298+
299+
const verbose = isVerbose();
300+
setVerbose(false); // verbose messes up the order of execution
301+
302+
// kill previous debuggers
303+
await run('(killall -9 java && sleep 1) || true', { language: 'java' });
304+
setVerbose(verbose);
305+
await run(`JAVA_OPTS="-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:5009" ${cmd}`, {
306+
language: 'java',
307+
});
280308
}
281309

282310
export function isWSL(): boolean {

scripts/cts/generate.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,17 @@ import { getTestOutputFolder } from '../config.ts';
33
import { formatter } from '../formatter.ts';
44
import type { Generator } from '../types.ts';
55

6-
export async function ctsGenerateMany(generators: Generator[], languageVersion = ''): Promise<void> {
6+
export async function ctsGenerateMany(
7+
generators: Generator[],
8+
withDebugger: boolean,
9+
languageVersion = '',
10+
): Promise<void> {
711
await setupAndGen(
812
generators,
913
'tests',
1014
async (gen) => {
1115
if (getTestOutputFolder(gen.language)) {
12-
await callGenerator(gen);
16+
await callGenerator(gen, withDebugger);
1317
}
1418
},
1519
{

scripts/docker/Dockerfile.base

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ SHELL ["/bin/bash", "--login", "-c"]
1616
# Global dependencies
1717
RUN apt-get update \
1818
&& apt-get install -y --no-install-recommends git curl zip unzip libexpat1-dev libicu76 \
19+
# for killall and ps
20+
&& apt-get install -y procps \
1921
&& apt-get clean \
2022
&& rm -rf /var/lib/apt/lists/*
2123

scripts/docs/generate.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,14 @@ import { getTestOutputFolder } from '../config.ts';
33
import { formatter } from '../formatter.ts';
44
import type { Generator } from '../types.ts';
55

6-
export async function docsGenerateMany(generators: Generator[], scope: 'guides' | 'snippets'): Promise<void> {
6+
export async function docsGenerateMany(
7+
generators: Generator[],
8+
scope: 'guides' | 'snippets',
9+
withDebugger: boolean,
10+
): Promise<void> {
711
await setupAndGen(generators, scope, async (gen) => {
812
if (getTestOutputFolder(gen.language)) {
9-
await callGenerator(gen);
13+
await callGenerator(gen, withDebugger);
1014
}
1115
});
1216

scripts/generate.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@ async function preGen(gen: Generator): Promise<void> {
88
await removeExistingCodegen(gen);
99
}
1010

11-
export async function generate(generators: Generator[]): Promise<void> {
11+
export async function generate(generators: Generator[], withDebugger: boolean): Promise<void> {
1212
await setupAndGen(generators, 'client', async (gen) => {
1313
await preGen(gen);
14-
await callGenerator(gen);
14+
await callGenerator(gen, withDebugger);
1515
});
1616

1717
for (const lang of new Set(generators.map((gen) => gen.language))) {

0 commit comments

Comments
 (0)