@nrwl/nx-cloud 15.2.0 → 15.3.0-beta.2

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.
Files changed (45) hide show
  1. package/lib/core/api/error-reporter.api.js +36 -1
  2. package/lib/core/api/run-group.api.d.ts +2 -2
  3. package/lib/core/api/run-group.api.js +73 -1
  4. package/lib/core/api/run-group.api.js.map +1 -1
  5. package/lib/core/commands/record-output.js +7 -2
  6. package/lib/core/commands/record-output.js.map +1 -1
  7. package/lib/core/commands/start-ci-run.js +5 -6
  8. package/lib/core/commands/start-ci-run.js.map +1 -1
  9. package/lib/core/commands/stop-all-agents.js +6 -3
  10. package/lib/core/commands/stop-all-agents.js.map +1 -1
  11. package/lib/core/commands/upload-and-show-run-details.js +6 -1
  12. package/lib/core/commands/upload-and-show-run-details.js.map +1 -1
  13. package/lib/core/error/print-run-group-error.d.ts +1 -0
  14. package/lib/core/error/print-run-group-error.js +9 -5
  15. package/lib/core/error/print-run-group-error.js.map +1 -1
  16. package/lib/core/models/cloud-task-runner-options.d.ts +0 -1
  17. package/lib/core/runners/cloud-enabled/cloud-enabled-life-cycle.js +93 -1
  18. package/lib/core/runners/cloud-enabled/cloud-enabled.runner.js +319 -1
  19. package/lib/core/runners/cloud-enabled/cloud-enabled.runner.js.map +1 -1
  20. package/lib/core/runners/cloud-enabled/cloud-remote-cache.js +133 -1
  21. package/lib/core/runners/cloud-enabled/cloud-run.api.d.ts +6 -1
  22. package/lib/core/runners/cloud-enabled/cloud-run.api.js +168 -1
  23. package/lib/core/runners/cloud-enabled/cloud-run.api.js.map +1 -1
  24. package/lib/core/runners/cloud-enabled/id-generator.js +16 -1
  25. package/lib/core/runners/distributed-agent/distributed-agent.api.d.ts +4 -1
  26. package/lib/core/runners/distributed-agent/distributed-agent.api.js +93 -1
  27. package/lib/core/runners/distributed-agent/distributed-agent.api.js.map +1 -1
  28. package/lib/core/runners/distributed-agent/distributed-agent.impl.js +157 -1
  29. package/lib/core/runners/distributed-agent/distributed-agent.impl.js.map +1 -1
  30. package/lib/core/runners/distributed-agent/execute-tasks.js +114 -1
  31. package/lib/core/runners/distributed-agent/invoke-tasks-using-nx-imperative-api.js +58 -1
  32. package/lib/core/runners/distributed-agent/invoke-tasks-using-run-many.js +97 -1
  33. package/lib/core/runners/distributed-execution/distributed-execution.api.d.ts +2 -2
  34. package/lib/core/runners/distributed-execution/distributed-execution.api.js +152 -1
  35. package/lib/core/runners/distributed-execution/distributed-execution.api.js.map +1 -1
  36. package/lib/core/runners/distributed-execution/distributed-execution.runner.js +118 -1
  37. package/lib/core/runners/distributed-execution/distributed-execution.runner.js.map +1 -1
  38. package/lib/core/runners/distributed-execution/process-task.js +45 -1
  39. package/lib/core/runners/distributed-execution/process-tasks.js +67 -1
  40. package/lib/core/runners/distributed-execution/split-task-graph-into-stages.js +37 -1
  41. package/lib/core/runners/distributed-execution/task-graph-creator.js +100 -1
  42. package/lib/utilities/environment.d.ts +3 -1
  43. package/lib/utilities/environment.js +23 -7
  44. package/lib/utilities/environment.js.map +1 -1
  45. package/package.json +1 -1
