@lage-run/cli 0.24.6 → 0.24.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.json CHANGED
@@ -2,7 +2,37 @@
2
2
  "name": "@lage-run/cli",
3
3
  "entries": [
4
4
  {
5
- "date": "Sun, 08 Dec 2024 00:07:13 GMT",
5
+ "date": "Tue, 10 Dec 2024 23:38:43 GMT",
6
+ "version": "0.24.8",
7
+ "tag": "@lage-run/cli_v0.24.8",
8
+ "comments": {
9
+ "patch": [
10
+ {
11
+ "author": "kchau@microsoft.com",
12
+ "package": "@lage-run/cli",
13
+ "commit": "25c6476eb4f1c9b3c9e7a8618c707a18eeab319e",
14
+ "comment": "makes sure the failing case also reports i/o of files"
15
+ }
16
+ ]
17
+ }
18
+ },
19
+ {
20
+ "date": "Mon, 09 Dec 2024 06:21:52 GMT",
21
+ "version": "0.24.7",
22
+ "tag": "@lage-run/cli_v0.24.7",
23
+ "comments": {
24
+ "patch": [
25
+ {
26
+ "author": "kchau@microsoft.com",
27
+ "package": "@lage-run/cli",
28
+ "commit": "4584a7356e544bd87a0c79180baa9f14cd971baf",
29
+ "comment": "fixing the outputs so it includes files I/O"
30
+ }
31
+ ]
32
+ }
33
+ },
34
+ {
35
+ "date": "Sun, 08 Dec 2024 00:07:28 GMT",
6
36
  "version": "0.24.6",
7
37
  "tag": "@lage-run/cli_v0.24.6",
8
38
  "comments": {
package/CHANGELOG.md CHANGED
@@ -1,12 +1,28 @@
1
1
  # Change Log - @lage-run/cli
2
2
 
3
- <!-- This log was last generated on Sun, 08 Dec 2024 00:07:13 GMT and should not be manually modified. -->
3
+ <!-- This log was last generated on Tue, 10 Dec 2024 23:38:43 GMT and should not be manually modified. -->
4
4
 
5
5
  <!-- Start content -->
6
6
 
7
+ ## 0.24.8
8
+
9
+ Tue, 10 Dec 2024 23:38:43 GMT
10
+
11
+ ### Patches
12
+
13
+ - makes sure the failing case also reports i/o of files (kchau@microsoft.com)
14
+
15
+ ## 0.24.7
16
+
17
+ Mon, 09 Dec 2024 06:21:52 GMT
18
+
19
+ ### Patches
20
+
21
+ - fixing the outputs so it includes files I/O (kchau@microsoft.com)
22
+
7
23
  ## 0.24.6
8
24
 
9
- Sun, 08 Dec 2024 00:07:13 GMT
25
+ Sun, 08 Dec 2024 00:07:28 GMT
10
26
 
11
27
  ### Patches
12
28
 
@@ -121,9 +121,8 @@ async function executeRemotely(options, command) {
121
121
  process.stdout.write(response.stdout);
122
122
  process.stderr.write(response.stderr);
123
123
  process.exitCode = response.exitCode;
124
- if (response.exitCode === 0) {
125
- await (0, _simulateFileAccess.simulateFileAccess)(logger, response.inputs, response.outputs);
126
- }
124
+ // we will simulate file access even if exit code may be non-zero
125
+ await (0, _simulateFileAccess.simulateFileAccess)(logger, response.inputs, response.outputs);
127
126
  } else {
128
127
  process.exitCode = 1;
129
128
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/exec/executeRemotely.ts"],"sourcesContent":["import type { Logger } from \"@lage-run/logger\";\nimport createLogger from \"@lage-run/logger\";\nimport { initializeReporters } from \"../initializeReporters.js\";\nimport type { ReporterInitOptions } from \"../../types/ReporterInitOptions.js\";\nimport type { LageClient } from \"@lage-run/rpc\";\nimport { ConnectError, createClient } from \"@lage-run/rpc\";\nimport { filterArgsForTasks } from \"../run/filterArgsForTasks.js\";\nimport { simulateFileAccess } from \"./simulateFileAccess.js\";\nimport { parseServerOption } from \"../parseServerOption.js\";\nimport { getWorkspaceRoot } from \"workspace-tools\";\nimport type { Command } from \"commander\";\nimport { launchServerInBackground } from \"../launchServerInBackground.js\";\n\ninterface ExecRemotelyOptions extends ReporterInitOptions {\n cwd?: string;\n server?: string | boolean;\n timeout?: number;\n tasks: string[];\n nodeArg?: string;\n}\n\nasync function tryCreateClient(host: string, port: number) {\n const client = createClient({\n baseUrl: `http://${host}:${port}`,\n httpVersion: \"2\",\n });\n\n try {\n const success = await client.ping({});\n if (success.pong) {\n return client;\n }\n } catch (e) {\n if (e instanceof ConnectError) {\n return undefined;\n }\n\n throw e;\n }\n\n return undefined;\n}\n\nasync function tryCreateClientWithRetries(host: string, port: number, logger: Logger) {\n let client: ReturnType<typeof createClient> | undefined;\n\n const start = Date.now();\n while (Date.now() - start < 5 * 1000) {\n try {\n client = await tryCreateClient(host, port);\n\n if (client) {\n return client;\n }\n } catch (e) {\n if (e instanceof ConnectError) {\n logger.error(\"Error connecting to server\", e);\n }\n }\n\n await new Promise((resolve) => setTimeout(resolve, 1000));\n }\n\n return undefined;\n}\n\nasync function executeOnServer(args: string[], client: LageClient, logger: Logger) {\n const task = args.length === 1 ? args[0] : args[1];\n const packageName = args.length > 1 ? args[0] : undefined;\n\n if (!task) {\n throw new Error(\"No task provided\");\n }\n\n const { taskArgs } = filterArgsForTasks(args ?? []);\n\n try {\n const response = await client.runTarget({\n packageName,\n task,\n taskArgs,\n });\n logger.info(`Task ${response.packageName} ${response.task} exited with code ${response.exitCode} `);\n return response;\n } catch (error) {\n if (error instanceof ConnectError) {\n logger.error(\"Error connecting to server\", { error });\n } else {\n logger.error(\"Error running task\", { error });\n }\n }\n}\n\nexport async function executeRemotely(options: ExecRemotelyOptions, command: Command) {\n // launch a 'lage-server.js' process, detached if it is not already running\n // send the command to the server process\n const { server, tasks, nodeArg } = options;\n const timeout = options.timeout ?? 5 * 60;\n\n const { host, port } = parseServerOption(server);\n\n const logger = createLogger();\n options.logLevel = options.logLevel ?? \"info\";\n options.reporter = options.reporter ?? \"json\";\n initializeReporters(logger, options);\n\n const root = getWorkspaceRoot(options.cwd ?? process.cwd())!;\n\n let client = await tryCreateClient(host, port);\n const args = command.args;\n\n logger.info(`Command args ${command.args.join(\" \")}`);\n\n if (!client) {\n await launchServerInBackground({\n host,\n port,\n tasks,\n args,\n timeout,\n logger,\n root,\n nodeArg,\n });\n\n logger.info(\"Creating a client to connect to the background services\");\n client = await tryCreateClientWithRetries(host, port, logger);\n\n if (!client) {\n throw new Error(\"Server could not be started\");\n }\n }\n\n logger.info(`Executing on server http://${host}:${port}`);\n const response = await executeOnServer(args, client, logger);\n\n if (response) {\n process.stdout.write(response.stdout);\n process.stderr.write(response.stderr);\n process.exitCode = response.exitCode;\n\n if (response.exitCode === 0) {\n await simulateFileAccess(logger, response.inputs, response.outputs);\n }\n } else {\n process.exitCode = 1;\n }\n\n logger.info(\"Task execution finished\");\n}\n"],"names":["executeRemotely","tryCreateClient","host","port","client","createClient","baseUrl","httpVersion","success","ping","pong","e","ConnectError","undefined","tryCreateClientWithRetries","logger","start","Date","now","error","Promise","resolve","setTimeout","executeOnServer","args","task","length","packageName","Error","taskArgs","filterArgsForTasks","response","runTarget","info","exitCode","options","command","server","tasks","nodeArg","timeout","parseServerOption","createLogger","logLevel","reporter","initializeReporters","root","getWorkspaceRoot","cwd","process","join","launchServerInBackground","stdout","write","stderr","simulateFileAccess","inputs","outputs"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/commands/exec/executeRemotely.ts"],"sourcesContent":["import type { Logger } from \"@lage-run/logger\";\nimport createLogger from \"@lage-run/logger\";\nimport { initializeReporters } from \"../initializeReporters.js\";\nimport type { ReporterInitOptions } from \"../../types/ReporterInitOptions.js\";\nimport type { LageClient } from \"@lage-run/rpc\";\nimport { ConnectError, createClient } from \"@lage-run/rpc\";\nimport { filterArgsForTasks } from \"../run/filterArgsForTasks.js\";\nimport { simulateFileAccess } from \"./simulateFileAccess.js\";\nimport { parseServerOption } from \"../parseServerOption.js\";\nimport { getWorkspaceRoot } from \"workspace-tools\";\nimport type { Command } from \"commander\";\nimport { launchServerInBackground } from \"../launchServerInBackground.js\";\n\ninterface ExecRemotelyOptions extends ReporterInitOptions {\n cwd?: string;\n server?: string | boolean;\n timeout?: number;\n tasks: string[];\n nodeArg?: string;\n}\n\nasync function tryCreateClient(host: string, port: number) {\n const client = createClient({\n baseUrl: `http://${host}:${port}`,\n httpVersion: \"2\",\n });\n\n try {\n const success = await client.ping({});\n if (success.pong) {\n return client;\n }\n } catch (e) {\n if (e instanceof ConnectError) {\n return undefined;\n }\n\n throw e;\n }\n\n return undefined;\n}\n\nasync function tryCreateClientWithRetries(host: string, port: number, logger: Logger) {\n let client: ReturnType<typeof createClient> | undefined;\n\n const start = Date.now();\n while (Date.now() - start < 5 * 1000) {\n try {\n client = await tryCreateClient(host, port);\n\n if (client) {\n return client;\n }\n } catch (e) {\n if (e instanceof ConnectError) {\n logger.error(\"Error connecting to server\", e);\n }\n }\n\n await new Promise((resolve) => setTimeout(resolve, 1000));\n }\n\n return undefined;\n}\n\nasync function executeOnServer(args: string[], client: LageClient, logger: Logger) {\n const task = args.length === 1 ? args[0] : args[1];\n const packageName = args.length > 1 ? args[0] : undefined;\n\n if (!task) {\n throw new Error(\"No task provided\");\n }\n\n const { taskArgs } = filterArgsForTasks(args ?? []);\n\n try {\n const response = await client.runTarget({\n packageName,\n task,\n taskArgs,\n });\n logger.info(`Task ${response.packageName} ${response.task} exited with code ${response.exitCode} `);\n return response;\n } catch (error) {\n if (error instanceof ConnectError) {\n logger.error(\"Error connecting to server\", { error });\n } else {\n logger.error(\"Error running task\", { error });\n }\n }\n}\n\nexport async function executeRemotely(options: ExecRemotelyOptions, command: Command) {\n // launch a 'lage-server.js' process, detached if it is not already running\n // send the command to the server process\n const { server, tasks, nodeArg } = options;\n const timeout = options.timeout ?? 5 * 60;\n\n const { host, port } = parseServerOption(server);\n\n const logger = createLogger();\n options.logLevel = options.logLevel ?? \"info\";\n options.reporter = options.reporter ?? \"json\";\n initializeReporters(logger, options);\n\n const root = getWorkspaceRoot(options.cwd ?? process.cwd())!;\n\n let client = await tryCreateClient(host, port);\n const args = command.args;\n\n logger.info(`Command args ${command.args.join(\" \")}`);\n\n if (!client) {\n await launchServerInBackground({\n host,\n port,\n tasks,\n args,\n timeout,\n logger,\n root,\n nodeArg,\n });\n\n logger.info(\"Creating a client to connect to the background services\");\n client = await tryCreateClientWithRetries(host, port, logger);\n\n if (!client) {\n throw new Error(\"Server could not be started\");\n }\n }\n\n logger.info(`Executing on server http://${host}:${port}`);\n const response = await executeOnServer(args, client, logger);\n\n if (response) {\n process.stdout.write(response.stdout);\n process.stderr.write(response.stderr);\n process.exitCode = response.exitCode;\n\n // we will simulate file access even if exit code may be non-zero\n await simulateFileAccess(logger, response.inputs, response.outputs);\n } else {\n process.exitCode = 1;\n }\n\n logger.info(\"Task execution finished\");\n}\n"],"names":["executeRemotely","tryCreateClient","host","port","client","createClient","baseUrl","httpVersion","success","ping","pong","e","ConnectError","undefined","tryCreateClientWithRetries","logger","start","Date","now","error","Promise","resolve","setTimeout","executeOnServer","args","task","length","packageName","Error","taskArgs","filterArgsForTasks","response","runTarget","info","exitCode","options","command","server","tasks","nodeArg","timeout","parseServerOption","createLogger","logLevel","reporter","initializeReporters","root","getWorkspaceRoot","cwd","process","join","launchServerInBackground","stdout","write","stderr","simulateFileAccess","inputs","outputs"],"mappings":"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"}
@@ -14,6 +14,8 @@ const _workspacetools = require("workspace-tools");
14
14
  const _createTargetGraph = require("../run/createTargetGraph.js");
15
15
  const _workerthreadspool = require("@lage-run/worker-threads-pool");
16
16
  const _hasher = require("@lage-run/hasher");
17
+ const _getOutputFiles = require("./getOutputFiles.js");
18
+ const _globby = require("@lage-run/globby");
17
19
  const _MemoryStream = require("./MemoryStream.js");
18
20
  const _runnerPickerOptions = require("../../runnerPickerOptions.js");
19
21
  const _filterPipelineDefinitions = require("../run/filterPipelineDefinitions.js");
@@ -165,6 +167,16 @@ async function createLageService({ cwd, serverControls, logger, concurrency, tas
165
167
  status: "queued",
166
168
  threadId: 0
167
169
  };
170
+ const globalInputs = target.environmentGlob ? (0, _globby.glob)(target.environmentGlob, {
171
+ cwd: root,
172
+ gitignore: true
173
+ }) : config.cacheOptions?.environmentGlob ? (0, _globby.glob)(config.cacheOptions?.environmentGlob, {
174
+ cwd: root,
175
+ gitignore: true
176
+ }) : [
177
+ "lage.config.js"
178
+ ];
179
+ const inputs = ((0, _hasher.getInputFiles)(target, dependencyMap, packageTree) ?? []).concat(globalInputs);
168
180
  try {
169
181
  await pool.exec(task, 0, (worker, stdout, stderr)=>{
170
182
  logger.info(`[${worker.threadId}] ${request.packageName}#${request.task} start`);
@@ -186,35 +198,27 @@ async function createLageService({ cwd, serverControls, logger, concurrency, tas
186
198
  pipedStdout.unpipe(writableStdout);
187
199
  pipedStderr.unpipe(writableStderr);
188
200
  });
189
- // const globalInputs = target.environmentGlob
190
- // ? glob(target.environmentGlob, { cwd: root, gitignore: true })
191
- // : config.cacheOptions?.environmentGlob
192
- // ? glob(config.cacheOptions?.environmentGlob, { cwd: root, gitignore: true })
193
- // : ["lage.config.js"];
194
- // const inputs = (getInputFiles(target, dependencyMap, packageTree) ?? []).concat(globalInputs);
201
+ const outputs = (0, _getOutputFiles.getOutputFiles)(root, target, config.cacheOptions?.outputGlob, packageTree);
195
202
  return {
196
203
  packageName: request.packageName,
197
204
  task: request.task,
198
205
  exitCode: 0,
199
206
  hash: "",
200
- // inputs,
201
- // outputs: getOutputFiles(root, target, config.cacheOptions?.outputGlob, packageTree),
202
- // stdout: writableStdout.toString(),
203
- // stderr: writableStderr.toString(),
204
- inputs: [],
205
- outputs: [],
206
- stdout: "",
207
- stderr: "",
207
+ inputs,
208
+ outputs,
209
+ stdout: writableStdout.toString(),
210
+ stderr: writableStderr.toString(),
208
211
  id
209
212
  };
210
213
  } catch (e) {
214
+ const outputs = (0, _getOutputFiles.getOutputFiles)(root, target, config.cacheOptions?.outputGlob, packageTree);
211
215
  return {
212
216
  packageName: request.packageName,
213
217
  task: request.task,
214
218
  exitCode: 1,
215
219
  hash: "",
216
- inputs: [],
217
- outputs: [],
220
+ inputs,
221
+ outputs,
218
222
  stdout: "",
219
223
  stderr: e instanceof Error ? e.toString() : "",
220
224
  id
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/server/lageService.ts"],"sourcesContent":["import { type ConfigOptions, getConfig, getConcurrency, getMaxWorkersPerTask } from \"@lage-run/config\";\nimport type { Logger } from \"@lage-run/logger\";\nimport type { ILageService } from \"@lage-run/rpc\";\nimport { getTargetId, type TargetGraph } from \"@lage-run/target-graph\";\nimport { type DependencyMap, getPackageInfos, getWorkspaceRoot } from \"workspace-tools\";\nimport { createTargetGraph } from \"../run/createTargetGraph.js\";\nimport { type Readable } from \"stream\";\nimport { type Pool, AggregatedPool } from \"@lage-run/worker-threads-pool\";\nimport { getInputFiles, PackageTree } from \"@lage-run/hasher\";\nimport { createDependencyMap } from \"workspace-tools\";\nimport { getOutputFiles } from \"./getOutputFiles.js\";\nimport { glob } from \"@lage-run/globby\";\nimport { MemoryStream } from \"./MemoryStream.js\";\nimport { runnerPickerOptions } from \"../../runnerPickerOptions.js\";\nimport { filterPipelineDefinitions } from \"../run/filterPipelineDefinitions.js\";\nimport type { TargetRun } from \"@lage-run/scheduler-types\";\nimport { formatDuration, hrToSeconds, hrtimeDiff } from \"@lage-run/format-hrtime\";\n\ninterface LageServiceContext {\n config: ConfigOptions;\n targetGraph: TargetGraph;\n packageTree: PackageTree;\n dependencyMap: DependencyMap;\n root: string;\n pool: Pool;\n}\n\nlet initializedPromise: Promise<LageServiceContext> | undefined;\ninterface ServiceControls {\n abortController: AbortController;\n countdownToShutdown: () => void;\n clearCountdown: () => void;\n}\ninterface InitializeOptions {\n cwd: string;\n logger: Logger;\n serverControls: ServiceControls;\n concurrency?: number;\n nodeArg?: string;\n taskArgs: string[];\n tasks: string[];\n}\n\nfunction formatBytes(bytes: number) {\n return `${(bytes / 1024 / 1024).toFixed(2)} MB`;\n}\n\nasync function createInitializedPromise({ cwd, logger, serverControls, nodeArg, taskArgs, concurrency, tasks }: InitializeOptions) {\n if (initializedPromise) {\n return initializedPromise;\n }\n\n const config = await getConfig(cwd);\n const root = getWorkspaceRoot(cwd)!;\n const maxWorkers = getConcurrency(concurrency, config.concurrency);\n\n logger.info(`Initializing with ${maxWorkers} workers, tasks: ${tasks.join(\", \")}`);\n\n const { pipeline } = config;\n\n const packageInfos = getPackageInfos(root);\n\n const targetGraph = await createTargetGraph({\n logger,\n root,\n dependencies: false,\n dependents: false,\n ignore: [],\n pipeline,\n repoWideChanges: config.repoWideChanges,\n scope: undefined,\n since: undefined,\n outputs: config.cacheOptions.outputGlob,\n tasks,\n packageInfos,\n });\n\n const dependencyMap = createDependencyMap(packageInfos, { withDevDependencies: true, withPeerDependencies: false });\n const packageTree = new PackageTree({\n root,\n packageInfos,\n includeUntracked: true,\n });\n\n logger.info(\"Initializing Package Tree\");\n await packageTree.initialize();\n\n const filteredPipeline = filterPipelineDefinitions(targetGraph.targets.values(), config.pipeline);\n\n const pool = new AggregatedPool({\n logger,\n maxWorkersByGroup: new Map([...getMaxWorkersPerTask(filteredPipeline, maxWorkers)]),\n groupBy: ({ target }) => target.task,\n maxWorkers,\n script: require.resolve(\"./singleTargetWorker.js\"),\n workerOptions: {\n stdout: true,\n stderr: true,\n workerData: {\n runners: {\n ...runnerPickerOptions(nodeArg, config.npmClient, taskArgs),\n ...config.runners,\n shouldCache: false,\n shouldResetCache: false,\n },\n },\n },\n workerIdleMemoryLimit: config.workerIdleMemoryLimit,\n });\n\n serverControls.abortController.signal.addEventListener(\"abort\", () => {\n pool?.close();\n });\n\n pool?.on(\"freedWorker\", () => {\n logger.silly(`Max Worker Memory Usage: ${formatBytes(pool?.stats().maxWorkerMemoryUsage)}`);\n });\n\n pool?.on(\"idle\", () => {\n logger.info(\"All workers are idle, shutting down after timeout\");\n serverControls.countdownToShutdown();\n });\n\n return { config, targetGraph, packageTree, dependencyMap, root, pool };\n}\n\n/**\n * Initializes the lageService: the extra \"initializePromise\" ensures only one initialization is done at a time across threads\n * @param cwd\n * @param logger\n * @returns\n */\nasync function initialize(options: InitializeOptions): Promise<LageServiceContext> {\n initializedPromise = createInitializedPromise(options);\n return initializedPromise;\n}\n\ninterface CreateLageServiceOptions {\n cwd: string;\n serverControls: ServiceControls;\n logger: Logger;\n concurrency?: number;\n tasks: string[];\n}\n\nexport async function createLageService({\n cwd,\n serverControls,\n logger,\n concurrency,\n tasks,\n}: CreateLageServiceOptions): Promise<ILageService> {\n return {\n async ping() {\n return { pong: true };\n },\n\n async runTarget(request) {\n if (global.gc) {\n global.gc();\n }\n\n serverControls.clearCountdown();\n\n // THIS IS A BIG ASSUMPTION; TODO: memoize based on the parameters of the initialize() call\n // The first request sets up the nodeArg and taskArgs - we are assuming that all requests to run this target are coming from the same\n // `lage info` call\n const { config, targetGraph, dependencyMap, packageTree, root, pool } = await initialize({\n cwd,\n logger,\n nodeArg: request.nodeOptions,\n taskArgs: request.taskArgs,\n serverControls,\n concurrency,\n tasks,\n });\n\n const runners = runnerPickerOptions(request.nodeOptions, config.npmClient, request.taskArgs);\n\n const id = getTargetId(request.packageName, request.task);\n\n if (!targetGraph.targets.has(id)) {\n logger.info(`Target not found: ${request.packageName}#${request.task}`);\n return {\n packageName: request.packageName,\n task: request.task,\n exitCode: 1,\n };\n }\n\n const target = targetGraph.targets.get(id)!;\n const task = {\n target,\n runners,\n };\n\n const writableStdout = new MemoryStream();\n const writableStderr = new MemoryStream();\n let pipedStdout: Readable;\n let pipedStderr: Readable;\n\n const targetRun: TargetRun = {\n queueTime: process.hrtime(),\n target,\n duration: [0, 0],\n startTime: [0, 0],\n status: \"queued\",\n threadId: 0,\n };\n\n try {\n await pool.exec(\n task,\n 0,\n (worker, stdout, stderr) => {\n logger.info(`[${worker.threadId}] ${request.packageName}#${request.task} start`);\n\n pipedStdout = stdout;\n pipedStderr = stderr;\n\n stdout.pipe(writableStdout);\n stderr.pipe(writableStderr);\n\n targetRun.threadId = worker.threadId;\n targetRun.status = \"running\";\n targetRun.startTime = process.hrtime();\n },\n (worker) => {\n logger.info(`Max Worker Memory Usage: ${formatBytes(pool.stats().maxWorkerMemoryUsage)}`);\n\n // logger.info the main process memory usage\n const memoryUsage = process.memoryUsage();\n logger.info(\n `Main Process Memory Usage: RSS: ${formatBytes(memoryUsage.rss)} Heap Total: ${formatBytes(\n memoryUsage.heapTotal\n )} Heap Used: ${formatBytes(memoryUsage.heapUsed)}`\n );\n\n targetRun.status = \"success\";\n targetRun.duration = hrtimeDiff(targetRun.startTime, process.hrtime());\n\n logger.info(\n `[${worker.threadId}] ${request.packageName}#${request.task} end: ${formatDuration(hrToSeconds(targetRun.duration))}`\n );\n pipedStdout.unpipe(writableStdout);\n pipedStderr.unpipe(writableStderr);\n }\n );\n\n // const globalInputs = target.environmentGlob\n // ? glob(target.environmentGlob, { cwd: root, gitignore: true })\n // : config.cacheOptions?.environmentGlob\n // ? glob(config.cacheOptions?.environmentGlob, { cwd: root, gitignore: true })\n // : [\"lage.config.js\"];\n // const inputs = (getInputFiles(target, dependencyMap, packageTree) ?? []).concat(globalInputs);\n\n return {\n packageName: request.packageName,\n task: request.task,\n exitCode: 0,\n hash: \"\",\n // inputs,\n // outputs: getOutputFiles(root, target, config.cacheOptions?.outputGlob, packageTree),\n // stdout: writableStdout.toString(),\n // stderr: writableStderr.toString(),\n inputs: [],\n outputs: [],\n stdout: \"\",\n stderr: \"\",\n id,\n };\n } catch (e) {\n return {\n packageName: request.packageName,\n task: request.task,\n exitCode: 1,\n hash: \"\",\n inputs: [],\n outputs: [],\n stdout: \"\",\n stderr: e instanceof Error ? e.toString() : \"\",\n id,\n };\n }\n },\n };\n}\n"],"names":["createLageService","initializedPromise","formatBytes","bytes","toFixed","createInitializedPromise","cwd","logger","serverControls","nodeArg","taskArgs","concurrency","tasks","config","getConfig","root","getWorkspaceRoot","maxWorkers","getConcurrency","info","join","pipeline","packageInfos","getPackageInfos","targetGraph","createTargetGraph","dependencies","dependents","ignore","repoWideChanges","scope","undefined","since","outputs","cacheOptions","outputGlob","dependencyMap","createDependencyMap","withDevDependencies","withPeerDependencies","packageTree","PackageTree","includeUntracked","initialize","filteredPipeline","filterPipelineDefinitions","targets","values","pool","AggregatedPool","maxWorkersByGroup","Map","getMaxWorkersPerTask","groupBy","target","task","script","require","resolve","workerOptions","stdout","stderr","workerData","runners","runnerPickerOptions","npmClient","shouldCache","shouldResetCache","workerIdleMemoryLimit","abortController","signal","addEventListener","close","on","silly","stats","maxWorkerMemoryUsage","countdownToShutdown","options","ping","pong","runTarget","request","global","gc","clearCountdown","nodeOptions","id","getTargetId","packageName","has","exitCode","get","writableStdout","MemoryStream","writableStderr","pipedStdout","pipedStderr","targetRun","queueTime","process","hrtime","duration","startTime","status","threadId","exec","worker","pipe","memoryUsage","rss","heapTotal","heapUsed","hrtimeDiff","formatDuration","hrToSeconds","unpipe","hash","inputs","e","Error","toString"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/commands/server/lageService.ts"],"sourcesContent":["import { type ConfigOptions, getConfig, getConcurrency, getMaxWorkersPerTask } from \"@lage-run/config\";\nimport type { Logger } from \"@lage-run/logger\";\nimport type { ILageService } from \"@lage-run/rpc\";\nimport { getTargetId, type TargetGraph } from \"@lage-run/target-graph\";\nimport { type DependencyMap, getPackageInfos, getWorkspaceRoot } from \"workspace-tools\";\nimport { createTargetGraph } from \"../run/createTargetGraph.js\";\nimport { type Readable } from \"stream\";\nimport { type Pool, AggregatedPool } from \"@lage-run/worker-threads-pool\";\nimport { getInputFiles, PackageTree } from \"@lage-run/hasher\";\nimport { createDependencyMap } from \"workspace-tools\";\nimport { getOutputFiles } from \"./getOutputFiles.js\";\nimport { glob } from \"@lage-run/globby\";\nimport { MemoryStream } from \"./MemoryStream.js\";\nimport { runnerPickerOptions } from \"../../runnerPickerOptions.js\";\nimport { filterPipelineDefinitions } from \"../run/filterPipelineDefinitions.js\";\nimport type { TargetRun } from \"@lage-run/scheduler-types\";\nimport { formatDuration, hrToSeconds, hrtimeDiff } from \"@lage-run/format-hrtime\";\n\ninterface LageServiceContext {\n config: ConfigOptions;\n targetGraph: TargetGraph;\n packageTree: PackageTree;\n dependencyMap: DependencyMap;\n root: string;\n pool: Pool;\n}\n\nlet initializedPromise: Promise<LageServiceContext> | undefined;\ninterface ServiceControls {\n abortController: AbortController;\n countdownToShutdown: () => void;\n clearCountdown: () => void;\n}\ninterface InitializeOptions {\n cwd: string;\n logger: Logger;\n serverControls: ServiceControls;\n concurrency?: number;\n nodeArg?: string;\n taskArgs: string[];\n tasks: string[];\n}\n\nfunction formatBytes(bytes: number) {\n return `${(bytes / 1024 / 1024).toFixed(2)} MB`;\n}\n\nasync function createInitializedPromise({ cwd, logger, serverControls, nodeArg, taskArgs, concurrency, tasks }: InitializeOptions) {\n if (initializedPromise) {\n return initializedPromise;\n }\n\n const config = await getConfig(cwd);\n const root = getWorkspaceRoot(cwd)!;\n const maxWorkers = getConcurrency(concurrency, config.concurrency);\n\n logger.info(`Initializing with ${maxWorkers} workers, tasks: ${tasks.join(\", \")}`);\n\n const { pipeline } = config;\n\n const packageInfos = getPackageInfos(root);\n\n const targetGraph = await createTargetGraph({\n logger,\n root,\n dependencies: false,\n dependents: false,\n ignore: [],\n pipeline,\n repoWideChanges: config.repoWideChanges,\n scope: undefined,\n since: undefined,\n outputs: config.cacheOptions.outputGlob,\n tasks,\n packageInfos,\n });\n\n const dependencyMap = createDependencyMap(packageInfos, { withDevDependencies: true, withPeerDependencies: false });\n const packageTree = new PackageTree({\n root,\n packageInfos,\n includeUntracked: true,\n });\n\n logger.info(\"Initializing Package Tree\");\n await packageTree.initialize();\n\n const filteredPipeline = filterPipelineDefinitions(targetGraph.targets.values(), config.pipeline);\n\n const pool = new AggregatedPool({\n logger,\n maxWorkersByGroup: new Map([...getMaxWorkersPerTask(filteredPipeline, maxWorkers)]),\n groupBy: ({ target }) => target.task,\n maxWorkers,\n script: require.resolve(\"./singleTargetWorker.js\"),\n workerOptions: {\n stdout: true,\n stderr: true,\n workerData: {\n runners: {\n ...runnerPickerOptions(nodeArg, config.npmClient, taskArgs),\n ...config.runners,\n shouldCache: false,\n shouldResetCache: false,\n },\n },\n },\n workerIdleMemoryLimit: config.workerIdleMemoryLimit,\n });\n\n serverControls.abortController.signal.addEventListener(\"abort\", () => {\n pool?.close();\n });\n\n pool?.on(\"freedWorker\", () => {\n logger.silly(`Max Worker Memory Usage: ${formatBytes(pool?.stats().maxWorkerMemoryUsage)}`);\n });\n\n pool?.on(\"idle\", () => {\n logger.info(\"All workers are idle, shutting down after timeout\");\n serverControls.countdownToShutdown();\n });\n\n return { config, targetGraph, packageTree, dependencyMap, root, pool };\n}\n\n/**\n * Initializes the lageService: the extra \"initializePromise\" ensures only one initialization is done at a time across threads\n * @param cwd\n * @param logger\n * @returns\n */\nasync function initialize(options: InitializeOptions): Promise<LageServiceContext> {\n initializedPromise = createInitializedPromise(options);\n return initializedPromise;\n}\n\ninterface CreateLageServiceOptions {\n cwd: string;\n serverControls: ServiceControls;\n logger: Logger;\n concurrency?: number;\n tasks: string[];\n}\n\nexport async function createLageService({\n cwd,\n serverControls,\n logger,\n concurrency,\n tasks,\n}: CreateLageServiceOptions): Promise<ILageService> {\n return {\n async ping() {\n return { pong: true };\n },\n\n async runTarget(request) {\n if (global.gc) {\n global.gc();\n }\n\n serverControls.clearCountdown();\n\n // THIS IS A BIG ASSUMPTION; TODO: memoize based on the parameters of the initialize() call\n // The first request sets up the nodeArg and taskArgs - we are assuming that all requests to run this target are coming from the same\n // `lage info` call\n const { config, targetGraph, dependencyMap, packageTree, root, pool } = await initialize({\n cwd,\n logger,\n nodeArg: request.nodeOptions,\n taskArgs: request.taskArgs,\n serverControls,\n concurrency,\n tasks,\n });\n\n const runners = runnerPickerOptions(request.nodeOptions, config.npmClient, request.taskArgs);\n\n const id = getTargetId(request.packageName, request.task);\n\n if (!targetGraph.targets.has(id)) {\n logger.info(`Target not found: ${request.packageName}#${request.task}`);\n return {\n packageName: request.packageName,\n task: request.task,\n exitCode: 1,\n };\n }\n\n const target = targetGraph.targets.get(id)!;\n const task = {\n target,\n runners,\n };\n\n const writableStdout = new MemoryStream();\n const writableStderr = new MemoryStream();\n let pipedStdout: Readable;\n let pipedStderr: Readable;\n\n const targetRun: TargetRun = {\n queueTime: process.hrtime(),\n target,\n duration: [0, 0],\n startTime: [0, 0],\n status: \"queued\",\n threadId: 0,\n };\n\n const globalInputs = target.environmentGlob\n ? glob(target.environmentGlob, { cwd: root, gitignore: true })\n : config.cacheOptions?.environmentGlob\n ? glob(config.cacheOptions?.environmentGlob, { cwd: root, gitignore: true })\n : [\"lage.config.js\"];\n\n const inputs = (getInputFiles(target, dependencyMap, packageTree) ?? []).concat(globalInputs);\n\n try {\n await pool.exec(\n task,\n 0,\n (worker, stdout, stderr) => {\n logger.info(`[${worker.threadId}] ${request.packageName}#${request.task} start`);\n\n pipedStdout = stdout;\n pipedStderr = stderr;\n\n stdout.pipe(writableStdout);\n stderr.pipe(writableStderr);\n\n targetRun.threadId = worker.threadId;\n targetRun.status = \"running\";\n targetRun.startTime = process.hrtime();\n },\n (worker) => {\n logger.info(`Max Worker Memory Usage: ${formatBytes(pool.stats().maxWorkerMemoryUsage)}`);\n\n // logger.info the main process memory usage\n const memoryUsage = process.memoryUsage();\n logger.info(\n `Main Process Memory Usage: RSS: ${formatBytes(memoryUsage.rss)} Heap Total: ${formatBytes(\n memoryUsage.heapTotal\n )} Heap Used: ${formatBytes(memoryUsage.heapUsed)}`\n );\n\n targetRun.status = \"success\";\n targetRun.duration = hrtimeDiff(targetRun.startTime, process.hrtime());\n\n logger.info(\n `[${worker.threadId}] ${request.packageName}#${request.task} end: ${formatDuration(hrToSeconds(targetRun.duration))}`\n );\n pipedStdout.unpipe(writableStdout);\n pipedStderr.unpipe(writableStderr);\n }\n );\n\n const outputs = getOutputFiles(root, target, config.cacheOptions?.outputGlob, packageTree);\n\n return {\n packageName: request.packageName,\n task: request.task,\n exitCode: 0,\n hash: \"\",\n inputs,\n outputs,\n stdout: writableStdout.toString(),\n stderr: writableStderr.toString(),\n id,\n };\n } catch (e) {\n const outputs = getOutputFiles(root, target, config.cacheOptions?.outputGlob, packageTree);\n\n return {\n packageName: request.packageName,\n task: request.task,\n exitCode: 1,\n hash: \"\",\n inputs,\n outputs,\n stdout: \"\",\n stderr: e instanceof Error ? e.toString() : \"\",\n id,\n };\n }\n },\n };\n}\n"],"names":["createLageService","initializedPromise","formatBytes","bytes","toFixed","createInitializedPromise","cwd","logger","serverControls","nodeArg","taskArgs","concurrency","tasks","config","getConfig","root","getWorkspaceRoot","maxWorkers","getConcurrency","info","join","pipeline","packageInfos","getPackageInfos","targetGraph","createTargetGraph","dependencies","dependents","ignore","repoWideChanges","scope","undefined","since","outputs","cacheOptions","outputGlob","dependencyMap","createDependencyMap","withDevDependencies","withPeerDependencies","packageTree","PackageTree","includeUntracked","initialize","filteredPipeline","filterPipelineDefinitions","targets","values","pool","AggregatedPool","maxWorkersByGroup","Map","getMaxWorkersPerTask","groupBy","target","task","script","require","resolve","workerOptions","stdout","stderr","workerData","runners","runnerPickerOptions","npmClient","shouldCache","shouldResetCache","workerIdleMemoryLimit","abortController","signal","addEventListener","close","on","silly","stats","maxWorkerMemoryUsage","countdownToShutdown","options","ping","pong","runTarget","request","global","gc","clearCountdown","nodeOptions","id","getTargetId","packageName","has","exitCode","get","writableStdout","MemoryStream","writableStderr","pipedStdout","pipedStderr","targetRun","queueTime","process","hrtime","duration","startTime","status","threadId","globalInputs","environmentGlob","glob","gitignore","inputs","getInputFiles","concat","exec","worker","pipe","memoryUsage","rss","heapTotal","heapUsed","hrtimeDiff","formatDuration","hrToSeconds","unpipe","getOutputFiles","hash","toString","e","Error"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lage-run/cli",
3
- "version": "0.24.6",
3
+ "version": "0.24.8",
4
4
  "description": "Command Line Interface for Lage",
5
5
  "repository": {
6
6
  "type": "git",