@nrwl/nx-cloud 14.1.1 → 14.1.2-beta.1
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/lib/core/api/error-reporter.api.js +36 -1
- package/lib/core/api/run-group.api.js +65 -1
- package/lib/core/runners/cloud-enabled/cloud-enabled-life-cycle.js +138 -1
- package/lib/core/runners/cloud-enabled/cloud-enabled.runner.js +169 -1
- package/lib/core/runners/cloud-enabled/cloud-remote-cache.js +113 -1
- package/lib/core/runners/cloud-enabled/cloud-run.api.js +166 -1
- package/lib/core/runners/distributed-agent/distributed-agent.api.js +79 -1
- package/lib/core/runners/distributed-agent/distributed-agent.impl.js +240 -1
- package/lib/core/runners/distributed-execution/distributed-execution.api.js +131 -1
- package/lib/core/runners/distributed-execution/distributed-execution.runner.js +309 -1
- package/package.json +1 -1
|
@@ -1 +1,36 @@
|
|
|
1
|
-
|
|
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.ErrorReporterApi = void 0;
|
|
13
|
+
const axios_1 = require("../../utilities/axios");
|
|
14
|
+
const { output } = require('../../utilities/nx-imports');
|
|
15
|
+
class ErrorReporterApi {
|
|
16
|
+
constructor(options) {
|
|
17
|
+
this.apiAxiosInstance = (0, axios_1.createApiAxiosInstance)(options);
|
|
18
|
+
}
|
|
19
|
+
reportError(message) {
|
|
20
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
21
|
+
try {
|
|
22
|
+
yield (0, axios_1.axiosMultipleTries)(() => this.apiAxiosInstance.post('/nx-cloud/report-client-error', {
|
|
23
|
+
message,
|
|
24
|
+
}));
|
|
25
|
+
}
|
|
26
|
+
catch (e) {
|
|
27
|
+
output.warn({
|
|
28
|
+
title: `Unable to record the following error: '${message}'`,
|
|
29
|
+
bodyLines: [e.message],
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
exports.ErrorReporterApi = ErrorReporterApi;
|
|
36
|
+
//# sourceMappingURL=error-reporter.api.js.map
|
|
@@ -1 +1,65 @@
|
|
|
1
|
-
|
|
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.RunGroupApi = void 0;
|
|
13
|
+
const axios_1 = require("../../utilities/axios");
|
|
14
|
+
const metric_logger_1 = require("../../utilities/metric-logger");
|
|
15
|
+
const { output } = require('../../utilities/nx-imports');
|
|
16
|
+
class RunGroupApi {
|
|
17
|
+
constructor(options) {
|
|
18
|
+
this.apiAxiosInstance = (0, axios_1.createApiAxiosInstance)(options);
|
|
19
|
+
}
|
|
20
|
+
createRunGroup(branch, runGroup) {
|
|
21
|
+
var _a;
|
|
22
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
23
|
+
const recorder = (0, metric_logger_1.createMetricRecorder)('createRunGroup');
|
|
24
|
+
try {
|
|
25
|
+
const resp = yield (0, axios_1.axiosMultipleTries)(() => this.apiAxiosInstance.post('/nx-cloud/executions/create-run-group', {
|
|
26
|
+
branch: branch,
|
|
27
|
+
runGroup: runGroup,
|
|
28
|
+
}));
|
|
29
|
+
recorder.recordMetric((0, metric_logger_1.mapRespToPerfEntry)(resp));
|
|
30
|
+
}
|
|
31
|
+
catch (e) {
|
|
32
|
+
recorder.recordMetric(((_a = e === null || e === void 0 ? void 0 : e.axiosException) === null || _a === void 0 ? void 0 : _a.response)
|
|
33
|
+
? (0, metric_logger_1.mapRespToPerfEntry)(e.axiosException.response)
|
|
34
|
+
: metric_logger_1.RUNNER_FAILURE_PERF_ENTRY);
|
|
35
|
+
output.error({
|
|
36
|
+
title: e.message,
|
|
37
|
+
});
|
|
38
|
+
process.exit(1);
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
completeRunGroup(runGroup) {
|
|
43
|
+
var _a;
|
|
44
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
45
|
+
const recorder = (0, metric_logger_1.createMetricRecorder)('createRunGroup');
|
|
46
|
+
try {
|
|
47
|
+
const resp = yield (0, axios_1.axiosMultipleTries)(() => this.apiAxiosInstance.post('/nx-cloud/executions/complete-run-group', {
|
|
48
|
+
runGroup: runGroup,
|
|
49
|
+
}));
|
|
50
|
+
recorder.recordMetric((0, metric_logger_1.mapRespToPerfEntry)(resp));
|
|
51
|
+
}
|
|
52
|
+
catch (e) {
|
|
53
|
+
recorder.recordMetric(((_a = e === null || e === void 0 ? void 0 : e.axiosException) === null || _a === void 0 ? void 0 : _a.response)
|
|
54
|
+
? (0, metric_logger_1.mapRespToPerfEntry)(e.axiosException.response)
|
|
55
|
+
: metric_logger_1.RUNNER_FAILURE_PERF_ENTRY);
|
|
56
|
+
output.error({
|
|
57
|
+
title: e.message,
|
|
58
|
+
});
|
|
59
|
+
process.exit(1);
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
exports.RunGroupApi = RunGroupApi;
|
|
65
|
+
//# sourceMappingURL=run-group.api.js.map
|
|
@@ -1 +1,138 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CloudEnabledLifeCycle = void 0;
|
|
4
|
+
const path = require("path");
|
|
5
|
+
const path_1 = require("path");
|
|
6
|
+
const fs_1 = require("fs");
|
|
7
|
+
const environment_1 = require("../../../utilities/environment");
|
|
8
|
+
const serializer_overrides_1 = require("../../../utilities/serializer-overrides");
|
|
9
|
+
const { workspaceRoot } = require('../../../utilities/nx-imports');
|
|
10
|
+
class CloudEnabledLifeCycle {
|
|
11
|
+
constructor(runContext, cacheDirectory, skipNxCache, collectTerminalOutput, cacheableOperations, outputObfuscator, tasks) {
|
|
12
|
+
this.runContext = runContext;
|
|
13
|
+
this.cacheDirectory = cacheDirectory;
|
|
14
|
+
this.skipNxCache = skipNxCache;
|
|
15
|
+
this.collectTerminalOutput = collectTerminalOutput;
|
|
16
|
+
this.cacheableOperations = cacheableOperations;
|
|
17
|
+
this.outputObfuscator = outputObfuscator;
|
|
18
|
+
this.tasks = tasks;
|
|
19
|
+
}
|
|
20
|
+
scheduleTask(task) {
|
|
21
|
+
this.runContext.scheduledTasks.push(task);
|
|
22
|
+
}
|
|
23
|
+
startTask(task) {
|
|
24
|
+
this.tasks.push({
|
|
25
|
+
taskId: task.id,
|
|
26
|
+
startTime: new Date().toISOString(),
|
|
27
|
+
target: task.target.target,
|
|
28
|
+
projectName: task.target.project,
|
|
29
|
+
hash: task.hash,
|
|
30
|
+
hashDetails: this.cleanUpHashDetails(task.hashDetails),
|
|
31
|
+
params: (0, serializer_overrides_1.serializeOverrides)(task),
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
// Used for older version for Nx. Remove in Dec 2022
|
|
35
|
+
endTask(task, code) {
|
|
36
|
+
let cacheStatus;
|
|
37
|
+
if (this.runContext.statuses[task.hash]) {
|
|
38
|
+
cacheStatus = this.runContext.statuses[task.hash];
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
if (this.cacheableOperations.indexOf(task.target.target) > -1 &&
|
|
42
|
+
!this.skipNxCache) {
|
|
43
|
+
cacheStatus = 'local-cache-hit';
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
cacheStatus = 'cache-miss';
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
this.updateStartedTask(task, code, cacheStatus);
|
|
50
|
+
}
|
|
51
|
+
endTasks(tasks) {
|
|
52
|
+
for (let t of tasks) {
|
|
53
|
+
const status = t.status === 'remote-cache'
|
|
54
|
+
? 'remote-cache-hit'
|
|
55
|
+
: t.status === 'local-cache' ||
|
|
56
|
+
t.status === 'local-cache-kept-existing'
|
|
57
|
+
? 'local-cache-hit'
|
|
58
|
+
: 'cache-miss';
|
|
59
|
+
this.updateStartedTask(t.task, t.code, status);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
endCommand() { }
|
|
63
|
+
updateStartedTask(task, code, cacheStatus) {
|
|
64
|
+
const startedTask = this.tasks.find((t) => t.taskId === task.id);
|
|
65
|
+
if (!startedTask) {
|
|
66
|
+
throw new Error(`Cannot find task ${task.id}`);
|
|
67
|
+
}
|
|
68
|
+
startedTask.endTime = new Date().toISOString();
|
|
69
|
+
startedTask.status = code;
|
|
70
|
+
startedTask.params = this.outputObfuscator.obfuscate(startedTask.params);
|
|
71
|
+
startedTask.cacheStatus = cacheStatus;
|
|
72
|
+
if (this.collectTerminalOutput) {
|
|
73
|
+
startedTask.terminalOutput = this.getTerminalOutput(task.hash, startedTask.cacheStatus, code);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
getTerminalOutput(hash, cacheStatus, code) {
|
|
77
|
+
let dir;
|
|
78
|
+
if (this.cacheDirectory) {
|
|
79
|
+
if (this.cacheDirectory.startsWith('./')) {
|
|
80
|
+
dir = (0, path_1.join)(workspaceRoot, this.cacheDirectory);
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
dir = this.cacheDirectory;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
dir = (0, path_1.join)(workspaceRoot, 'node_modules', '.cache', 'nx');
|
|
88
|
+
}
|
|
89
|
+
try {
|
|
90
|
+
const taskOutput = this.readTerminalOutputFile(dir, hash);
|
|
91
|
+
const taskOutputSanitized = this.outputObfuscator.obfuscate(taskOutput);
|
|
92
|
+
if (environment_1.NX_CLOUD_UNLIMITED_OUTPUT)
|
|
93
|
+
return taskOutputSanitized;
|
|
94
|
+
const maxCharacters = cacheStatus === 'cache-miss'
|
|
95
|
+
? code === 0
|
|
96
|
+
? CloudEnabledLifeCycle.MAX_CHARACTERS_SUCCESSFUL_TASK
|
|
97
|
+
: CloudEnabledLifeCycle.MAX_CHARACTERS_FAILED_TASK
|
|
98
|
+
: CloudEnabledLifeCycle.MAX_CHARACTERS_CACHED_TASK;
|
|
99
|
+
return taskOutputSanitized.length > maxCharacters
|
|
100
|
+
? `TRUNCATED\n\n${taskOutputSanitized.slice(taskOutputSanitized.length - maxCharacters)}`
|
|
101
|
+
: taskOutputSanitized;
|
|
102
|
+
}
|
|
103
|
+
catch (e) {
|
|
104
|
+
return '';
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
cleanUpHashDetails(hashDetails) {
|
|
108
|
+
const nodes = {};
|
|
109
|
+
Object.keys(hashDetails.nodes)
|
|
110
|
+
.filter((k) => !k.startsWith('npm:'))
|
|
111
|
+
.forEach((k) => {
|
|
112
|
+
nodes[k] = hashDetails.nodes[k];
|
|
113
|
+
});
|
|
114
|
+
return {
|
|
115
|
+
nodes,
|
|
116
|
+
runtime: hashDetails.runtime,
|
|
117
|
+
implicitDeps: hashDetails.implicitDeps,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
readTerminalOutputFile(dir, hash) {
|
|
121
|
+
try {
|
|
122
|
+
return (0, fs_1.readFileSync)(path.join(dir, 'terminalOutputs', hash)).toString();
|
|
123
|
+
}
|
|
124
|
+
catch (_a) {
|
|
125
|
+
try {
|
|
126
|
+
return (0, fs_1.readFileSync)(path.join(dir, hash, 'terminalOutput')).toString();
|
|
127
|
+
}
|
|
128
|
+
catch (_b) {
|
|
129
|
+
return '';
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
exports.CloudEnabledLifeCycle = CloudEnabledLifeCycle;
|
|
135
|
+
CloudEnabledLifeCycle.MAX_CHARACTERS_FAILED_TASK = 200000;
|
|
136
|
+
CloudEnabledLifeCycle.MAX_CHARACTERS_SUCCESSFUL_TASK = 20000;
|
|
137
|
+
CloudEnabledLifeCycle.MAX_CHARACTERS_CACHED_TASK = 20000;
|
|
138
|
+
//# sourceMappingURL=cloud-enabled-life-cycle.js.map
|
|
@@ -1 +1,169 @@
|
|
|
1
|
-
|
|
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.cloudEnabledTasksRunner = void 0;
|
|
13
|
+
const message_reporter_1 = require("../../terminal-output/message-reporter");
|
|
14
|
+
const end_of_run_message_1 = require("../../terminal-output/end-of-run-message");
|
|
15
|
+
const output_obfuscator_1 = require("../../terminal-output/output-obfuscator");
|
|
16
|
+
const cloud_enabled_life_cycle_1 = require("./cloud-enabled-life-cycle");
|
|
17
|
+
const file_storage_1 = require("../../file-storage/file-storage");
|
|
18
|
+
const e2e_encryption_1 = require("../../file-storage/e2e-encryption");
|
|
19
|
+
const environment_1 = require("../../../utilities/environment");
|
|
20
|
+
const cloud_remote_cache_1 = require("./cloud-remote-cache");
|
|
21
|
+
const cloud_run_api_1 = require("./cloud-run.api");
|
|
22
|
+
const fs_1 = require("fs");
|
|
23
|
+
const path = require("path");
|
|
24
|
+
const metric_logger_1 = require("../../../utilities/metric-logger");
|
|
25
|
+
const error_reporter_api_1 = require("../../api/error-reporter.api");
|
|
26
|
+
const { tasksRunner, output } = require('../../../utilities/nx-imports');
|
|
27
|
+
function createApi(errors, options, runContext) {
|
|
28
|
+
const machineInfo = (0, environment_1.getMachineInfo)(options);
|
|
29
|
+
return new cloud_run_api_1.CloudRunApi(errors, runContext, options, machineInfo);
|
|
30
|
+
}
|
|
31
|
+
function storeTaskHashes(taskExecutions, directory, distributedExecutionId) {
|
|
32
|
+
const hashes = JSON.stringify(taskExecutions.map((t) => ({
|
|
33
|
+
taskId: t.taskId,
|
|
34
|
+
hash: t.hash,
|
|
35
|
+
})));
|
|
36
|
+
if (environment_1.VERBOSE_LOGGING) {
|
|
37
|
+
output.note({
|
|
38
|
+
title: `Executed tasks with hashes: ${hashes}`,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
(0, fs_1.writeFileSync)(path.join(directory, `tasks-hashes-${distributedExecutionId}`), hashes);
|
|
42
|
+
}
|
|
43
|
+
function onComplete(lifeCycle, options, remoteCache, api, outputObfuscator, runStartTime, messages, endOfRunMessage, taskExecutions, versionOfNxBefore133, inner) {
|
|
44
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
45
|
+
const runEndTime = new Date().toISOString();
|
|
46
|
+
if (environment_1.AGENT_RUNNING_IN_DISTRIBUTED_EXECUTION) {
|
|
47
|
+
storeTaskHashes(taskExecutions, options.cacheDirectory || './node_modules/.cache/nx', environment_1.NX_CLOUD_DISTRIBUTED_EXECUTION_ID);
|
|
48
|
+
}
|
|
49
|
+
const branch = (0, environment_1.getBranch)();
|
|
50
|
+
const endRequest = yield Promise.all([
|
|
51
|
+
remoteCache.waitForStoreRequestsToComplete(),
|
|
52
|
+
api.endRun({
|
|
53
|
+
command: outputObfuscator.obfuscate((0, environment_1.parseCommand)()),
|
|
54
|
+
startTime: runStartTime,
|
|
55
|
+
endTime: runEndTime,
|
|
56
|
+
distributedExecutionId: environment_1.NX_CLOUD_DISTRIBUTED_EXECUTION_ID,
|
|
57
|
+
branch: branch,
|
|
58
|
+
scan: true,
|
|
59
|
+
runGroup: (0, environment_1.getRunGroup)(),
|
|
60
|
+
// only set sha if branch is set because we invoke a separate process,
|
|
61
|
+
// which adds a few millis
|
|
62
|
+
sha: branch ? (0, environment_1.extractGitSha)() : undefined,
|
|
63
|
+
inner: inner,
|
|
64
|
+
}, taskExecutions),
|
|
65
|
+
]);
|
|
66
|
+
// this workaround is required because prior to Nx 13.3 we printed
|
|
67
|
+
// the end message after the runner completes, so we need to wait for the
|
|
68
|
+
// message to appear in the right place
|
|
69
|
+
if (versionOfNxBefore133) {
|
|
70
|
+
setTimeout(() => {
|
|
71
|
+
messages.printMessages();
|
|
72
|
+
if (!messages.anyErrors && !inner) {
|
|
73
|
+
endOfRunMessage.printCacheHitsMessage();
|
|
74
|
+
}
|
|
75
|
+
}, 0);
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
messages.printMessages();
|
|
79
|
+
if (!messages.anyErrors && !inner) {
|
|
80
|
+
endOfRunMessage.printCacheHitsMessage();
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
if (environment_1.AGENT_RUNNING_IN_DISTRIBUTED_EXECUTION) {
|
|
84
|
+
if (!endRequest[0]) {
|
|
85
|
+
output.error({
|
|
86
|
+
title: `Agent wasn't able to store artifacts`,
|
|
87
|
+
});
|
|
88
|
+
messages.printMessages();
|
|
89
|
+
process.exit(environment_1.DISTRIBUTED_TASK_EXECUTION_INTERNAL_ERROR_STATUS_CODE);
|
|
90
|
+
}
|
|
91
|
+
if (!endRequest[1]) {
|
|
92
|
+
output.error({
|
|
93
|
+
title: `Agent wasn't able to record its run`,
|
|
94
|
+
});
|
|
95
|
+
messages.printMessages();
|
|
96
|
+
process.exit(environment_1.DISTRIBUTED_TASK_EXECUTION_INTERNAL_ERROR_STATUS_CODE);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
yield (0, metric_logger_1.submitRunMetrics)(options);
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
function createLifeCycle(runContext, options, outputObfuscator, tasks) {
|
|
103
|
+
const cloudEnabledLifeCycle = new cloud_enabled_life_cycle_1.CloudEnabledLifeCycle(runContext, options.cacheDirectory, !!options.skipNxCache, options.scan === undefined ? true : options.scan, options.cacheableOperations || [], outputObfuscator, tasks);
|
|
104
|
+
try {
|
|
105
|
+
const { CompositeLifeCycle } = require('../../../utilities/nx-imports');
|
|
106
|
+
if (!CompositeLifeCycle)
|
|
107
|
+
return cloudEnabledLifeCycle;
|
|
108
|
+
return new CompositeLifeCycle([options.lifeCycle, cloudEnabledLifeCycle]);
|
|
109
|
+
}
|
|
110
|
+
catch (e) {
|
|
111
|
+
return cloudEnabledLifeCycle;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
function cloudEnabledTasksRunner(tasks, options, context, inner = false) {
|
|
115
|
+
const runContext = {
|
|
116
|
+
statuses: {},
|
|
117
|
+
scheduledTasks: [],
|
|
118
|
+
requests: {},
|
|
119
|
+
allTasks: tasks,
|
|
120
|
+
};
|
|
121
|
+
const versionOfNxBefore133 = options.lifeCycle === undefined;
|
|
122
|
+
const taskExecutions = [];
|
|
123
|
+
const messages = new message_reporter_1.MessageReporter(options);
|
|
124
|
+
const api = createApi(messages, options, runContext);
|
|
125
|
+
const endOfRunMessage = new end_of_run_message_1.EndOfRunMessage(runContext, taskExecutions);
|
|
126
|
+
const outputObfuscator = new output_obfuscator_1.OutputObfuscator(options.maskedProperties);
|
|
127
|
+
const hashes = tasks.map((t) => t.hash).filter((h) => !!h);
|
|
128
|
+
const startRunRequest = api.startRun(environment_1.NX_CLOUD_DISTRIBUTED_EXECUTION_ID, hashes);
|
|
129
|
+
hashes.forEach((hash) => {
|
|
130
|
+
runContext.requests[hash] = startRunRequest;
|
|
131
|
+
});
|
|
132
|
+
const runStartTime = new Date().toISOString();
|
|
133
|
+
const lifeCycle = createLifeCycle(runContext, options, outputObfuscator, taskExecutions);
|
|
134
|
+
const encryption = new e2e_encryption_1.E2EEncryption(environment_1.ENCRYPTION_KEY || options.encryptionKey);
|
|
135
|
+
const errorApi = new error_reporter_api_1.ErrorReporterApi(options);
|
|
136
|
+
const fileStorage = new file_storage_1.FileStorage(encryption, errorApi, false);
|
|
137
|
+
const remoteCache = new cloud_remote_cache_1.CloudRemoteCache(messages, api, runContext, fileStorage);
|
|
138
|
+
// have to reset it so we don't capture inner tasks
|
|
139
|
+
delete process.env.NX_CLOUD_DISTRIBUTED_EXECUTION_ID;
|
|
140
|
+
const res = tasksRunner(tasks, Object.assign(Object.assign({}, options), { remoteCache, lifeCycle }), context);
|
|
141
|
+
// observable -> legacy
|
|
142
|
+
if (res.subscribe) {
|
|
143
|
+
const { Subject } = require('rxjs/internal/Subject');
|
|
144
|
+
const wrappedRes = new Subject();
|
|
145
|
+
res.subscribe({
|
|
146
|
+
next: (value) => wrappedRes.next(value),
|
|
147
|
+
error: (err) => wrappedRes.error(err),
|
|
148
|
+
complete: () => __awaiter(this, void 0, void 0, function* () {
|
|
149
|
+
yield onComplete(lifeCycle, options, remoteCache, api, outputObfuscator, runStartTime, messages, endOfRunMessage, taskExecutions, versionOfNxBefore133, inner);
|
|
150
|
+
wrappedRes.complete();
|
|
151
|
+
}),
|
|
152
|
+
});
|
|
153
|
+
return wrappedRes;
|
|
154
|
+
// promise
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
return res
|
|
158
|
+
.then((r) => __awaiter(this, void 0, void 0, function* () {
|
|
159
|
+
yield onComplete(lifeCycle, options, remoteCache, api, outputObfuscator, runStartTime, messages, endOfRunMessage, taskExecutions, versionOfNxBefore133, inner);
|
|
160
|
+
return r;
|
|
161
|
+
}))
|
|
162
|
+
.catch((e) => __awaiter(this, void 0, void 0, function* () {
|
|
163
|
+
yield onComplete(lifeCycle, options, remoteCache, api, outputObfuscator, runStartTime, messages, endOfRunMessage, taskExecutions, versionOfNxBefore133, inner);
|
|
164
|
+
throw e;
|
|
165
|
+
}));
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
exports.cloudEnabledTasksRunner = cloudEnabledTasksRunner;
|
|
169
|
+
//# sourceMappingURL=cloud-enabled.runner.js.map
|
|
@@ -1 +1,113 @@
|
|
|
1
|
-
|
|
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.CloudRemoteCache = void 0;
|
|
13
|
+
const environment_1 = require("../../../utilities/environment");
|
|
14
|
+
const { output } = require('../../../utilities/nx-imports');
|
|
15
|
+
class CloudRemoteCache {
|
|
16
|
+
constructor(messages, api, runContext, fileStorage) {
|
|
17
|
+
this.messages = messages;
|
|
18
|
+
this.api = api;
|
|
19
|
+
this.runContext = runContext;
|
|
20
|
+
this.fileStorage = fileStorage;
|
|
21
|
+
this.storeRequests = [];
|
|
22
|
+
}
|
|
23
|
+
retrieve(hash, cacheDirectory) {
|
|
24
|
+
var _a;
|
|
25
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
26
|
+
if (this.messages.cacheError)
|
|
27
|
+
return false;
|
|
28
|
+
const hashUrls = yield this.hashUrls(hash);
|
|
29
|
+
if (!hashUrls || !hashUrls.get) {
|
|
30
|
+
if (environment_1.VERBOSE_LOGGING) {
|
|
31
|
+
output.note({ title: `Nx Cloud: Cache miss ${hash}.` });
|
|
32
|
+
}
|
|
33
|
+
this.runContext.statuses[hash] = 'cache-miss';
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
try {
|
|
37
|
+
yield this.fileStorage.retrieve(hash, hashUrls.get, cacheDirectory);
|
|
38
|
+
this.runContext.statuses[hash] = 'remote-cache-hit';
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
catch (ee) {
|
|
42
|
+
const e = (_a = ee.axiosException) !== null && _a !== void 0 ? _a : ee;
|
|
43
|
+
if (e.response && e.response.status === 404) {
|
|
44
|
+
if (environment_1.VERBOSE_LOGGING) {
|
|
45
|
+
output.note({ title: `Nx Cloud: Cache miss ${hash}. Status 404.` });
|
|
46
|
+
}
|
|
47
|
+
// cache miss. print nothing
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
this.messages.cacheError = this.messages.extractErrorMessage(e, 'storage');
|
|
51
|
+
}
|
|
52
|
+
this.runContext.statuses[hash] = 'cache-miss';
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
store(hash, cacheDirectory) {
|
|
58
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
59
|
+
if (this.messages.cacheError)
|
|
60
|
+
return false;
|
|
61
|
+
const res = Promise.resolve().then(() => __awaiter(this, void 0, void 0, function* () {
|
|
62
|
+
var _a;
|
|
63
|
+
const hashUrls = yield this.hashUrls(hash);
|
|
64
|
+
if (!hashUrls)
|
|
65
|
+
return false;
|
|
66
|
+
if (!hashUrls.put) {
|
|
67
|
+
if (environment_1.VERBOSE_LOGGING) {
|
|
68
|
+
output.note({
|
|
69
|
+
title: `Nx Cloud: Skipping storing ${hash}. Read only token is used.`,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
return true;
|
|
73
|
+
}
|
|
74
|
+
try {
|
|
75
|
+
yield this.fileStorage.store(hash, hashUrls.put, cacheDirectory);
|
|
76
|
+
return true;
|
|
77
|
+
}
|
|
78
|
+
catch (ee) {
|
|
79
|
+
const e = (_a = ee.axiosException) !== null && _a !== void 0 ? _a : ee;
|
|
80
|
+
this.messages.cacheError = this.messages.extractErrorMessage(e, 'storage');
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
}));
|
|
84
|
+
this.storeRequests.push(res);
|
|
85
|
+
return res;
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
hashUrls(hash) {
|
|
89
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
90
|
+
if (hash in this.runContext.requests) {
|
|
91
|
+
return (yield this.runContext.requests[hash])[hash];
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
const scheduledTaskHashesWithoutRequests = this.runContext.scheduledTasks
|
|
95
|
+
.filter((t) => !this.runContext.requests[t.hash])
|
|
96
|
+
.map((t) => t.hash);
|
|
97
|
+
if (scheduledTaskHashesWithoutRequests.indexOf(hash) === -1) {
|
|
98
|
+
scheduledTaskHashesWithoutRequests.push(hash);
|
|
99
|
+
}
|
|
100
|
+
const request = this.api.startRun(environment_1.NX_CLOUD_DISTRIBUTED_EXECUTION_ID, scheduledTaskHashesWithoutRequests);
|
|
101
|
+
scheduledTaskHashesWithoutRequests.forEach((taskHash) => {
|
|
102
|
+
this.runContext.requests[taskHash] = request;
|
|
103
|
+
});
|
|
104
|
+
return (yield request)[hash];
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
waitForStoreRequestsToComplete() {
|
|
109
|
+
return Promise.all(this.storeRequests).then((r) => r.reduce((a, b) => a && b, true));
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
exports.CloudRemoteCache = CloudRemoteCache;
|
|
113
|
+
//# sourceMappingURL=cloud-remote-cache.js.map
|