@@ -1 +1,114 @@
1
- const a7_0x35a5=['../../../utilities/create-unchanged-value-timeout','\x20downloading\x20artifacts\x20for\x20','apply','exit','then','next','retrieveAndExtract','maxParallel','completedTasks','\x20Hash:\x20','\x20seconds','retryDuring','length','No\x20new\x20messages\x20received\x20after\x20','defineProperty','note','../../../utilities/environment','NO_MESSAGES_TIMEOUT','__esModule','NO_FURTHER_TASKS_TO_RUN','completedStatusCode','completed:\x20','tasks','executionId','throw','join','completed','value','executeTasks','\x20received\x20an\x20API\x20Response','VERBOSE_LOGGING','Error:','__awaiter','../../../utilities/waiter','retryDuring:\x20','../../../utilities/nx-imports','criticalErrorMessage','getTime','number\x20of\x20tasks:\x20','taskId','maxParallel:\x20','url','Distributed\x20Execution\x20Terminated','RUN_GROUP_COMPLETED','status:\x20','status','hash','error','\x20waiting...','\x20Url:\x20','wait','\x20fetching\x20tasks...'];(function(_0x2f6c83,_0x35a51f){const _0x2ed93d=function(_0x40a02a){while(--_0x40a02a){_0x2f6c83['push'](_0x2f6c83['shift']());}};_0x2ed93d(++_0x35a51f);}(a7_0x35a5,0x70));const a7_0x2ed9=function(_0x2f6c83,_0x35a51f){_0x2f6c83=_0x2f6c83-0x0;let _0x2ed93d=a7_0x35a5[_0x2f6c83];return _0x2ed93d;};'use strict';var __awaiter=this&&this[a7_0x2ed9('0x18')]||function(_0xa2d04a,_0x47d154,_0x58bbe0,_0x31f89a){function _0x532054(_0x40231d){return _0x40231d instanceof _0x58bbe0?_0x40231d:new _0x58bbe0(function(_0x21e1b6){_0x21e1b6(_0x40231d);});}return new(_0x58bbe0||(_0x58bbe0=Promise))(function(_0x567948,_0x1c96d4){function _0x8b6255(_0x5c4731){try{_0x47965f(_0x31f89a[a7_0x2ed9('0x31')](_0x5c4731));}catch(_0x435e7){_0x1c96d4(_0x435e7);}}function _0xf38e3b(_0x9227b9){try{_0x47965f(_0x31f89a[a7_0x2ed9('0x10')](_0x9227b9));}catch(_0x5e6f38){_0x1c96d4(_0x5e6f38);}}function _0x47965f(_0x567f9b){_0x567f9b['done']?_0x567948(_0x567f9b[a7_0x2ed9('0x13')]):_0x532054(_0x567f9b[a7_0x2ed9('0x13')])[a7_0x2ed9('0x30')](_0x8b6255,_0xf38e3b);}_0x47965f((_0x31f89a=_0x31f89a[a7_0x2ed9('0x2e')](_0xa2d04a,_0x47d154||[]))[a7_0x2ed9('0x31')]());});};Object[a7_0x2ed9('0x6')](exports,a7_0x2ed9('0xa'),{'value':!![]});exports[a7_0x2ed9('0x14')]=void 0x0;const create_unchanged_value_timeout_1=require(a7_0x2ed9('0x2c'));const environment_1=require(a7_0x2ed9('0x8'));const waiter_1=require(a7_0x2ed9('0x19'));const {output}=require(a7_0x2ed9('0x1b'));function executeTasks(_0x13940e,_0x5004e7,_0x315530,_0x4a8080,_0x3917b4){return __awaiter(this,void 0x0,void 0x0,function*(){let _0x286ff9=0x0;let _0x56f8cd=null;const _0xb91d37=(0x0,create_unchanged_value_timeout_1['createUnchangedValueTimeout'])({'title':a7_0x2ed9('0x5')+environment_1['NO_MESSAGES_TIMEOUT']/0x3e8+a7_0x2ed9('0x2'),'timeout':environment_1[a7_0x2ed9('0x9')]});const _0x544772=new waiter_1['Waiter']();let _0x36ac51=[];const _0x5a014c=new Date();let _0x5009ea=![];const _0x1fcaf2={};while(!![]){if(environment_1[a7_0x2ed9('0x16')]){output['note']({'title':_0x13940e+a7_0x2ed9('0x2b')});}_0x56f8cd=yield _0x5004e7['tasks'](_0x56f8cd?_0x56f8cd[a7_0x2ed9('0xf')]:null,_0x286ff9,_0x36ac51,_0x3917b4);if(environment_1[a7_0x2ed9('0x16')]){output['note']({'title':_0x13940e+a7_0x2ed9('0x15'),'bodyLines':[a7_0x2ed9('0xd')+_0x56f8cd[a7_0x2ed9('0x12')],a7_0x2ed9('0x24')+_0x56f8cd[a7_0x2ed9('0x25')],a7_0x2ed9('0x1a')+_0x56f8cd[a7_0x2ed9('0x3')],'executionId:\x20'+_0x56f8cd[a7_0x2ed9('0xf')],a7_0x2ed9('0x1e')+_0x56f8cd[a7_0x2ed9('0xe')][a7_0x2ed9('0x4')],'error:\x20'+_0x56f8cd[a7_0x2ed9('0x1c')],a7_0x2ed9('0x20')+_0x56f8cd[a7_0x2ed9('0x33')]]});}if(_0x56f8cd[a7_0x2ed9('0x1c')]){output[a7_0x2ed9('0x27')]({'title':a7_0x2ed9('0x22'),'bodyLines':[a7_0x2ed9('0x17'),_0x56f8cd['criticalErrorMessage']]});process[a7_0x2ed9('0x2f')](0x0);}if((_0x56f8cd===null||_0x56f8cd===void 0x0?void 0x0:_0x56f8cd[a7_0x2ed9('0x3')])&&(_0x56f8cd===null||_0x56f8cd===void 0x0?void 0x0:_0x56f8cd['retryDuring'])!==0x0&&!_0x5009ea&&new Date()[a7_0x2ed9('0x1d')]()-_0x5a014c['getTime']()>_0x56f8cd[a7_0x2ed9('0x3')]){yield _0x544772[a7_0x2ed9('0x2a')]();continue;}if((_0x56f8cd===null||_0x56f8cd===void 0x0?void 0x0:_0x56f8cd['status'])!==undefined){if(_0x56f8cd[a7_0x2ed9('0x25')]===a7_0x2ed9('0x23')||_0x56f8cd[a7_0x2ed9('0x25')]===a7_0x2ed9('0xb')){return;}}else if(_0x56f8cd['completed']){return;}_0xb91d37(_0x56f8cd[a7_0x2ed9('0xe')]['map'](_0x1f956f=>_0x1f956f[a7_0x2ed9('0x1f')])[a7_0x2ed9('0x11')](''));if(!_0x56f8cd[a7_0x2ed9('0xf')]){if(environment_1[a7_0x2ed9('0x16')]){output[a7_0x2ed9('0x7')]({'title':_0x13940e+a7_0x2ed9('0x28')});}yield _0x544772['wait']();_0x286ff9=0x0;_0x36ac51=[];continue;}_0x544772['reset']();_0x5009ea=!![];if(_0x56f8cd[a7_0x2ed9('0x0')]){for(const _0x11dade of _0x56f8cd[a7_0x2ed9('0x0')]){if(_0x1fcaf2[_0x11dade['taskId']])continue;output[a7_0x2ed9('0x7')]({'title':_0x13940e+a7_0x2ed9('0x2d')+_0x11dade['taskId']+a7_0x2ed9('0x1')+_0x11dade[a7_0x2ed9('0x26')]+a7_0x2ed9('0x29')+_0x11dade['url']});yield _0x315530[a7_0x2ed9('0x32')](_0x11dade[a7_0x2ed9('0x26')],_0x11dade[a7_0x2ed9('0x21')]);_0x1fcaf2[_0x11dade[a7_0x2ed9('0x1f')]]=!![];}}const _0xa12ee2=yield _0x4a8080(_0x56f8cd[a7_0x2ed9('0xf')],_0x56f8cd[a7_0x2ed9('0xe')],_0x56f8cd[a7_0x2ed9('0x33')]);for(const _0x4388ad of _0xa12ee2[a7_0x2ed9('0x0')]){_0x1fcaf2[_0x4388ad[a7_0x2ed9('0x1f')]]=!![];}_0x286ff9=_0xa12ee2[a7_0x2ed9('0xc')];_0x36ac51=_0xa12ee2[a7_0x2ed9('0x0')];}});}exports[a7_0x2ed9('0x14')]=executeTasks;
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.executeTasks = void 0;
13
+ const create_unchanged_value_timeout_1 = require("../../../utilities/create-unchanged-value-timeout");
14
+ const environment_1 = require("../../../utilities/environment");
15
+ const waiter_1 = require("../../../utilities/waiter");
16
+ const { output } = require('../../../utilities/nx-imports');
17
+ function executeTasks(agentName, api, dteArtifactStorage, invokeTasks, targets) {
18
+ return __awaiter(this, void 0, void 0, function* () {
19
+ let completedStatusCode = 0;
20
+ let apiResponse = null;
21
+ const failIfSameTasksAfterTimeout = (0, create_unchanged_value_timeout_1.createUnchangedValueTimeout)({
22
+ title: `No new messages received after ${environment_1.NO_MESSAGES_TIMEOUT / 1000} seconds`,
23
+ timeout: environment_1.NO_MESSAGES_TIMEOUT,
24
+ });
25
+ const waiter = new waiter_1.Waiter();
26
+ let completedTasks = [];
27
+ const startTime = new Date();
28
+ let executedAnyTasks = false;
29
+ const processedTasks = {};
30
+ while (true) {
31
+ if (environment_1.VERBOSE_LOGGING) {
32
+ output.note({
33
+ title: `${agentName} fetching tasks...`,
34
+ });
35
+ }
36
+ apiResponse = yield api.tasks(apiResponse ? apiResponse.executionId : null, completedStatusCode, completedTasks, targets);
37
+ if (environment_1.VERBOSE_LOGGING) {
38
+ output.note({
39
+ title: `${agentName} received an API Response`,
40
+ bodyLines: [
41
+ `completed: ${apiResponse.completed}`,
42
+ `status: ${apiResponse.status}`,
43
+ `retryDuring: ${apiResponse.retryDuring}`,
44
+ `executionId: ${apiResponse.executionId}`,
45
+ `number of tasks: ${apiResponse.tasks.length}`,
46
+ `error: ${apiResponse.criticalErrorMessage}`,
47
+ `maxParallel: ${apiResponse.maxParallel}`,
48
+ ],
49
+ });
50
+ }
51
+ if (apiResponse.criticalErrorMessage) {
52
+ output.error({
53
+ title: 'Distributed Execution Terminated',
54
+ bodyLines: ['Error:', apiResponse.criticalErrorMessage],
55
+ });
56
+ process.exit(0);
57
+ }
58
+ // run group is completed but it might be a rerun
59
+ // we will try several times before going further and
60
+ // completed the response
61
+ // we only do it if we haven't executed any tasks
62
+ if ((apiResponse === null || apiResponse === void 0 ? void 0 : apiResponse.retryDuring) &&
63
+ (apiResponse === null || apiResponse === void 0 ? void 0 : apiResponse.retryDuring) !== 0 &&
64
+ !executedAnyTasks &&
65
+ new Date().getTime() - startTime.getTime() > apiResponse.retryDuring) {
66
+ yield waiter.wait();
67
+ continue;
68
+ }
69
+ if ((apiResponse === null || apiResponse === void 0 ? void 0 : apiResponse.status) !== undefined) {
70
+ if (apiResponse.status === 'RUN_GROUP_COMPLETED' ||
71
+ apiResponse.status === 'NO_FURTHER_TASKS_TO_RUN') {
72
+ return;
73
+ }
74
+ }
75
+ else if (apiResponse.completed) {
76
+ return;
77
+ }
78
+ // if status is present that use the status instead of completed, otherwise use completed
79
+ failIfSameTasksAfterTimeout(apiResponse.tasks.map((t) => t.taskId).join(''));
80
+ if (!apiResponse.executionId) {
81
+ if (environment_1.VERBOSE_LOGGING) {
82
+ output.note({
83
+ title: `${agentName} waiting...`,
84
+ });
85
+ }
86
+ yield waiter.wait();
87
+ completedStatusCode = 0;
88
+ completedTasks = [];
89
+ continue;
90
+ }
91
+ waiter.reset();
92
+ executedAnyTasks = true;
93
+ if (apiResponse.completedTasks) {
94
+ for (const t of apiResponse.completedTasks) {
95
+ if (processedTasks[t.taskId])
96
+ continue;
97
+ output.note({
98
+ title: `${agentName} downloading artifacts for ${t.taskId} Hash: ${t.hash} Url: ${t.url}`,
99
+ });
100
+ yield dteArtifactStorage.retrieveAndExtract(t.hash, t.url);
101
+ processedTasks[t.taskId] = true;
102
+ }
103
+ }
104
+ const r = yield invokeTasks(apiResponse.executionId, apiResponse.tasks, apiResponse.maxParallel);
105
+ for (const t of r.completedTasks) {
106
+ processedTasks[t.taskId] = true;
107
+ }
108
+ completedStatusCode = r.completedStatusCode;
109
+ completedTasks = r.completedTasks;
110
+ }
111
+ });
112
+ }
113
+ exports.executeTasks = executeTasks;
114
+ //# sourceMappingURL=execute-tasks.js.map
@@ -1 +1,58 @@
1
- const a8_0x50aa=['map','../../../utilities/nx-imports','value','true','assign','invokeTasksUsingNxImperativeApi','length','status','target','configuration','apply','NX_CLOUD_DISTRIBUTED_EXECUTION_ID','defineProperty','taskId','params','invoke','taskGraph','tasks','projectName','env','values','__awaiter','next'];(function(_0x19f03d,_0x50aac1){const _0xd9b15c=function(_0x1ab787){while(--_0x1ab787){_0x19f03d['push'](_0x19f03d['shift']());}};_0xd9b15c(++_0x50aac1);}(a8_0x50aa,0xd1));const a8_0xd9b1=function(_0x19f03d,_0x50aac1){_0x19f03d=_0x19f03d-0x0;let _0xd9b15c=a8_0x50aa[_0x19f03d];return _0xd9b15c;};'use strict';var __awaiter=this&&this[a8_0xd9b1('0x13')]||function(_0x2f1428,_0x439699,_0x3be118,_0xcf803b){function _0x51eba6(_0x47d2ec){return _0x47d2ec instanceof _0x3be118?_0x47d2ec:new _0x3be118(function(_0x44fd18){_0x44fd18(_0x47d2ec);});}return new(_0x3be118||(_0x3be118=Promise))(function(_0x1027bd,_0x20fe39){function _0x4bffca(_0x149611){try{_0x2b93cd(_0xcf803b['next'](_0x149611));}catch(_0x5ec6a7){_0x20fe39(_0x5ec6a7);}}function _0x5a5ea7(_0x9e130a){try{_0x2b93cd(_0xcf803b['throw'](_0x9e130a));}catch(_0x3f9da9){_0x20fe39(_0x3f9da9);}}function _0x2b93cd(_0x268cba){_0x268cba['done']?_0x1027bd(_0x268cba['value']):_0x51eba6(_0x268cba[a8_0xd9b1('0x0')])['then'](_0x4bffca,_0x5a5ea7);}_0x2b93cd((_0xcf803b=_0xcf803b[a8_0xd9b1('0x8')](_0x2f1428,_0x439699||[]))[a8_0xd9b1('0x14')]());});};Object[a8_0xd9b1('0xa')](exports,'__esModule',{'value':!![]});exports[a8_0xd9b1('0x3')]=void 0x0;const {initTasksRunner}=require(a8_0xd9b1('0x16'));const parser=require('yargs-parser');const serializer_overrides_1=require('../../../utilities/serializer-overrides');function invokeTasksUsingNxImperativeApi(_0x3f1eb3){return __awaiter(this,void 0x0,void 0x0,function*(){const _0x2e4637=yield initTasksRunner(_0x3f1eb3);return(_0x447e50,_0x22a3ea,_0x362dfd)=>__awaiter(this,void 0x0,void 0x0,function*(){const _0x3848c7=_0x22a3ea[a8_0xd9b1('0x15')](_0x11dd35=>{const _0x511ac2=parser(_0x11dd35[a8_0xd9b1('0xc')],{'configuration':{'camel-case-expansion':![],'dot-notation':!![]}});const _0x10d175=(0x0,serializer_overrides_1['unparse'])(_0x511ac2);if(_0x511ac2['_'][a8_0xd9b1('0x4')]==0x0){delete _0x511ac2['_'];}return{'id':_0x11dd35[a8_0xd9b1('0xb')],'target':{'project':_0x11dd35[a8_0xd9b1('0x10')],'target':_0x11dd35[a8_0xd9b1('0x6')],'configuration':_0x11dd35[a8_0xd9b1('0x7')]},'overrides':Object[a8_0xd9b1('0x2')](Object[a8_0xd9b1('0x2')]({},_0x511ac2),{'__overrides_unparsed__':_0x10d175})};});process[a8_0xd9b1('0x11')]['NX_CACHE_FAILURES']='true';process[a8_0xd9b1('0x11')][a8_0xd9b1('0x9')]=_0x447e50;process['env']['NX_STREAM_OUTPUT']=a8_0xd9b1('0x1');process[a8_0xd9b1('0x11')]['NX_PREFIX_OUTPUT']=a8_0xd9b1('0x1');const _0x4805cb=yield _0x2e4637[a8_0xd9b1('0xd')]({'tasks':_0x3848c7,'parallel':_0x362dfd});const _0x2be91b=Object[a8_0xd9b1('0x12')](_0x4805cb[a8_0xd9b1('0xe')][a8_0xd9b1('0xf')]);return{'completedTasks':_0x2be91b[a8_0xd9b1('0x15')](_0x38d853=>({'taskId':_0x38d853['id'],'hash':_0x38d853['hash']})),'completedStatusCode':_0x4805cb[a8_0xd9b1('0x5')]};});});}exports[a8_0xd9b1('0x3')]=invokeTasksUsingNxImperativeApi;
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.invokeTasksUsingNxImperativeApi = void 0;
13
+ const { initTasksRunner } = require('../../../utilities/nx-imports');
14
+ const parser = require("yargs-parser");
15
+ const serializer_overrides_1 = require("../../../utilities/serializer-overrides");
16
+ function invokeTasksUsingNxImperativeApi(options) {
17
+ return __awaiter(this, void 0, void 0, function* () {
18
+ const tasksRunner = yield initTasksRunner(options);
19
+ return (executionId, tasksToExecute, parallel) => __awaiter(this, void 0, void 0, function* () {
20
+ const tasks = tasksToExecute.map((t) => {
21
+ const params = parser(t.params, {
22
+ configuration: {
23
+ 'camel-case-expansion': false,
24
+ 'dot-notation': true,
25
+ },
26
+ });
27
+ const unparsed = (0, serializer_overrides_1.unparse)(params);
28
+ if (params._.length == 0) {
29
+ delete params._;
30
+ }
31
+ return {
32
+ id: t.taskId,
33
+ target: {
34
+ project: t.projectName,
35
+ target: t.target,
36
+ configuration: t.configuration,
37
+ },
38
+ overrides: Object.assign(Object.assign({}, params), { __overrides_unparsed__: unparsed }),
39
+ };
40
+ });
41
+ process.env.NX_CACHE_FAILURES = 'true'; // this is only requires because of how we do uploads
42
+ process.env.NX_CLOUD_DISTRIBUTED_EXECUTION_ID = executionId;
43
+ process.env.NX_STREAM_OUTPUT = 'true';
44
+ process.env.NX_PREFIX_OUTPUT = 'true';
45
+ const r = yield tasksRunner.invoke({ tasks, parallel });
46
+ const completedTasks = Object.values(r.taskGraph.tasks);
47
+ return {
48
+ completedTasks: completedTasks.map((t) => ({
49
+ taskId: t.id,
50
+ hash: t.hash,
51
+ })),
52
+ completedStatusCode: r.status,
53
+ };
54
+ });
55
+ });
56
+ }
57
+ exports.invokeTasksUsingNxImperativeApi = invokeTasksUsingNxImperativeApi;
58
+ //# sourceMappingURL=invoke-tasks-using-nx-imperative-api.js.map
@@ -1 +1,97 @@
1
- const a9_0x55a0=['Executing:\x20\x27','__awaiter','projectName',').\x20Tasks\x20hashes\x20haven\x27t\x20been\x20recorded.','--configuration=','target','join','DISTRIBUTED_TASK_EXECUTION_INTERNAL_ERROR_STATUS_CODE','find','toString','../../../utilities/environment','length','../../../utilities/nx-imports','__esModule','configuration','inherit','value','assign','params','throw','child_process','invokeTasksUsingRunMany','npx\x20nx\x20run-many\x20--target=','/tasks-hashes-','next','true','parse','status','Command\x20execution\x20failed\x20(distributed\x20task\x20execution:\x20','unlinkSync','note','push','VERBOSE_LOGGING','forEach','getNxCacheDirectory'];(function(_0x40d906,_0x55a09e){const _0xf50b0f=function(_0x2f384f){while(--_0x2f384f){_0x40d906['push'](_0x40d906['shift']());}};_0xf50b0f(++_0x55a09e);}(a9_0x55a0,0x174));const a9_0xf50b=function(_0x40d906,_0x55a09e){_0x40d906=_0x40d906-0x0;let _0xf50b0f=a9_0x55a0[_0x40d906];return _0xf50b0f;};'use strict';var __awaiter=this&&this[a9_0xf50b('0xe')]||function(_0x96a4b8,_0xa83f86,_0x5e9f0c,_0x4f123a){function _0x10987c(_0x478d16){return _0x478d16 instanceof _0x5e9f0c?_0x478d16:new _0x5e9f0c(function(_0x13f91c){_0x13f91c(_0x478d16);});}return new(_0x5e9f0c||(_0x5e9f0c=Promise))(function(_0x2997dd,_0x33ad45){function _0x5d90e5(_0x516666){try{_0x5e84e8(_0x4f123a[a9_0xf50b('0x2')](_0x516666));}catch(_0x1d3895){_0x33ad45(_0x1d3895);}}function _0x1bef4d(_0x2cc74f){try{_0x5e84e8(_0x4f123a[a9_0xf50b('0x20')](_0x2cc74f));}catch(_0x4f7739){_0x33ad45(_0x4f7739);}}function _0x5e84e8(_0x35c80e){_0x35c80e['done']?_0x2997dd(_0x35c80e[a9_0xf50b('0x1d')]):_0x10987c(_0x35c80e['value'])['then'](_0x5d90e5,_0x1bef4d);}_0x5e84e8((_0x4f123a=_0x4f123a['apply'](_0x96a4b8,_0xa83f86||[]))['next']());});};Object['defineProperty'](exports,a9_0xf50b('0x1a'),{'value':!![]});exports[a9_0xf50b('0x22')]=void 0x0;const environment_1=require(a9_0xf50b('0x17'));const child_process_1=require(a9_0xf50b('0x21'));const fs_1=require('fs');const {output}=require(a9_0xf50b('0x19'));function invokeTasksUsingRunMany(_0x1ab619){return __awaiter(this,void 0x0,void 0x0,function*(){const _0x57347a=completedTasksReader(_0x1ab619);return function _0x11ae83(_0x24b54e,_0x3383f2,_0x49ff32){return __awaiter(this,void 0x0,void 0x0,function*(){let _0x566c88=0x0;const _0xe18eb9=[];for(const _0x312c32 of groupByTarget(_0x3383f2)){const _0x5cd2e0=_0x312c32['configuration']?a9_0xf50b('0x11')+_0x312c32[a9_0xf50b('0x1b')]:'';const _0x5910e8=_0x49ff32>0x1?'\x20--parallel\x20--max-parallel='+_0x49ff32:'';const _0x9816db=a9_0xf50b('0x0')+_0x312c32[a9_0xf50b('0x12')]+'\x20'+_0x5cd2e0+'\x20--projects='+_0x312c32['projects'][a9_0xf50b('0x13')](',')+'\x20'+_0x312c32[a9_0xf50b('0x1f')]+_0x5910e8;if(environment_1[a9_0xf50b('0xa')]){output[a9_0xf50b('0x8')]({'title':a9_0xf50b('0xd')+_0x9816db+'\x27'});}try{(0x0,child_process_1['execSync'])(_0x9816db,{'stdio':['ignore',a9_0xf50b('0x1c'),a9_0xf50b('0x1c')],'env':Object['assign'](Object[a9_0xf50b('0x1e')]({},process['env']),{'NX_CACHE_FAILURES':'true','NX_CLOUD_DISTRIBUTED_EXECUTION_ID':_0x24b54e,'NX_STREAM_OUTPUT':a9_0xf50b('0x3'),'NX_PREFIX_OUTPUT':'true'})});_0xe18eb9[a9_0xf50b('0x9')](..._0x57347a(_0x24b54e));}catch(_0x4cef87){if(_0x4cef87[a9_0xf50b('0x5')]===environment_1[a9_0xf50b('0x14')]){throw _0x4cef87;}else{_0x566c88=0x1;_0xe18eb9[a9_0xf50b('0x9')](..._0x57347a(_0x24b54e));}}}return{'completedStatusCode':_0x566c88,'completedTasks':_0xe18eb9};});};});}exports[a9_0xf50b('0x22')]=invokeTasksUsingRunMany;function groupByTarget(_0x2831c1){const _0x5a07cc=[];_0x2831c1[a9_0xf50b('0xb')](_0x2c3a9d=>{const _0x41dce1=_0x5a07cc[a9_0xf50b('0x15')](_0x5a2c8c=>_0x5a2c8c[a9_0xf50b('0x12')]===_0x2c3a9d[a9_0xf50b('0x12')]&&_0x5a2c8c[a9_0xf50b('0x1b')]===_0x2c3a9d[a9_0xf50b('0x1b')]);if(_0x41dce1){_0x41dce1['projects'][a9_0xf50b('0x9')](_0x2c3a9d[a9_0xf50b('0xf')]);}else{_0x5a07cc['push']({'target':_0x2c3a9d[a9_0xf50b('0x12')],'projects':[_0x2c3a9d[a9_0xf50b('0xf')]],'params':_0x2c3a9d[a9_0xf50b('0x1f')],'configuration':_0x2c3a9d[a9_0xf50b('0x1b')]});}});return _0x5a07cc;}function completedTasksReader(_0xaf4433){const _0x2a2f38=(0x0,environment_1[a9_0xf50b('0xc')])(_0xaf4433);return _0x3e4f32=>{const _0x5893f5=a9_0xf50b('0x6')+_0x3e4f32+a9_0xf50b('0x10');let _0x40847d;try{const _0x28d87f=_0x2a2f38+a9_0xf50b('0x1')+_0x3e4f32;_0x40847d=JSON[a9_0xf50b('0x4')]((0x0,fs_1['readFileSync'])(_0x28d87f)[a9_0xf50b('0x16')]());(0x0,fs_1[a9_0xf50b('0x7')])(_0x28d87f);}catch(_0x332826){throw new Error(_0x5893f5);}if(_0x40847d[a9_0xf50b('0x18')]==0x0){throw new Error(_0x5893f5);}return _0x40847d;};}
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.invokeTasksUsingRunMany = void 0;
13
+ const environment_1 = require("../../../utilities/environment");
14
+ const child_process_1 = require("child_process");
15
+ const fs_1 = require("fs");
16
+ const { output } = require('../../../utilities/nx-imports');
17
+ function invokeTasksUsingRunMany(options) {
18
+ return __awaiter(this, void 0, void 0, function* () {
19
+ const readCompleted = completedTasksReader(options);
20
+ return function invokeTasksUsingRunMany(executionId, tasksToExecute, parallel) {
21
+ return __awaiter(this, void 0, void 0, function* () {
22
+ let completedStatusCode = 0;
23
+ const completedTasks = [];
24
+ for (const g of groupByTarget(tasksToExecute)) {
25
+ const config = g.configuration
26
+ ? `--configuration=${g.configuration}`
27
+ : ``;
28
+ const parallelStr = parallel > 1 ? ` --parallel --max-parallel=${parallel}` : ``;
29
+ // TODO use pnpx or yarn when needed
30
+ const command = `npx nx run-many --target=${g.target} ${config} --projects=${g.projects.join(',')} ${g.params}${parallelStr}`;
31
+ if (environment_1.VERBOSE_LOGGING) {
32
+ output.note({
33
+ title: `Executing: '${command}'`,
34
+ });
35
+ }
36
+ try {
37
+ (0, child_process_1.execSync)(command, {
38
+ stdio: ['ignore', 'inherit', 'inherit'],
39
+ env: Object.assign(Object.assign({}, process.env), { NX_CACHE_FAILURES: 'true', NX_CLOUD_DISTRIBUTED_EXECUTION_ID: executionId, NX_STREAM_OUTPUT: 'true', NX_PREFIX_OUTPUT: 'true' }),
40
+ });
41
+ completedTasks.push(...readCompleted(executionId));
42
+ }
43
+ catch (e) {
44
+ if (e.status === environment_1.DISTRIBUTED_TASK_EXECUTION_INTERNAL_ERROR_STATUS_CODE) {
45
+ throw e;
46
+ }
47
+ else {
48
+ completedStatusCode = 1;
49
+ completedTasks.push(...readCompleted(executionId));
50
+ }
51
+ }
52
+ }
53
+ return { completedStatusCode, completedTasks };
54
+ });
55
+ };
56
+ });
57
+ }
58
+ exports.invokeTasksUsingRunMany = invokeTasksUsingRunMany;
59
+ function groupByTarget(tasks) {
60
+ const res = [];
61
+ tasks.forEach((t) => {
62
+ const r = res.find((rr) => rr.target === t.target && rr.configuration === t.configuration);
63
+ if (r) {
64
+ r.projects.push(t.projectName);
65
+ }
66
+ else {
67
+ res.push({
68
+ target: t.target,
69
+ projects: [t.projectName],
70
+ params: t.params,
71
+ configuration: t.configuration,
72
+ });
73
+ }
74
+ });
75
+ return res;
76
+ }
77
+ function completedTasksReader(options) {
78
+ const cacheDirectory = (0, environment_1.getNxCacheDirectory)(options);
79
+ return (distributedExecutionId) => {
80
+ const errorMessage = `Command execution failed (distributed task execution: ${distributedExecutionId}). Tasks hashes haven\'t been recorded.`;
81
+ let completedTasks;
82
+ try {
83
+ const taskHashesFile = `${cacheDirectory}/tasks-hashes-${distributedExecutionId}`;
84
+ completedTasks = JSON.parse((0, fs_1.readFileSync)(taskHashesFile).toString());
85
+ // remove it such that if the next command crashes we don't read an obsolete file
86
+ (0, fs_1.unlinkSync)(taskHashesFile);
87
+ }
88
+ catch (e) {
89
+ throw new Error(errorMessage);
90
+ }
91
+ if (completedTasks.length == 0) {
92
+ throw new Error(errorMessage);
93
+ }
94
+ return completedTasks;
95
+ };
96
+ }
97
+ //# sourceMappingURL=invoke-tasks-using-run-many.js.map
@@ -5,6 +5,6 @@ export declare class DistributedExecutionApi {
5
5
  constructor(options: CloudTaskRunnerOptions);
6
6
  start(params: any): Promise<string>;
7
7
  status(id: string): Promise<any>;
8
- completeRunGroupWithError(runGroup: string, error: string): Promise<void>;
8
+ completeRunGroupWithError(branch: string | null, runGroup: string, ciExecutionId: string | null, ciExecutionEnv: string, error: string): Promise<void>;
9
9
  }
