@teambit/builder 0.0.881 → 0.0.883
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/dist/artifact/artifact-extractor.js +6 -47
- package/dist/artifact/artifact-extractor.js.map +1 -1
- package/dist/artifact/artifact-factory.js +1 -52
- package/dist/artifact/artifact-factory.js.map +1 -1
- package/dist/artifact/artifact-list.js +6 -43
- package/dist/artifact/artifact-list.js.map +1 -1
- package/dist/artifact/artifact.js +4 -20
- package/dist/artifact/artifact.js.map +1 -1
- package/dist/artifact/artifacts.cmd.js +0 -29
- package/dist/artifact/artifacts.cmd.js.map +1 -1
- package/dist/artifact/extension-artifact.js +0 -4
- package/dist/artifact/extension-artifact.js.map +1 -1
- package/dist/artifact/fs-artifact.js +0 -6
- package/dist/artifact/fs-artifact.js.map +1 -1
- package/dist/artifact/index.js +0 -18
- package/dist/artifact/index.js.map +1 -1
- package/dist/build-pipe.js +2 -44
- package/dist/build-pipe.js.map +1 -1
- package/dist/build-pipeline-order.js +7 -44
- package/dist/build-pipeline-order.js.map +1 -1
- package/dist/build-pipeline-result-list.js +2 -35
- package/dist/build-pipeline-result-list.js.map +1 -1
- package/dist/build-task.js +1 -9
- package/dist/build-task.js.map +1 -1
- package/dist/build.cmd.js +0 -27
- package/dist/build.cmd.js.map +1 -1
- package/dist/builder.aspect.js +0 -5
- package/dist/builder.aspect.js.map +1 -1
- package/dist/builder.composition.js +0 -6
- package/dist/builder.composition.js.map +1 -1
- package/dist/builder.graphql.js +0 -19
- package/dist/builder.graphql.js.map +1 -1
- package/dist/builder.main.runtime.js +8 -137
- package/dist/builder.main.runtime.js.map +1 -1
- package/dist/builder.route.js +3 -27
- package/dist/builder.route.js.map +1 -1
- package/dist/builder.service.js +1 -37
- package/dist/builder.service.js.map +1 -1
- package/dist/exceptions/artifact-definition-no-glob.js +0 -3
- package/dist/exceptions/artifact-definition-no-glob.js.map +1 -1
- package/dist/exceptions/artifact-storage-error.js +0 -3
- package/dist/exceptions/artifact-storage-error.js.map +1 -1
- package/dist/exceptions/capsule-not-found.js +0 -3
- package/dist/exceptions/capsule-not-found.js.map +1 -1
- package/dist/exceptions/index.js +0 -9
- package/dist/exceptions/index.js.map +1 -1
- package/dist/exceptions/invalid-task.js +0 -6
- package/dist/exceptions/invalid-task.js.map +1 -1
- package/dist/index.js +0 -24
- package/dist/index.js.map +1 -1
- package/dist/pipeline/index.js +0 -3
- package/dist/pipeline/index.js.map +1 -1
- package/dist/pipeline/pipeline-results.js +0 -2
- package/dist/pipeline/pipeline-results.js.map +1 -1
- package/dist/storage/default-resolver.js +0 -9
- package/dist/storage/default-resolver.js.map +1 -1
- package/dist/storage/index.js +0 -6
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/s3-resolver.js +4 -0
- package/dist/storage/s3-resolver.js.map +1 -1
- package/dist/task-results-list.js +1 -23
- package/dist/task-results-list.js.map +1 -1
- package/dist/tasks-queue.js +0 -14
- package/dist/tasks-queue.js.map +1 -1
- package/dist/templates/build-task/files/index-file.js +0 -1
- package/dist/templates/build-task/files/index-file.js.map +1 -1
- package/dist/templates/build-task/files/task-file.js +0 -1
- package/dist/templates/build-task/files/task-file.js.map +1 -1
- package/dist/templates/build-task/index.js +0 -7
- package/dist/templates/build-task/index.js.map +1 -1
- package/package-tar/teambit-builder-0.0.883.tgz +0 -0
- package/package.json +11 -11
- package/{preview-1666409808293.js → preview-1666582798766.js} +2 -2
- package/package-tar/teambit-builder-0.0.881.tgz +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["index.ts"],"sourcesContent":["export { ArtifactDefinition, ArtifactModelDefinition } from './artifact-definition';\nexport { ExtensionArtifact } from './extension-artifact';\nexport { Artifact } from './artifact';\nexport { ArtifactList } from './artifact-list';\nexport { ArtifactFactory, ArtifactMap } from './artifact-factory';\nexport { FsArtifact } from './fs-artifact';\n"],"mappings":"
|
|
1
|
+
{"version":3,"names":[],"sources":["index.ts"],"sourcesContent":["export { ArtifactDefinition, ArtifactModelDefinition } from './artifact-definition';\nexport { ExtensionArtifact } from './extension-artifact';\nexport { Artifact } from './artifact';\nexport { ArtifactList } from './artifact-list';\nexport { ArtifactFactory, ArtifactMap } from './artifact-factory';\nexport { FsArtifact } from './fs-artifact';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA;AACA;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA;AACA;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA;AACA;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA;AACA;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA;AACA;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA"}
|
package/dist/build-pipe.js
CHANGED
|
@@ -1,68 +1,48 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
4
|
require("core-js/modules/es.symbol.description.js");
|
|
6
|
-
|
|
7
5
|
require("core-js/modules/es.array.iterator.js");
|
|
8
|
-
|
|
9
6
|
require("core-js/modules/es.promise.js");
|
|
10
|
-
|
|
11
7
|
Object.defineProperty(exports, "__esModule", {
|
|
12
8
|
value: true
|
|
13
9
|
});
|
|
14
10
|
exports.BuildPipe = void 0;
|
|
15
|
-
|
|
16
11
|
function _defineProperty2() {
|
|
17
12
|
const data = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
18
|
-
|
|
19
13
|
_defineProperty2 = function () {
|
|
20
14
|
return data;
|
|
21
15
|
};
|
|
22
|
-
|
|
23
16
|
return data;
|
|
24
17
|
}
|
|
25
|
-
|
|
26
18
|
function _pMapSeries() {
|
|
27
19
|
const data = _interopRequireDefault(require("p-map-series"));
|
|
28
|
-
|
|
29
20
|
_pMapSeries = function () {
|
|
30
21
|
return data;
|
|
31
22
|
};
|
|
32
|
-
|
|
33
23
|
return data;
|
|
34
24
|
}
|
|
35
|
-
|
|
36
25
|
function _prettyTime() {
|
|
37
26
|
const data = _interopRequireDefault(require("pretty-time"));
|
|
38
|
-
|
|
39
27
|
_prettyTime = function () {
|
|
40
28
|
return data;
|
|
41
29
|
};
|
|
42
|
-
|
|
43
30
|
return data;
|
|
44
31
|
}
|
|
45
|
-
|
|
46
32
|
function _buildTask() {
|
|
47
33
|
const data = require("./build-task");
|
|
48
|
-
|
|
49
34
|
_buildTask = function () {
|
|
50
35
|
return data;
|
|
51
36
|
};
|
|
52
|
-
|
|
53
37
|
return data;
|
|
54
38
|
}
|
|
55
|
-
|
|
56
39
|
function _taskResultsList() {
|
|
57
40
|
const data = require("./task-results-list");
|
|
58
|
-
|
|
59
41
|
_taskResultsList = function () {
|
|
60
42
|
return data;
|
|
61
43
|
};
|
|
62
|
-
|
|
63
44
|
return data;
|
|
64
45
|
}
|
|
65
|
-
|
|
66
46
|
class BuildPipe {
|
|
67
47
|
constructor(
|
|
68
48
|
/**
|
|
@@ -79,15 +59,13 @@ class BuildPipe {
|
|
|
79
59
|
(0, _defineProperty2().default)(this, "longProcessLogger", void 0);
|
|
80
60
|
(0, _defineProperty2().default)(this, "taskResults", []);
|
|
81
61
|
}
|
|
82
|
-
|
|
83
62
|
get allTasksResults() {
|
|
84
63
|
return [...(this.previousTaskResults || []), ...(this.taskResults || [])];
|
|
85
64
|
}
|
|
65
|
+
|
|
86
66
|
/**
|
|
87
67
|
* execute a pipeline of build tasks.
|
|
88
68
|
*/
|
|
89
|
-
|
|
90
|
-
|
|
91
69
|
async execute() {
|
|
92
70
|
this.addSignalListener();
|
|
93
71
|
await this.executePreBuild();
|
|
@@ -101,11 +79,10 @@ class BuildPipe {
|
|
|
101
79
|
await this.executePostBuild(tasksResultsList);
|
|
102
80
|
return tasksResultsList;
|
|
103
81
|
}
|
|
82
|
+
|
|
104
83
|
/**
|
|
105
84
|
* for some reason, some tasks (such as typescript compilation) ignore ctrl+C. this fixes it.
|
|
106
85
|
*/
|
|
107
|
-
|
|
108
|
-
|
|
109
86
|
addSignalListener() {
|
|
110
87
|
process.on('SIGTERM', () => {
|
|
111
88
|
process.exit();
|
|
@@ -114,7 +91,6 @@ class BuildPipe {
|
|
|
114
91
|
process.exit();
|
|
115
92
|
});
|
|
116
93
|
}
|
|
117
|
-
|
|
118
94
|
async executePreBuild() {
|
|
119
95
|
this.logger.setStatusLine('executing pre-build for all tasks');
|
|
120
96
|
await (0, _pMapSeries().default)(this.tasksQueue, async ({
|
|
@@ -126,38 +102,30 @@ class BuildPipe {
|
|
|
126
102
|
});
|
|
127
103
|
this.logger.consoleSuccess();
|
|
128
104
|
}
|
|
129
|
-
|
|
130
105
|
async executeTask(task, env) {
|
|
131
106
|
const taskId = _buildTask().BuildTaskHelper.serializeId(task);
|
|
132
|
-
|
|
133
107
|
const taskName = `${taskId}${task.description ? ` (${task.description})` : ''}`;
|
|
134
108
|
this.longProcessLogger.logProgress(`env "${env.id}", task "${taskName}"`);
|
|
135
109
|
this.updateFailedDependencyTask(task);
|
|
136
|
-
|
|
137
110
|
if (this.shouldSkipTask(taskId, env.id)) {
|
|
138
111
|
return;
|
|
139
112
|
}
|
|
140
|
-
|
|
141
113
|
const startTask = process.hrtime();
|
|
142
114
|
const taskStartTime = Date.now();
|
|
143
115
|
const buildContext = this.getBuildContext(env.id);
|
|
144
116
|
let buildTaskResult;
|
|
145
|
-
|
|
146
117
|
try {
|
|
147
118
|
buildTaskResult = await task.execute(buildContext);
|
|
148
119
|
} catch (err) {
|
|
149
120
|
this.logger.consoleFailure(`env: ${env.id}, task "${taskId}" threw an error`);
|
|
150
121
|
throw err;
|
|
151
122
|
}
|
|
152
|
-
|
|
153
123
|
const endTime = Date.now();
|
|
154
124
|
const compsWithErrors = buildTaskResult.componentsResults.filter(c => {
|
|
155
125
|
var _c$errors;
|
|
156
|
-
|
|
157
126
|
return (_c$errors = c.errors) === null || _c$errors === void 0 ? void 0 : _c$errors.length;
|
|
158
127
|
});
|
|
159
128
|
let artifacts;
|
|
160
|
-
|
|
161
129
|
if (compsWithErrors.length) {
|
|
162
130
|
this.logger.consoleFailure(`env: ${env.id}, task "${taskId}" has failed`);
|
|
163
131
|
this.failedTasks.push(task);
|
|
@@ -167,7 +135,6 @@ class BuildPipe {
|
|
|
167
135
|
const defs = buildTaskResult.artifacts || [];
|
|
168
136
|
artifacts = this.artifactFactory.generate(buildContext, defs, task);
|
|
169
137
|
}
|
|
170
|
-
|
|
171
138
|
const taskResults = {
|
|
172
139
|
task,
|
|
173
140
|
env,
|
|
@@ -178,7 +145,6 @@ class BuildPipe {
|
|
|
178
145
|
};
|
|
179
146
|
this.taskResults.push(taskResults);
|
|
180
147
|
}
|
|
181
|
-
|
|
182
148
|
async executePostBuild(tasksResults) {
|
|
183
149
|
this.logger.setStatusLine('executing post-build for all tasks');
|
|
184
150
|
await (0, _pMapSeries().default)(this.tasksQueue, async ({
|
|
@@ -190,7 +156,6 @@ class BuildPipe {
|
|
|
190
156
|
});
|
|
191
157
|
this.logger.consoleSuccess();
|
|
192
158
|
}
|
|
193
|
-
|
|
194
159
|
updateFailedDependencyTask(task) {
|
|
195
160
|
if (!this.failedDependencyTask && this.failedTasks.length && task.dependencies) {
|
|
196
161
|
task.dependencies.forEach(dependency => {
|
|
@@ -198,7 +163,6 @@ class BuildPipe {
|
|
|
198
163
|
aspectId,
|
|
199
164
|
name
|
|
200
165
|
} = _buildTask().BuildTaskHelper.deserializeIdAllowEmptyName(dependency);
|
|
201
|
-
|
|
202
166
|
this.failedDependencyTask = this.failedTasks.find(failedTask => {
|
|
203
167
|
if (name && name !== failedTask.name) return false;
|
|
204
168
|
return aspectId === failedTask.aspectId;
|
|
@@ -206,25 +170,19 @@ class BuildPipe {
|
|
|
206
170
|
});
|
|
207
171
|
}
|
|
208
172
|
}
|
|
209
|
-
|
|
210
173
|
shouldSkipTask(taskId, envId) {
|
|
211
174
|
if (!this.failedDependencyTask) return false;
|
|
212
|
-
|
|
213
175
|
const failedTaskId = _buildTask().BuildTaskHelper.serializeId(this.failedDependencyTask);
|
|
214
|
-
|
|
215
176
|
this.logger.consoleWarning(`env: ${envId}, task "${taskId}" has skipped due to "${failedTaskId}" failure`);
|
|
216
177
|
return true;
|
|
217
178
|
}
|
|
218
|
-
|
|
219
179
|
getBuildContext(envId) {
|
|
220
180
|
const buildContext = this.envsBuildContext[envId];
|
|
221
181
|
if (!buildContext) throw new Error(`unable to find buildContext for ${envId}`);
|
|
222
182
|
buildContext.previousTasksResults = this.allTasksResults;
|
|
223
183
|
return buildContext;
|
|
224
184
|
}
|
|
225
|
-
|
|
226
185
|
}
|
|
227
|
-
|
|
228
186
|
exports.BuildPipe = BuildPipe;
|
|
229
187
|
|
|
230
188
|
//# sourceMappingURL=build-pipe.js.map
|
package/dist/build-pipe.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["BuildPipe","constructor","tasksQueue","envsBuildContext","logger","artifactFactory","previousTaskResults","allTasksResults","taskResults","execute","addSignalListener","executePreBuild","longProcessLogger","createLongProcessLogger","length","mapSeries","task","env","executeTask","end","tasksResultsList","TaskResultsList","executePostBuild","process","on","exit","setStatusLine","preBuild","getBuildContext","id","consoleSuccess","taskId","BuildTaskHelper","serializeId","taskName","description","logProgress","updateFailedDependencyTask","shouldSkipTask","startTask","hrtime","taskStartTime","Date","now","buildContext","buildTaskResult","err","consoleFailure","endTime","compsWithErrors","componentsResults","filter","c","errors","artifacts","failedTasks","push","duration","prettyTime","defs","generate","startTime","tasksResults","postBuild","failedDependencyTask","dependencies","forEach","dependency","aspectId","name","deserializeIdAllowEmptyName","find","failedTask","envId","failedTaskId","consoleWarning","Error","previousTasksResults"],"sources":["build-pipe.ts"],"sourcesContent":["import { EnvDefinition } from '@teambit/envs';\nimport { ComponentMap } from '@teambit/component';\nimport { Logger, LongProcessLogger } from '@teambit/logger';\nimport mapSeries from 'p-map-series';\nimport prettyTime from 'pretty-time';\nimport { ArtifactFactory, ArtifactList, FsArtifact } from './artifact';\nimport { BuildContext, BuildTask, BuildTaskHelper, BuiltTaskResult } from './build-task';\nimport { ComponentResult } from './types';\nimport { TasksQueue } from './tasks-queue';\nimport { EnvsBuildContext } from './builder.service';\nimport { TaskResultsList } from './task-results-list';\n\nexport type TaskResults = {\n /**\n * task itself. useful for getting its id/description later on.\n */\n task: BuildTask;\n\n /**\n * environment were the task was running\n */\n env: EnvDefinition;\n\n /**\n * component build results.\n */\n componentsResults: ComponentResult[];\n\n /**\n * artifacts generated by the build pipeline.\n * in case the task finished with errors, this prop is undefined.\n */\n artifacts: ComponentMap<ArtifactList<FsArtifact>> | undefined;\n\n /**\n * timestamp of start initiation.\n */\n startTime: number;\n\n /**\n * timestamp of task completion.\n */\n endTime: number;\n};\n\nexport class BuildPipe {\n private failedTasks: BuildTask[] = [];\n private failedDependencyTask: BuildTask | undefined;\n private longProcessLogger: LongProcessLogger;\n private taskResults: TaskResults[] = [];\n constructor(\n /**\n * array of services to apply on the components.\n */\n readonly tasksQueue: TasksQueue,\n readonly envsBuildContext: EnvsBuildContext,\n readonly logger: Logger,\n readonly artifactFactory: ArtifactFactory,\n private previousTaskResults?: TaskResults[]\n ) {}\n\n get allTasksResults(): TaskResults[] {\n return [...(this.previousTaskResults || []), ...(this.taskResults || [])];\n }\n\n /**\n * execute a pipeline of build tasks.\n */\n async execute(): Promise<TaskResultsList> {\n this.addSignalListener();\n await this.executePreBuild();\n this.longProcessLogger = this.logger.createLongProcessLogger('running tasks', this.tasksQueue.length);\n await mapSeries(this.tasksQueue, async ({ task, env }) => this.executeTask(task, env));\n this.longProcessLogger.end();\n const tasksResultsList = new TaskResultsList(this.tasksQueue, this.taskResults);\n await this.executePostBuild(tasksResultsList);\n\n return tasksResultsList;\n }\n\n /**\n * for some reason, some tasks (such as typescript compilation) ignore ctrl+C. this fixes it.\n */\n private addSignalListener() {\n process.on('SIGTERM', () => {\n process.exit();\n });\n\n process.on('SIGINT', () => {\n process.exit();\n });\n }\n\n private async executePreBuild() {\n this.logger.setStatusLine('executing pre-build for all tasks');\n await mapSeries(this.tasksQueue, async ({ task, env }) => {\n if (!task.preBuild) return;\n await task.preBuild(this.getBuildContext(env.id));\n });\n this.logger.consoleSuccess();\n }\n\n private async executeTask(task: BuildTask, env: EnvDefinition): Promise<void> {\n const taskId = BuildTaskHelper.serializeId(task);\n const taskName = `${taskId}${task.description ? ` (${task.description})` : ''}`;\n this.longProcessLogger.logProgress(`env \"${env.id}\", task \"${taskName}\"`);\n this.updateFailedDependencyTask(task);\n if (this.shouldSkipTask(taskId, env.id)) {\n return;\n }\n const startTask = process.hrtime();\n const taskStartTime = Date.now();\n const buildContext = this.getBuildContext(env.id);\n let buildTaskResult: BuiltTaskResult;\n try {\n buildTaskResult = await task.execute(buildContext);\n } catch (err) {\n this.logger.consoleFailure(`env: ${env.id}, task \"${taskId}\" threw an error`);\n throw err;\n }\n\n const endTime = Date.now();\n const compsWithErrors = buildTaskResult.componentsResults.filter((c) => c.errors?.length);\n let artifacts: ComponentMap<ArtifactList<FsArtifact>> | undefined;\n if (compsWithErrors.length) {\n this.logger.consoleFailure(`env: ${env.id}, task \"${taskId}\" has failed`);\n this.failedTasks.push(task);\n } else {\n const duration = prettyTime(process.hrtime(startTask));\n this.logger.consoleSuccess(`env \"${env.id}\", task \"${taskName}\" has completed successfully in ${duration}`);\n const defs = buildTaskResult.artifacts || [];\n artifacts = this.artifactFactory.generate(buildContext, defs, task);\n }\n\n const taskResults: TaskResults = {\n task,\n env,\n componentsResults: buildTaskResult.componentsResults,\n artifacts,\n startTime: taskStartTime,\n endTime,\n };\n\n this.taskResults.push(taskResults);\n }\n\n private async executePostBuild(tasksResults: TaskResultsList) {\n this.logger.setStatusLine('executing post-build for all tasks');\n await mapSeries(this.tasksQueue, async ({ task, env }) => {\n if (!task.postBuild) return;\n await task.postBuild(this.getBuildContext(env.id), tasksResults);\n });\n this.logger.consoleSuccess();\n }\n\n private updateFailedDependencyTask(task: BuildTask) {\n if (!this.failedDependencyTask && this.failedTasks.length && task.dependencies) {\n task.dependencies.forEach((dependency) => {\n const { aspectId, name } = BuildTaskHelper.deserializeIdAllowEmptyName(dependency);\n this.failedDependencyTask = this.failedTasks.find((failedTask) => {\n if (name && name !== failedTask.name) return false;\n return aspectId === failedTask.aspectId;\n });\n });\n }\n }\n\n private shouldSkipTask(taskId: string, envId: string): boolean {\n if (!this.failedDependencyTask) return false;\n const failedTaskId = BuildTaskHelper.serializeId(this.failedDependencyTask);\n this.logger.consoleWarning(`env: ${envId}, task \"${taskId}\" has skipped due to \"${failedTaskId}\" failure`);\n return true;\n }\n\n private getBuildContext(envId: string): BuildContext {\n const buildContext = this.envsBuildContext[envId];\n if (!buildContext) throw new Error(`unable to find buildContext for ${envId}`);\n buildContext.previousTasksResults = this.allTasksResults;\n return buildContext;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["BuildPipe","constructor","tasksQueue","envsBuildContext","logger","artifactFactory","previousTaskResults","allTasksResults","taskResults","execute","addSignalListener","executePreBuild","longProcessLogger","createLongProcessLogger","length","mapSeries","task","env","executeTask","end","tasksResultsList","TaskResultsList","executePostBuild","process","on","exit","setStatusLine","preBuild","getBuildContext","id","consoleSuccess","taskId","BuildTaskHelper","serializeId","taskName","description","logProgress","updateFailedDependencyTask","shouldSkipTask","startTask","hrtime","taskStartTime","Date","now","buildContext","buildTaskResult","err","consoleFailure","endTime","compsWithErrors","componentsResults","filter","c","errors","artifacts","failedTasks","push","duration","prettyTime","defs","generate","startTime","tasksResults","postBuild","failedDependencyTask","dependencies","forEach","dependency","aspectId","name","deserializeIdAllowEmptyName","find","failedTask","envId","failedTaskId","consoleWarning","Error","previousTasksResults"],"sources":["build-pipe.ts"],"sourcesContent":["import { EnvDefinition } from '@teambit/envs';\nimport { ComponentMap } from '@teambit/component';\nimport { Logger, LongProcessLogger } from '@teambit/logger';\nimport mapSeries from 'p-map-series';\nimport prettyTime from 'pretty-time';\nimport { ArtifactFactory, ArtifactList, FsArtifact } from './artifact';\nimport { BuildContext, BuildTask, BuildTaskHelper, BuiltTaskResult } from './build-task';\nimport { ComponentResult } from './types';\nimport { TasksQueue } from './tasks-queue';\nimport { EnvsBuildContext } from './builder.service';\nimport { TaskResultsList } from './task-results-list';\n\nexport type TaskResults = {\n /**\n * task itself. useful for getting its id/description later on.\n */\n task: BuildTask;\n\n /**\n * environment were the task was running\n */\n env: EnvDefinition;\n\n /**\n * component build results.\n */\n componentsResults: ComponentResult[];\n\n /**\n * artifacts generated by the build pipeline.\n * in case the task finished with errors, this prop is undefined.\n */\n artifacts: ComponentMap<ArtifactList<FsArtifact>> | undefined;\n\n /**\n * timestamp of start initiation.\n */\n startTime: number;\n\n /**\n * timestamp of task completion.\n */\n endTime: number;\n};\n\nexport class BuildPipe {\n private failedTasks: BuildTask[] = [];\n private failedDependencyTask: BuildTask | undefined;\n private longProcessLogger: LongProcessLogger;\n private taskResults: TaskResults[] = [];\n constructor(\n /**\n * array of services to apply on the components.\n */\n readonly tasksQueue: TasksQueue,\n readonly envsBuildContext: EnvsBuildContext,\n readonly logger: Logger,\n readonly artifactFactory: ArtifactFactory,\n private previousTaskResults?: TaskResults[]\n ) {}\n\n get allTasksResults(): TaskResults[] {\n return [...(this.previousTaskResults || []), ...(this.taskResults || [])];\n }\n\n /**\n * execute a pipeline of build tasks.\n */\n async execute(): Promise<TaskResultsList> {\n this.addSignalListener();\n await this.executePreBuild();\n this.longProcessLogger = this.logger.createLongProcessLogger('running tasks', this.tasksQueue.length);\n await mapSeries(this.tasksQueue, async ({ task, env }) => this.executeTask(task, env));\n this.longProcessLogger.end();\n const tasksResultsList = new TaskResultsList(this.tasksQueue, this.taskResults);\n await this.executePostBuild(tasksResultsList);\n\n return tasksResultsList;\n }\n\n /**\n * for some reason, some tasks (such as typescript compilation) ignore ctrl+C. this fixes it.\n */\n private addSignalListener() {\n process.on('SIGTERM', () => {\n process.exit();\n });\n\n process.on('SIGINT', () => {\n process.exit();\n });\n }\n\n private async executePreBuild() {\n this.logger.setStatusLine('executing pre-build for all tasks');\n await mapSeries(this.tasksQueue, async ({ task, env }) => {\n if (!task.preBuild) return;\n await task.preBuild(this.getBuildContext(env.id));\n });\n this.logger.consoleSuccess();\n }\n\n private async executeTask(task: BuildTask, env: EnvDefinition): Promise<void> {\n const taskId = BuildTaskHelper.serializeId(task);\n const taskName = `${taskId}${task.description ? ` (${task.description})` : ''}`;\n this.longProcessLogger.logProgress(`env \"${env.id}\", task \"${taskName}\"`);\n this.updateFailedDependencyTask(task);\n if (this.shouldSkipTask(taskId, env.id)) {\n return;\n }\n const startTask = process.hrtime();\n const taskStartTime = Date.now();\n const buildContext = this.getBuildContext(env.id);\n let buildTaskResult: BuiltTaskResult;\n try {\n buildTaskResult = await task.execute(buildContext);\n } catch (err) {\n this.logger.consoleFailure(`env: ${env.id}, task \"${taskId}\" threw an error`);\n throw err;\n }\n\n const endTime = Date.now();\n const compsWithErrors = buildTaskResult.componentsResults.filter((c) => c.errors?.length);\n let artifacts: ComponentMap<ArtifactList<FsArtifact>> | undefined;\n if (compsWithErrors.length) {\n this.logger.consoleFailure(`env: ${env.id}, task \"${taskId}\" has failed`);\n this.failedTasks.push(task);\n } else {\n const duration = prettyTime(process.hrtime(startTask));\n this.logger.consoleSuccess(`env \"${env.id}\", task \"${taskName}\" has completed successfully in ${duration}`);\n const defs = buildTaskResult.artifacts || [];\n artifacts = this.artifactFactory.generate(buildContext, defs, task);\n }\n\n const taskResults: TaskResults = {\n task,\n env,\n componentsResults: buildTaskResult.componentsResults,\n artifacts,\n startTime: taskStartTime,\n endTime,\n };\n\n this.taskResults.push(taskResults);\n }\n\n private async executePostBuild(tasksResults: TaskResultsList) {\n this.logger.setStatusLine('executing post-build for all tasks');\n await mapSeries(this.tasksQueue, async ({ task, env }) => {\n if (!task.postBuild) return;\n await task.postBuild(this.getBuildContext(env.id), tasksResults);\n });\n this.logger.consoleSuccess();\n }\n\n private updateFailedDependencyTask(task: BuildTask) {\n if (!this.failedDependencyTask && this.failedTasks.length && task.dependencies) {\n task.dependencies.forEach((dependency) => {\n const { aspectId, name } = BuildTaskHelper.deserializeIdAllowEmptyName(dependency);\n this.failedDependencyTask = this.failedTasks.find((failedTask) => {\n if (name && name !== failedTask.name) return false;\n return aspectId === failedTask.aspectId;\n });\n });\n }\n }\n\n private shouldSkipTask(taskId: string, envId: string): boolean {\n if (!this.failedDependencyTask) return false;\n const failedTaskId = BuildTaskHelper.serializeId(this.failedDependencyTask);\n this.logger.consoleWarning(`env: ${envId}, task \"${taskId}\" has skipped due to \"${failedTaskId}\" failure`);\n return true;\n }\n\n private getBuildContext(envId: string): BuildContext {\n const buildContext = this.envsBuildContext[envId];\n if (!buildContext) throw new Error(`unable to find buildContext for ${envId}`);\n buildContext.previousTasksResults = this.allTasksResults;\n return buildContext;\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,58 +1,41 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
4
|
require("core-js/modules/es.array.flat.js");
|
|
6
|
-
|
|
7
5
|
require("core-js/modules/es.array.iterator.js");
|
|
8
|
-
|
|
9
6
|
require("core-js/modules/es.array.unscopables.flat.js");
|
|
10
|
-
|
|
11
7
|
Object.defineProperty(exports, "__esModule", {
|
|
12
8
|
value: true
|
|
13
9
|
});
|
|
14
10
|
exports.calculatePipelineOrder = calculatePipelineOrder;
|
|
15
|
-
|
|
16
11
|
function _graph() {
|
|
17
12
|
const data = require("@teambit/graph.cleargraph");
|
|
18
|
-
|
|
19
13
|
_graph = function () {
|
|
20
14
|
return data;
|
|
21
15
|
};
|
|
22
|
-
|
|
23
16
|
return data;
|
|
24
17
|
}
|
|
25
|
-
|
|
26
18
|
function _tester() {
|
|
27
19
|
const data = _interopRequireDefault(require("@teambit/tester"));
|
|
28
|
-
|
|
29
20
|
_tester = function () {
|
|
30
21
|
return data;
|
|
31
22
|
};
|
|
32
|
-
|
|
33
23
|
return data;
|
|
34
24
|
}
|
|
35
|
-
|
|
36
25
|
function _buildTask() {
|
|
37
26
|
const data = require("./build-task");
|
|
38
|
-
|
|
39
27
|
_buildTask = function () {
|
|
40
28
|
return data;
|
|
41
29
|
};
|
|
42
|
-
|
|
43
30
|
return data;
|
|
44
31
|
}
|
|
45
|
-
|
|
46
32
|
function _tasksQueue() {
|
|
47
33
|
const data = require("./tasks-queue");
|
|
48
|
-
|
|
49
34
|
_tasksQueue = function () {
|
|
50
35
|
return data;
|
|
51
36
|
};
|
|
52
|
-
|
|
53
37
|
return data;
|
|
54
38
|
}
|
|
55
|
-
|
|
56
39
|
/**
|
|
57
40
|
* there are two ways how to add tasks to build pipeline.
|
|
58
41
|
* 1. `getBuildPipe()` method of the env.
|
|
@@ -86,7 +69,6 @@ function _tasksQueue() {
|
|
|
86
69
|
function calculatePipelineOrder(taskSlot, envs, pipeNameOnEnv = 'getBuildPipe', tasks = [], skipTests = false) {
|
|
87
70
|
const graphs = [];
|
|
88
71
|
const locations = ['start', 'middle', 'end']; // the order is important here!
|
|
89
|
-
|
|
90
72
|
locations.forEach(location => {
|
|
91
73
|
graphs.push({
|
|
92
74
|
location,
|
|
@@ -124,22 +106,18 @@ function calculatePipelineOrder(taskSlot, envs, pipeNameOnEnv = 'getBuildPipe',
|
|
|
124
106
|
});
|
|
125
107
|
const tasksQueue = new (_tasksQueue().TasksQueue)();
|
|
126
108
|
locations.forEach(location => addTasksToGraph(tasksQueue, dataPerLocation, location));
|
|
127
|
-
|
|
128
109
|
if (tasks.length) {
|
|
129
110
|
return new (_tasksQueue().TasksQueue)(...tasksQueue.filter(({
|
|
130
111
|
task
|
|
131
112
|
}) => tasks.includes(task.name) || tasks.includes(task.aspectId)));
|
|
132
113
|
}
|
|
133
|
-
|
|
134
114
|
if (skipTests) {
|
|
135
115
|
return new (_tasksQueue().TasksQueue)(...tasksQueue.filter(({
|
|
136
116
|
task
|
|
137
117
|
}) => task.aspectId !== _tester().default.id));
|
|
138
118
|
}
|
|
139
|
-
|
|
140
119
|
return tasksQueue;
|
|
141
120
|
}
|
|
142
|
-
|
|
143
121
|
function addTasksToGraph(tasksQueue, dataPerLocation, location) {
|
|
144
122
|
const data = dataPerLocation.find(d => d.location === location);
|
|
145
123
|
if (!data) return;
|
|
@@ -149,7 +127,6 @@ function addTasksToGraph(tasksQueue, dataPerLocation, location) {
|
|
|
149
127
|
aspectId,
|
|
150
128
|
name
|
|
151
129
|
} = _buildTask().BuildTaskHelper.deserializeId(taskNode.attr);
|
|
152
|
-
|
|
153
130
|
data.pipelineEnvs.forEach(({
|
|
154
131
|
env,
|
|
155
132
|
pipeline
|
|
@@ -164,6 +141,7 @@ function addTasksToGraph(tasksQueue, dataPerLocation, location) {
|
|
|
164
141
|
pipeline.splice(taskIndex, 1); // delete the task from the pipeline
|
|
165
142
|
});
|
|
166
143
|
});
|
|
144
|
+
|
|
167
145
|
data.pipelineEnvs.forEach(({
|
|
168
146
|
env,
|
|
169
147
|
pipeline
|
|
@@ -174,40 +152,30 @@ function addTasksToGraph(tasksQueue, dataPerLocation, location) {
|
|
|
174
152
|
}));
|
|
175
153
|
});
|
|
176
154
|
}
|
|
177
|
-
|
|
178
155
|
function addDependenciesToGraph(graphs, pipeline, task) {
|
|
179
156
|
if (!task.dependencies || !task.dependencies.length) return;
|
|
180
|
-
|
|
181
157
|
const taskId = _buildTask().BuildTaskHelper.serializeId(task);
|
|
182
|
-
|
|
183
158
|
task.dependencies.forEach(dependency => {
|
|
184
159
|
const {
|
|
185
160
|
aspectId,
|
|
186
161
|
name
|
|
187
162
|
} = _buildTask().BuildTaskHelper.deserializeIdAllowEmptyName(dependency);
|
|
188
|
-
|
|
189
163
|
const dependencyTasks = pipeline.filter(pipelineTask => {
|
|
190
164
|
if (pipelineTask.aspectId !== aspectId) return false;
|
|
191
165
|
return name ? name === pipelineTask.name : true;
|
|
192
166
|
});
|
|
193
|
-
|
|
194
167
|
if (dependencyTasks.length === 0) {
|
|
195
168
|
throw new Error(`unable to find dependency "${dependency}" of "${_buildTask().BuildTaskHelper.serializeId(task)}" in the pipeline`);
|
|
196
169
|
}
|
|
197
|
-
|
|
198
170
|
dependencyTasks.forEach(dependencyTask => {
|
|
199
171
|
const location = getLocation(task, dependencyTask);
|
|
200
|
-
|
|
201
172
|
if (!location) {
|
|
202
173
|
// the dependency is behind and will be in the correct order regardless the graph.
|
|
203
174
|
return;
|
|
204
175
|
}
|
|
205
|
-
|
|
206
176
|
const graphLocation = graphs.find(g => g.location === location);
|
|
207
177
|
if (!graphLocation) throw new Error(`unable to find graph for location ${location}`);
|
|
208
|
-
|
|
209
178
|
const dependencyId = _buildTask().BuildTaskHelper.serializeId(dependencyTask);
|
|
210
|
-
|
|
211
179
|
const graph = graphLocation.graph;
|
|
212
180
|
graph.setNode(new (_graph().Node)(taskId, taskId));
|
|
213
181
|
graph.setNode(new (_graph().Node)(dependencyId, dependencyId));
|
|
@@ -215,6 +183,7 @@ function addDependenciesToGraph(graphs, pipeline, task) {
|
|
|
215
183
|
});
|
|
216
184
|
});
|
|
217
185
|
}
|
|
186
|
+
|
|
218
187
|
/**
|
|
219
188
|
* since the task execution is happening per group: "start", "middle" and "end", the dependencies
|
|
220
189
|
* need to be inside the same group.
|
|
@@ -223,29 +192,24 @@ function addDependenciesToGraph(graphs, pipeline, task) {
|
|
|
223
192
|
* it's ok to have the dependency located earlier, e.g. "start" and the task at "end", and in this
|
|
224
193
|
* case, it will not be part of the graph because there is no need to do any special calculation.
|
|
225
194
|
*/
|
|
226
|
-
|
|
227
|
-
|
|
228
195
|
function getLocation(task, dependencyTask) {
|
|
229
196
|
const taskLocation = task.location || 'middle';
|
|
230
197
|
const dependencyLocation = dependencyTask.location || 'middle';
|
|
231
198
|
const isDependencyAhead = taskLocation === 'start' && dependencyLocation !== 'start' || taskLocation === 'middle' && dependencyLocation === 'end';
|
|
232
199
|
const isDependencyEqual = taskLocation === dependencyLocation;
|
|
233
|
-
|
|
234
200
|
if (isDependencyAhead) {
|
|
235
201
|
throw new Error(`a task "${_buildTask().BuildTaskHelper.serializeId(task)}" located at ${taskLocation}
|
|
236
202
|
has a dependency "${_buildTask().BuildTaskHelper.serializeId(dependencyTask)} located at ${dependencyLocation},
|
|
237
203
|
which is invalid. the dependency must be located earlier or in the same location as the task"`);
|
|
238
204
|
}
|
|
239
|
-
|
|
240
205
|
if (isDependencyEqual) {
|
|
241
206
|
return taskLocation;
|
|
242
|
-
}
|
|
243
|
-
// graph as it's going to be executed in the right order regardless the graph.
|
|
244
|
-
|
|
207
|
+
}
|
|
245
208
|
|
|
209
|
+
// dependency is behind. e.g. task is "end" and dependency is "start". no need to enter to the
|
|
210
|
+
// graph as it's going to be executed in the right order regardless the graph.
|
|
246
211
|
return null;
|
|
247
212
|
}
|
|
248
|
-
|
|
249
213
|
function getPipelineForEnv(taskSlot, env, pipeNameOnEnv) {
|
|
250
214
|
const buildTasks = env[pipeNameOnEnv] ? env[pipeNameOnEnv]() : [];
|
|
251
215
|
const slotsTasks = taskSlot.values().flat();
|
|
@@ -256,15 +220,14 @@ function getPipelineForEnv(taskSlot, env, pipeNameOnEnv) {
|
|
|
256
220
|
tasksAtStart.push(task);
|
|
257
221
|
return;
|
|
258
222
|
}
|
|
259
|
-
|
|
260
223
|
if (task.location === 'end') {
|
|
261
224
|
tasksAtEnd.push(task);
|
|
262
225
|
return;
|
|
263
226
|
}
|
|
264
|
-
|
|
265
227
|
tasksAtStart.push(task);
|
|
266
|
-
});
|
|
228
|
+
});
|
|
267
229
|
|
|
230
|
+
// merge with extension registered tasks.
|
|
268
231
|
const mergedTasks = [...tasksAtStart, ...buildTasks, ...tasksAtEnd];
|
|
269
232
|
return mergedTasks;
|
|
270
233
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["calculatePipelineOrder","taskSlot","envs","pipeNameOnEnv","tasks","skipTests","graphs","locations","forEach","location","push","graph","Graph","pipelineEnvs","envDefinition","pipeline","getPipelineForEnv","env","flattenedPipeline","map","pipelineEnv","flat","task","addDependenciesToGraph","dataPerLocation","pipelineEnvsPerLocation","filter","tasksQueue","TasksQueue","addTasksToGraph","length","includes","name","aspectId","TesterAspect","id","data","find","d","sorted","toposort","taskNode","BuildTaskHelper","deserializeId","attr","taskIndex","findIndex","pipelineTask","splice","dependencies","taskId","serializeId","dependency","deserializeIdAllowEmptyName","dependencyTasks","Error","dependencyTask","getLocation","graphLocation","g","dependencyId","setNode","Node","setEdge","Edge","taskLocation","dependencyLocation","isDependencyAhead","isDependencyEqual","buildTasks","slotsTasks","values","tasksAtStart","tasksAtEnd","mergedTasks"],"sources":["build-pipeline-order.ts"],"sourcesContent":["import { Graph, Node, Edge } from '@teambit/graph.cleargraph';\nimport TesterAspect from '@teambit/tester';\nimport { EnvDefinition, Environment } from '@teambit/envs';\nimport { BuildTask, BuildTaskHelper } from './build-task';\nimport type { TaskSlot } from './builder.main.runtime';\nimport { TasksQueue } from './tasks-queue';\n\ntype TaskDependenciesGraph = Graph<string, string>;\ntype Location = 'start' | 'middle' | 'end';\ntype TasksLocationGraph = { location: Location; graph: TaskDependenciesGraph };\ntype PipelineEnv = { env: EnvDefinition; pipeline: BuildTask[] };\ntype DataPerLocation = { location: Location; graph: TaskDependenciesGraph; pipelineEnvs: PipelineEnv[] };\n\n/**\n * there are two ways how to add tasks to build pipeline.\n * 1. `getBuildPipe()` method of the env.\n * 2. registering to the `builder.registerBuildTask()`.\n *\n * in the option #1, it's possible to determine the order. e.g. `getBuildPipe() { return [taskA, taskB, taskC]; }`\n * in the option #2, the register happens once the extension is loaded, so there is no way to put\n * one task before/after another task.\n *\n * To be able to determine the order, you can do the following\n * 1. \"task.location\", it has two options \"start\" and \"end\". the rest are \"middle\".\n * 2. \"task.dependencies\", the dependencies must be completed for all envs before this task starts.\n * the dependencies are applicable inside a location and not across locations. see getLocation()\n * or/and continue reading for more info about this.\n *\n * to determine the final order of the tasks, the following is done:\n * 1. split all tasks to three groups: start, middle and end.\n * 2. for each group define a dependencies graph for the tasks with \"dependencies\" prop and the pipeline.\n * 3. start with the first group \"start\", toposort the dependencies graph and push the found tasks\n * to a queue. once completed, iterate the pipeline and add all tasks to the queue.\n * 4. do the same for the \"middle\" and \"end\" groups.\n *\n * the reason for splitting the tasks to the three groups and not using the \"dependencies\" field\n * alone to determine the order is that the \"start\" and \"end\" groups are mostly core and \"middle\"\n * is mostly the user entering tasks to the pipeline and we as the core don't know about the users\n * tasks. For example, a core task \"PublishComponent\" must happen after the compiler, however, a\n * user might have an env without a compiler. if we determine the order only by the dependencies\n * field, the \"PublishComponent\" would have a dependency \"compiler\" and because in this case there\n * is no compiler task, it would throw an error about missing dependencies.\n */\nexport function calculatePipelineOrder(\n taskSlot: TaskSlot,\n envs: EnvDefinition[],\n pipeNameOnEnv = 'getBuildPipe',\n tasks: string[] = [],\n skipTests = false\n): TasksQueue {\n const graphs: TasksLocationGraph[] = [];\n const locations: Location[] = ['start', 'middle', 'end']; // the order is important here!\n locations.forEach((location) => {\n graphs.push({ location, graph: new Graph<string, string>() });\n });\n const pipelineEnvs: PipelineEnv[] = [];\n envs.forEach((envDefinition) => {\n const pipeline = getPipelineForEnv(taskSlot, envDefinition.env, pipeNameOnEnv);\n pipelineEnvs.push({ env: envDefinition, pipeline });\n });\n\n const flattenedPipeline: BuildTask[] = pipelineEnvs.map((pipelineEnv) => pipelineEnv.pipeline).flat();\n flattenedPipeline.forEach((task) => addDependenciesToGraph(graphs, flattenedPipeline, task));\n\n const dataPerLocation: DataPerLocation[] = graphs.map(({ location, graph }) => {\n const pipelineEnvsPerLocation: PipelineEnv[] = pipelineEnvs.map(({ env, pipeline }) => {\n return { env, pipeline: pipeline.filter((task) => (task.location || 'middle') === location) };\n });\n return { location, graph, pipelineEnvs: pipelineEnvsPerLocation };\n });\n\n const tasksQueue = new TasksQueue();\n locations.forEach((location) => addTasksToGraph(tasksQueue, dataPerLocation, location));\n if (tasks.length) {\n return new TasksQueue(\n ...tasksQueue.filter(({ task }) => tasks.includes(task.name) || tasks.includes(task.aspectId))\n );\n }\n if (skipTests) {\n return new TasksQueue(...tasksQueue.filter(({ task }) => task.aspectId !== TesterAspect.id));\n }\n return tasksQueue;\n}\n\nfunction addTasksToGraph(tasksQueue: TasksQueue, dataPerLocation: DataPerLocation[], location: Location) {\n const data = dataPerLocation.find((d) => d.location === location);\n if (!data) return;\n const sorted = data.graph.toposort();\n sorted.forEach((taskNode) => {\n const { aspectId, name } = BuildTaskHelper.deserializeId(taskNode.attr);\n data.pipelineEnvs.forEach(({ env, pipeline }) => {\n const taskIndex = pipeline.findIndex(\n (pipelineTask) => pipelineTask.aspectId === aspectId && pipelineTask.name === name\n );\n if (taskIndex < 0) return;\n const task = pipeline[taskIndex];\n tasksQueue.push({ env, task });\n pipeline.splice(taskIndex, 1); // delete the task from the pipeline\n });\n });\n data.pipelineEnvs.forEach(({ env, pipeline }) => {\n pipeline.forEach((task) => tasksQueue.push({ env, task }));\n });\n}\n\nfunction addDependenciesToGraph(graphs: TasksLocationGraph[], pipeline: BuildTask[], task: BuildTask) {\n if (!task.dependencies || !task.dependencies.length) return;\n const taskId = BuildTaskHelper.serializeId(task);\n task.dependencies.forEach((dependency) => {\n const { aspectId, name } = BuildTaskHelper.deserializeIdAllowEmptyName(dependency);\n const dependencyTasks = pipeline.filter((pipelineTask) => {\n if (pipelineTask.aspectId !== aspectId) return false;\n return name ? name === pipelineTask.name : true;\n });\n if (dependencyTasks.length === 0) {\n throw new Error(\n `unable to find dependency \"${dependency}\" of \"${BuildTaskHelper.serializeId(task)}\" in the pipeline`\n );\n }\n dependencyTasks.forEach((dependencyTask) => {\n const location = getLocation(task, dependencyTask);\n if (!location) {\n // the dependency is behind and will be in the correct order regardless the graph.\n return;\n }\n const graphLocation = graphs.find((g) => g.location === location);\n if (!graphLocation) throw new Error(`unable to find graph for location ${location}`);\n const dependencyId = BuildTaskHelper.serializeId(dependencyTask);\n const graph = graphLocation.graph;\n graph.setNode(new Node(taskId, taskId));\n graph.setNode(new Node(dependencyId, dependencyId));\n graph.setEdge(new Edge(dependencyId, taskId, 'dependency'));\n });\n });\n}\n\n/**\n * since the task execution is happening per group: \"start\", \"middle\" and \"end\", the dependencies\n * need to be inside the same group.\n * e.g. if a dependency located at \"end\" group and the task located at \"start\", it's impossible to\n * complete the dependency before the task, there it throws an error.\n * it's ok to have the dependency located earlier, e.g. \"start\" and the task at \"end\", and in this\n * case, it will not be part of the graph because there is no need to do any special calculation.\n */\nfunction getLocation(task: BuildTask, dependencyTask: BuildTask): Location | null {\n const taskLocation = task.location || 'middle';\n const dependencyLocation = dependencyTask.location || 'middle';\n\n const isDependencyAhead =\n (taskLocation === 'start' && dependencyLocation !== 'start') ||\n (taskLocation === 'middle' && dependencyLocation === 'end');\n\n const isDependencyEqual = taskLocation === dependencyLocation;\n\n if (isDependencyAhead) {\n throw new Error(`a task \"${BuildTaskHelper.serializeId(task)}\" located at ${taskLocation}\nhas a dependency \"${BuildTaskHelper.serializeId(dependencyTask)} located at ${dependencyLocation},\nwhich is invalid. the dependency must be located earlier or in the same location as the task\"`);\n }\n\n if (isDependencyEqual) {\n return taskLocation;\n }\n\n // dependency is behind. e.g. task is \"end\" and dependency is \"start\". no need to enter to the\n // graph as it's going to be executed in the right order regardless the graph.\n return null;\n}\n\nfunction getPipelineForEnv(taskSlot: TaskSlot, env: Environment, pipeNameOnEnv: string): BuildTask[] {\n const buildTasks: BuildTask[] = env[pipeNameOnEnv] ? env[pipeNameOnEnv]() : [];\n const slotsTasks = taskSlot.values().flat();\n const tasksAtStart: BuildTask[] = [];\n const tasksAtEnd: BuildTask[] = [];\n slotsTasks.forEach((task) => {\n if (task.location === 'start') {\n tasksAtStart.push(task);\n return;\n }\n if (task.location === 'end') {\n tasksAtEnd.push(task);\n return;\n }\n tasksAtStart.push(task);\n });\n\n // merge with extension registered tasks.\n const mergedTasks = [...tasksAtStart, ...buildTasks, ...tasksAtEnd];\n\n return mergedTasks;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["calculatePipelineOrder","taskSlot","envs","pipeNameOnEnv","tasks","skipTests","graphs","locations","forEach","location","push","graph","Graph","pipelineEnvs","envDefinition","pipeline","getPipelineForEnv","env","flattenedPipeline","map","pipelineEnv","flat","task","addDependenciesToGraph","dataPerLocation","pipelineEnvsPerLocation","filter","tasksQueue","TasksQueue","addTasksToGraph","length","includes","name","aspectId","TesterAspect","id","data","find","d","sorted","toposort","taskNode","BuildTaskHelper","deserializeId","attr","taskIndex","findIndex","pipelineTask","splice","dependencies","taskId","serializeId","dependency","deserializeIdAllowEmptyName","dependencyTasks","Error","dependencyTask","getLocation","graphLocation","g","dependencyId","setNode","Node","setEdge","Edge","taskLocation","dependencyLocation","isDependencyAhead","isDependencyEqual","buildTasks","slotsTasks","values","tasksAtStart","tasksAtEnd","mergedTasks"],"sources":["build-pipeline-order.ts"],"sourcesContent":["import { Graph, Node, Edge } from '@teambit/graph.cleargraph';\nimport TesterAspect from '@teambit/tester';\nimport { EnvDefinition, Environment } from '@teambit/envs';\nimport { BuildTask, BuildTaskHelper } from './build-task';\nimport type { TaskSlot } from './builder.main.runtime';\nimport { TasksQueue } from './tasks-queue';\n\ntype TaskDependenciesGraph = Graph<string, string>;\ntype Location = 'start' | 'middle' | 'end';\ntype TasksLocationGraph = { location: Location; graph: TaskDependenciesGraph };\ntype PipelineEnv = { env: EnvDefinition; pipeline: BuildTask[] };\ntype DataPerLocation = { location: Location; graph: TaskDependenciesGraph; pipelineEnvs: PipelineEnv[] };\n\n/**\n * there are two ways how to add tasks to build pipeline.\n * 1. `getBuildPipe()` method of the env.\n * 2. registering to the `builder.registerBuildTask()`.\n *\n * in the option #1, it's possible to determine the order. e.g. `getBuildPipe() { return [taskA, taskB, taskC]; }`\n * in the option #2, the register happens once the extension is loaded, so there is no way to put\n * one task before/after another task.\n *\n * To be able to determine the order, you can do the following\n * 1. \"task.location\", it has two options \"start\" and \"end\". the rest are \"middle\".\n * 2. \"task.dependencies\", the dependencies must be completed for all envs before this task starts.\n * the dependencies are applicable inside a location and not across locations. see getLocation()\n * or/and continue reading for more info about this.\n *\n * to determine the final order of the tasks, the following is done:\n * 1. split all tasks to three groups: start, middle and end.\n * 2. for each group define a dependencies graph for the tasks with \"dependencies\" prop and the pipeline.\n * 3. start with the first group \"start\", toposort the dependencies graph and push the found tasks\n * to a queue. once completed, iterate the pipeline and add all tasks to the queue.\n * 4. do the same for the \"middle\" and \"end\" groups.\n *\n * the reason for splitting the tasks to the three groups and not using the \"dependencies\" field\n * alone to determine the order is that the \"start\" and \"end\" groups are mostly core and \"middle\"\n * is mostly the user entering tasks to the pipeline and we as the core don't know about the users\n * tasks. For example, a core task \"PublishComponent\" must happen after the compiler, however, a\n * user might have an env without a compiler. if we determine the order only by the dependencies\n * field, the \"PublishComponent\" would have a dependency \"compiler\" and because in this case there\n * is no compiler task, it would throw an error about missing dependencies.\n */\nexport function calculatePipelineOrder(\n taskSlot: TaskSlot,\n envs: EnvDefinition[],\n pipeNameOnEnv = 'getBuildPipe',\n tasks: string[] = [],\n skipTests = false\n): TasksQueue {\n const graphs: TasksLocationGraph[] = [];\n const locations: Location[] = ['start', 'middle', 'end']; // the order is important here!\n locations.forEach((location) => {\n graphs.push({ location, graph: new Graph<string, string>() });\n });\n const pipelineEnvs: PipelineEnv[] = [];\n envs.forEach((envDefinition) => {\n const pipeline = getPipelineForEnv(taskSlot, envDefinition.env, pipeNameOnEnv);\n pipelineEnvs.push({ env: envDefinition, pipeline });\n });\n\n const flattenedPipeline: BuildTask[] = pipelineEnvs.map((pipelineEnv) => pipelineEnv.pipeline).flat();\n flattenedPipeline.forEach((task) => addDependenciesToGraph(graphs, flattenedPipeline, task));\n\n const dataPerLocation: DataPerLocation[] = graphs.map(({ location, graph }) => {\n const pipelineEnvsPerLocation: PipelineEnv[] = pipelineEnvs.map(({ env, pipeline }) => {\n return { env, pipeline: pipeline.filter((task) => (task.location || 'middle') === location) };\n });\n return { location, graph, pipelineEnvs: pipelineEnvsPerLocation };\n });\n\n const tasksQueue = new TasksQueue();\n locations.forEach((location) => addTasksToGraph(tasksQueue, dataPerLocation, location));\n if (tasks.length) {\n return new TasksQueue(\n ...tasksQueue.filter(({ task }) => tasks.includes(task.name) || tasks.includes(task.aspectId))\n );\n }\n if (skipTests) {\n return new TasksQueue(...tasksQueue.filter(({ task }) => task.aspectId !== TesterAspect.id));\n }\n return tasksQueue;\n}\n\nfunction addTasksToGraph(tasksQueue: TasksQueue, dataPerLocation: DataPerLocation[], location: Location) {\n const data = dataPerLocation.find((d) => d.location === location);\n if (!data) return;\n const sorted = data.graph.toposort();\n sorted.forEach((taskNode) => {\n const { aspectId, name } = BuildTaskHelper.deserializeId(taskNode.attr);\n data.pipelineEnvs.forEach(({ env, pipeline }) => {\n const taskIndex = pipeline.findIndex(\n (pipelineTask) => pipelineTask.aspectId === aspectId && pipelineTask.name === name\n );\n if (taskIndex < 0) return;\n const task = pipeline[taskIndex];\n tasksQueue.push({ env, task });\n pipeline.splice(taskIndex, 1); // delete the task from the pipeline\n });\n });\n data.pipelineEnvs.forEach(({ env, pipeline }) => {\n pipeline.forEach((task) => tasksQueue.push({ env, task }));\n });\n}\n\nfunction addDependenciesToGraph(graphs: TasksLocationGraph[], pipeline: BuildTask[], task: BuildTask) {\n if (!task.dependencies || !task.dependencies.length) return;\n const taskId = BuildTaskHelper.serializeId(task);\n task.dependencies.forEach((dependency) => {\n const { aspectId, name } = BuildTaskHelper.deserializeIdAllowEmptyName(dependency);\n const dependencyTasks = pipeline.filter((pipelineTask) => {\n if (pipelineTask.aspectId !== aspectId) return false;\n return name ? name === pipelineTask.name : true;\n });\n if (dependencyTasks.length === 0) {\n throw new Error(\n `unable to find dependency \"${dependency}\" of \"${BuildTaskHelper.serializeId(task)}\" in the pipeline`\n );\n }\n dependencyTasks.forEach((dependencyTask) => {\n const location = getLocation(task, dependencyTask);\n if (!location) {\n // the dependency is behind and will be in the correct order regardless the graph.\n return;\n }\n const graphLocation = graphs.find((g) => g.location === location);\n if (!graphLocation) throw new Error(`unable to find graph for location ${location}`);\n const dependencyId = BuildTaskHelper.serializeId(dependencyTask);\n const graph = graphLocation.graph;\n graph.setNode(new Node(taskId, taskId));\n graph.setNode(new Node(dependencyId, dependencyId));\n graph.setEdge(new Edge(dependencyId, taskId, 'dependency'));\n });\n });\n}\n\n/**\n * since the task execution is happening per group: \"start\", \"middle\" and \"end\", the dependencies\n * need to be inside the same group.\n * e.g. if a dependency located at \"end\" group and the task located at \"start\", it's impossible to\n * complete the dependency before the task, there it throws an error.\n * it's ok to have the dependency located earlier, e.g. \"start\" and the task at \"end\", and in this\n * case, it will not be part of the graph because there is no need to do any special calculation.\n */\nfunction getLocation(task: BuildTask, dependencyTask: BuildTask): Location | null {\n const taskLocation = task.location || 'middle';\n const dependencyLocation = dependencyTask.location || 'middle';\n\n const isDependencyAhead =\n (taskLocation === 'start' && dependencyLocation !== 'start') ||\n (taskLocation === 'middle' && dependencyLocation === 'end');\n\n const isDependencyEqual = taskLocation === dependencyLocation;\n\n if (isDependencyAhead) {\n throw new Error(`a task \"${BuildTaskHelper.serializeId(task)}\" located at ${taskLocation}\nhas a dependency \"${BuildTaskHelper.serializeId(dependencyTask)} located at ${dependencyLocation},\nwhich is invalid. the dependency must be located earlier or in the same location as the task\"`);\n }\n\n if (isDependencyEqual) {\n return taskLocation;\n }\n\n // dependency is behind. e.g. task is \"end\" and dependency is \"start\". no need to enter to the\n // graph as it's going to be executed in the right order regardless the graph.\n return null;\n}\n\nfunction getPipelineForEnv(taskSlot: TaskSlot, env: Environment, pipeNameOnEnv: string): BuildTask[] {\n const buildTasks: BuildTask[] = env[pipeNameOnEnv] ? env[pipeNameOnEnv]() : [];\n const slotsTasks = taskSlot.values().flat();\n const tasksAtStart: BuildTask[] = [];\n const tasksAtEnd: BuildTask[] = [];\n slotsTasks.forEach((task) => {\n if (task.location === 'start') {\n tasksAtStart.push(task);\n return;\n }\n if (task.location === 'end') {\n tasksAtEnd.push(task);\n return;\n }\n tasksAtStart.push(task);\n });\n\n // merge with extension registered tasks.\n const mergedTasks = [...tasksAtStart, ...buildTasks, ...tasksAtEnd];\n\n return mergedTasks;\n}\n"],"mappings":"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"}
|