10
- export declare function createStartRequest(runGroup: string, task: Task[][], options: CloudTaskRunnerOptions): any;
10
+ export declare function createStartRequest(branch: string | null, runGroup: string, ciExecutionId: string | null, ciExecutionEnv: string, task: Task[][], options: CloudTaskRunnerOptions): any;
@@ -1 +1,152 @@
1
- const a10_0x2c61=['completeRunGroup','true','createApiAxiosInstance','/nx-cloud/executions/status','false','axiosMultipleTries','NX_CLOUD_DISTRIBUTED_EXECUTION_AGENT_COUNT','Starting\x20a\x20distributed\x20execution','error','__esModule','../../../utilities/nx-imports','serializeOverrides','mapRespToPerfEntry','recordMetric','runGroup:\x20','/nx-cloud/executions/complete-run-group','note','error:\x20','parallel','done','RUNNER_FAILURE_PERF_ENTRY','next','parseCommand','../../../utilities/axios','__awaiter','hash','target','stopAgentsOnFailure','DistributedExecutionApi','defineProperty','axiosException','../../../utilities/environment','completeRunGroupWithError','VERBOSE_LOGGING','Completing\x20run\x20group\x20with\x20an\x20error','status','message','then','project','data','Workspace\x20is\x20disabled.\x20Cannot\x20perform\x20distributed\x20task\x20executions.','/nx-cloud/executions/start','post','createStartRequest','map','enabled','createMetricRecorder','response','../../../utilities/metric-logger','getBranch','dteStart','maxParallel','agentCount','apiAxiosInstance','value','NX_CLOUD_DISTRIBUTED_EXECUTION_STOP_AGENTS_ON_FAILURE'];(function(_0x1a9ef8,_0x2c6199){const _0x143d33=function(_0x309dbf){while(--_0x309dbf){_0x1a9ef8['push'](_0x1a9ef8['shift']());}};_0x143d33(++_0x2c6199);}(a10_0x2c61,0xd3));const a10_0x143d=function(_0x1a9ef8,_0x2c6199){_0x1a9ef8=_0x1a9ef8-0x0;let _0x143d33=a10_0x2c61[_0x1a9ef8];return _0x143d33;};'use strict';var __awaiter=this&&this[a10_0x143d('0x25')]||function(_0x12831b,_0xce4fb9,_0x228ebb,_0x479a92){function _0xb67d23(_0xab87bb){return _0xab87bb instanceof _0x228ebb?_0xab87bb:new _0x228ebb(function(_0x33920f){_0x33920f(_0xab87bb);});}return new(_0x228ebb||(_0x228ebb=Promise))(function(_0x58e3f4,_0x131ce5){function _0x1856ef(_0x3a2074){try{_0x428d8f(_0x479a92[a10_0x143d('0x22')](_0x3a2074));}catch(_0x248d3d){_0x131ce5(_0x248d3d);}}function _0x25bfb6(_0x313319){try{_0x428d8f(_0x479a92['throw'](_0x313319));}catch(_0x33ce5f){_0x131ce5(_0x33ce5f);}}function _0x428d8f(_0x11d1f6){_0x11d1f6[a10_0x143d('0x20')]?_0x58e3f4(_0x11d1f6[a10_0x143d('0xb')]):_0xb67d23(_0x11d1f6['value'])[a10_0x143d('0x32')](_0x1856ef,_0x25bfb6);}_0x428d8f((_0x479a92=_0x479a92['apply'](_0x12831b,_0xce4fb9||[]))[a10_0x143d('0x22')]());});};Object[a10_0x143d('0x2a')](exports,a10_0x143d('0x16'),{'value':!![]});exports[a10_0x143d('0x0')]=exports['DistributedExecutionApi']=void 0x0;const axios_1=require(a10_0x143d('0x24'));const environment_1=require(a10_0x143d('0x2c'));const metric_logger_1=require(a10_0x143d('0x5'));const serializer_overrides_1=require('../../../utilities/serializer-overrides');const {output}=require(a10_0x143d('0x17'));class DistributedExecutionApi{constructor(_0x2b7612){this['apiAxiosInstance']=(0x0,axios_1[a10_0x143d('0xf')])(_0x2b7612);}['start'](_0x3c0437){var _0x679bf;return __awaiter(this,void 0x0,void 0x0,function*(){const _0x2bfbce=(0x0,metric_logger_1[a10_0x143d('0x3')])(a10_0x143d('0x7'));let _0x249c61;if(environment_1[a10_0x143d('0x2e')]){output['note']({'title':a10_0x143d('0x14'),'bodyLines':[JSON['stringify'](_0x3c0437,null,0x2)]});}try{_0x249c61=yield(0x0,axios_1['axiosMultipleTries'])(()=>this[a10_0x143d('0xa')][a10_0x143d('0x37')](a10_0x143d('0x36'),_0x3c0437));_0x2bfbce[a10_0x143d('0x1a')]((0x0,metric_logger_1['mapRespToPerfEntry'])(_0x249c61));}catch(_0x5039ea){_0x2bfbce[a10_0x143d('0x1a')](((_0x679bf=_0x5039ea===null||_0x5039ea===void 0x0?void 0x0:_0x5039ea['axiosException'])===null||_0x679bf===void 0x0?void 0x0:_0x679bf[a10_0x143d('0x4')])?(0x0,metric_logger_1[a10_0x143d('0x19')])(_0x5039ea[a10_0x143d('0x2b')][a10_0x143d('0x4')]):metric_logger_1[a10_0x143d('0x21')]);throw _0x5039ea;}if(!_0x249c61[a10_0x143d('0x34')][a10_0x143d('0x2')]){throw new Error(a10_0x143d('0x35'));}if(_0x249c61[a10_0x143d('0x34')][a10_0x143d('0x15')]){throw new Error(_0x249c61[a10_0x143d('0x34')][a10_0x143d('0x15')]);}return _0x249c61[a10_0x143d('0x34')]['id'];});}[a10_0x143d('0x30')](_0xc2b725){var _0x13170b;return __awaiter(this,void 0x0,void 0x0,function*(){const _0x371368=(0x0,metric_logger_1[a10_0x143d('0x3')])('dteStatus');try{const _0x3becff=yield(0x0,axios_1[a10_0x143d('0x12')])(()=>this[a10_0x143d('0xa')][a10_0x143d('0x37')](a10_0x143d('0x10'),{'id':_0xc2b725}));_0x371368[a10_0x143d('0x1a')]((0x0,metric_logger_1['mapRespToPerfEntry'])(_0x3becff));return _0x3becff[a10_0x143d('0x34')];}catch(_0x5cc718){_0x371368[a10_0x143d('0x1a')](((_0x13170b=_0x5cc718===null||_0x5cc718===void 0x0?void 0x0:_0x5cc718['axiosException'])===null||_0x13170b===void 0x0?void 0x0:_0x13170b['response'])?(0x0,metric_logger_1[a10_0x143d('0x19')])(_0x5cc718[a10_0x143d('0x2b')]['response']):metric_logger_1['RUNNER_FAILURE_PERF_ENTRY']);output[a10_0x143d('0x15')]({'title':_0x5cc718[a10_0x143d('0x31')]});process['exit'](0x1);}});}[a10_0x143d('0x2d')](_0x45df49,_0x567514){var _0xb4baf3;return __awaiter(this,void 0x0,void 0x0,function*(){const _0x5e2c3f=(0x0,metric_logger_1[a10_0x143d('0x3')])(a10_0x143d('0xd'));if(environment_1['VERBOSE_LOGGING']){output[a10_0x143d('0x1d')]({'title':a10_0x143d('0x2f'),'bodyLines':[a10_0x143d('0x1b')+_0x45df49,a10_0x143d('0x1e')+_0x567514]});}try{const _0x57f444=yield(0x0,axios_1[a10_0x143d('0x12')])(()=>this[a10_0x143d('0xa')][a10_0x143d('0x37')](a10_0x143d('0x1c'),{'runGroup':_0x45df49,'criticalErrorMessage':_0x567514}),0x3);_0x5e2c3f[a10_0x143d('0x1a')]((0x0,metric_logger_1[a10_0x143d('0x19')])(_0x57f444));}catch(_0x3b44ec){_0x5e2c3f[a10_0x143d('0x1a')](((_0xb4baf3=_0x3b44ec===null||_0x3b44ec===void 0x0?void 0x0:_0x3b44ec['axiosException'])===null||_0xb4baf3===void 0x0?void 0x0:_0xb4baf3['response'])?(0x0,metric_logger_1['mapRespToPerfEntry'])(_0x3b44ec[a10_0x143d('0x2b')][a10_0x143d('0x4')]):metric_logger_1[a10_0x143d('0x21')]);}});}}exports[a10_0x143d('0x29')]=DistributedExecutionApi;function createStartRequest(_0x2eea0c,_0x4ffe79,_0x26b7d6){const _0x30ae78=_0x4ffe79[a10_0x143d('0x1')](_0x56e0eb=>{return _0x56e0eb[a10_0x143d('0x1')](_0x1b0b1b=>{return{'taskId':_0x1b0b1b['id'],'hash':_0x1b0b1b[a10_0x143d('0x26')],'projectName':_0x1b0b1b[a10_0x143d('0x27')][a10_0x143d('0x33')],'target':_0x1b0b1b[a10_0x143d('0x27')][a10_0x143d('0x27')],'configuration':_0x1b0b1b[a10_0x143d('0x27')]['configuration']||null,'params':(0x0,serializer_overrides_1[a10_0x143d('0x18')])(_0x1b0b1b)};});});const _0x2d99fd={'command':(0x0,environment_1[a10_0x143d('0x23')])(),'branch':(0x0,environment_1[a10_0x143d('0x6')])(),'runGroup':_0x2eea0c,'tasks':_0x30ae78,'maxParallel':calculateMaxParallel(_0x26b7d6)};if(environment_1[a10_0x143d('0x13')]){_0x2d99fd[a10_0x143d('0x9')]=environment_1[a10_0x143d('0x13')];}if(!environment_1[a10_0x143d('0xc')]){_0x2d99fd[a10_0x143d('0x28')]=![];}return _0x2d99fd;}exports[a10_0x143d('0x0')]=createStartRequest;function calculateMaxParallel(_0x2126c9){if(_0x2126c9['parallel']===a10_0x143d('0x11')||_0x2126c9['parallel']===![]){return 0x1;}else if(_0x2126c9[a10_0x143d('0x1f')]===a10_0x143d('0xe')||_0x2126c9[a10_0x143d('0x1f')]===!![]){return Number(_0x2126c9[a10_0x143d('0x8')]||0x3);}else if(_0x2126c9[a10_0x143d('0x1f')]===undefined){return _0x2126c9[a10_0x143d('0x8')]?Number(_0x2126c9[a10_0x143d('0x8')]):0x3;}else{return Number(_0x2126c9['parallel'])||0x3;}}
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.createStartRequest = exports.DistributedExecutionApi = void 0;
13
+ const axios_1 = require("../../../utilities/axios");
14
+ const environment_1 = require("../../../utilities/environment");
15
+ const metric_logger_1 = require("../../../utilities/metric-logger");
16
+ const serializer_overrides_1 = require("../../../utilities/serializer-overrides");
17
+ const { output } = require('../../../utilities/nx-imports');
18
+ class DistributedExecutionApi {
19
+ constructor(options) {
20
+ this.apiAxiosInstance = (0, axios_1.createApiAxiosInstance)(options);
21
+ }
22
+ start(params) {
23
+ var _a;
24
+ return __awaiter(this, void 0, void 0, function* () {
25
+ const recorder = (0, metric_logger_1.createMetricRecorder)('dteStart');
26
+ let resp;
27
+ if (environment_1.VERBOSE_LOGGING) {
28
+ output.note({
29
+ title: 'Starting a distributed execution',
30
+ bodyLines: [JSON.stringify(params, null, 2)],
31
+ });
32
+ }
33
+ try {
34
+ resp = yield (0, axios_1.axiosMultipleTries)(() => this.apiAxiosInstance.post('/nx-cloud/executions/start', params));
35
+ recorder.recordMetric((0, metric_logger_1.mapRespToPerfEntry)(resp));
36
+ }
37
+ catch (e) {
38
+ recorder.recordMetric(((_a = e === null || e === void 0 ? void 0 : e.axiosException) === null || _a === void 0 ? void 0 : _a.response)
39
+ ? (0, metric_logger_1.mapRespToPerfEntry)(e.axiosException.response)
40
+ : metric_logger_1.RUNNER_FAILURE_PERF_ENTRY);
41
+ throw e;
42
+ }
43
+ if (!resp.data.enabled) {
44
+ throw new Error(`Workspace is disabled. Cannot perform distributed task executions.`);
45
+ }
46
+ if (resp.data.error) {
47
+ throw new Error(resp.data.error);
48
+ }
49
+ return resp.data.id;
50
+ });
51
+ }
52
+ status(id) {
53
+ var _a;
54
+ return __awaiter(this, void 0, void 0, function* () {
55
+ const recorder = (0, metric_logger_1.createMetricRecorder)('dteStatus');
56
+ try {
57
+ const resp = yield (0, axios_1.axiosMultipleTries)(() => this.apiAxiosInstance.post('/nx-cloud/executions/status', {
58
+ id,
59
+ }));
60
+ recorder.recordMetric((0, metric_logger_1.mapRespToPerfEntry)(resp));
61
+ return resp.data;
62
+ }
63
+ catch (e) {
64
+ recorder.recordMetric(((_a = e === null || e === void 0 ? void 0 : e.axiosException) === null || _a === void 0 ? void 0 : _a.response)
65
+ ? (0, metric_logger_1.mapRespToPerfEntry)(e.axiosException.response)
66
+ : metric_logger_1.RUNNER_FAILURE_PERF_ENTRY);
67
+ output.error({
68
+ title: e.message,
69
+ });
70
+ process.exit(1);
71
+ }
72
+ });
73
+ }
74
+ completeRunGroupWithError(branch, runGroup, ciExecutionId, ciExecutionEnv, error) {
75
+ var _a;
76
+ return __awaiter(this, void 0, void 0, function* () {
77
+ const recorder = (0, metric_logger_1.createMetricRecorder)('completeRunGroup');
78
+ if (environment_1.VERBOSE_LOGGING) {
79
+ output.note({
80
+ title: 'Completing with an error',
81
+ bodyLines: [
82
+ `ciExecutionId: ${ciExecutionId}`,
83
+ `ciExecutionEnv: ${ciExecutionEnv}`,
84
+ `runGroup: ${runGroup}`,
85
+ `error: ${error}`,
86
+ ],
87
+ });
88
+ }
89
+ try {
90
+ const resp = yield (0, axios_1.axiosMultipleTries)(() => this.apiAxiosInstance.post('/nx-cloud/executions/complete-run-group', {
91
+ runGroup,
92
+ ciExecutionId,
93
+ ciExecutionEnv,
94
+ criticalErrorMessage: error,
95
+ }), 3);
96
+ recorder.recordMetric((0, metric_logger_1.mapRespToPerfEntry)(resp));
97
+ }
98
+ catch (e) {
99
+ recorder.recordMetric(((_a = e === null || e === void 0 ? void 0 : e.axiosException) === null || _a === void 0 ? void 0 : _a.response)
100
+ ? (0, metric_logger_1.mapRespToPerfEntry)(e.axiosException.response)
101
+ : metric_logger_1.RUNNER_FAILURE_PERF_ENTRY);
102
+ }
103
+ });
104
+ }
105
+ }
106
+ exports.DistributedExecutionApi = DistributedExecutionApi;
107
+ function createStartRequest(branch, runGroup, ciExecutionId, ciExecutionEnv, task, options) {
108
+ const tasksToExecute = task.map((arr) => {
109
+ return arr.map((t) => {
110
+ return {
111
+ taskId: t.id,
112
+ hash: t.hash,
113
+ projectName: t.target.project,
114
+ target: t.target.target,
115
+ configuration: t.target.configuration || null,
116
+ params: (0, serializer_overrides_1.serializeOverrides)(t),
117
+ };
118
+ });
119
+ });
120
+ const request = {
121
+ command: (0, environment_1.parseCommand)(),
122
+ branch,
123
+ runGroup,
124
+ ciExecutionId,
125
+ ciExecutionEnv,
126
+ tasks: tasksToExecute,
127
+ maxParallel: calculateMaxParallel(options),
128
+ };
129
+ if (environment_1.NX_CLOUD_DISTRIBUTED_EXECUTION_AGENT_COUNT) {
130
+ request.agentCount = environment_1.NX_CLOUD_DISTRIBUTED_EXECUTION_AGENT_COUNT;
131
+ }
132
+ if (!environment_1.NX_CLOUD_DISTRIBUTED_EXECUTION_STOP_AGENTS_ON_FAILURE) {
133
+ request.stopAgentsOnFailure = false;
134
+ }
135
+ return request;
136
+ }
137
+ exports.createStartRequest = createStartRequest;
138
+ function calculateMaxParallel(options) {
139
+ if (options.parallel === 'false' || options.parallel === false) {
140
+ return 1;
141
+ }
142
+ else if (options.parallel === 'true' || options.parallel === true) {
143
+ return Number(options.maxParallel || 3);
144
+ }
145
+ else if (options.parallel === undefined) {
146
+ return options.maxParallel ? Number(options.maxParallel) : 3;
147
+ }
148
+ else {
149
+ return Number(options.parallel) || 3;
150
+ }
151
+ }
152
+ //# sourceMappingURL=distributed-execution.api.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"distributed-execution.api.js","sourceRoot":"","sources":["../../../../../../../../libs/nx-packages/nx-cloud/lib/core/runners/distributed-execution/distributed-execution.api.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"distributed-execution.api.js","sourceRoot":"","sources":["../../../../../../../../libs/nx-packages/nx-cloud/lib/core/runners/distributed-execution/distributed-execution.api.ts"],"names":[],"mappings":"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"}