build-raptor 0.131.0 → 0.133.0
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/deps/brand/brand.d.ts +5 -0
- package/dist/deps/brand/brand.js +3 -0
- package/dist/deps/brand/index.d.ts +1 -0
- package/dist/deps/brand/index.js +18 -0
- package/dist/deps/build-failed-error/build-failed-error.d.ts +14 -0
- package/dist/deps/build-failed-error/build-failed-error.js +13 -0
- package/dist/deps/build-failed-error/index.d.ts +1 -0
- package/dist/deps/build-failed-error/index.js +18 -0
- package/dist/deps/build-raptor-api/build-raptor-api.d.ts +351 -0
- package/dist/deps/build-raptor-api/build-raptor-api.js +132 -0
- package/dist/deps/build-raptor-api/index.d.ts +2 -0
- package/dist/deps/build-raptor-api/index.js +19 -0
- package/dist/deps/build-raptor-api/step-by-step-processor.d.ts +35 -0
- package/dist/deps/build-raptor-api/step-by-step-processor.js +3 -0
- package/dist/deps/build-raptor-core/breakdown.d.ts +18 -0
- package/dist/deps/build-raptor-core/breakdown.js +99 -0
- package/dist/deps/build-raptor-core/build-raptor-config.d.ts +21 -0
- package/dist/deps/build-raptor-core/build-raptor-config.js +25 -0
- package/dist/deps/build-raptor-core/default-asset-publisher.d.ts +10 -0
- package/dist/deps/build-raptor-core/default-asset-publisher.js +16 -0
- package/dist/deps/build-raptor-core/engine-bootstrapper.d.ts +50 -0
- package/dist/deps/build-raptor-core/engine-bootstrapper.js +200 -0
- package/dist/deps/build-raptor-core/engine-event-scheme.d.ts +20 -0
- package/dist/deps/build-raptor-core/engine-event-scheme.js +3 -0
- package/dist/deps/build-raptor-core/engine.d.ts +66 -0
- package/dist/deps/build-raptor-core/engine.js +285 -0
- package/dist/deps/build-raptor-core/examplify-zod.d.ts +93 -0
- package/dist/deps/build-raptor-core/examplify-zod.js +257 -0
- package/dist/deps/build-raptor-core/execution-plan.d.ts +20 -0
- package/dist/deps/build-raptor-core/execution-plan.js +66 -0
- package/dist/deps/build-raptor-core/execution-record.d.ts +17 -0
- package/dist/deps/build-raptor-core/execution-record.js +3 -0
- package/dist/deps/build-raptor-core/execution-type.d.ts +2 -0
- package/dist/deps/build-raptor-core/execution-type.js +3 -0
- package/dist/deps/build-raptor-core/find-repo-dir.d.ts +1 -0
- package/dist/deps/build-raptor-core/find-repo-dir.js +27 -0
- package/dist/deps/build-raptor-core/fingerprint-ledger.d.ts +33 -0
- package/dist/deps/build-raptor-core/fingerprint-ledger.js +164 -0
- package/dist/deps/build-raptor-core/fingerprint.d.ts +3 -0
- package/dist/deps/build-raptor-core/fingerprint.js +13 -0
- package/dist/deps/build-raptor-core/fingerprinter.d.ts +15 -0
- package/dist/deps/build-raptor-core/fingerprinter.js +122 -0
- package/dist/deps/build-raptor-core/hasher.d.ts +21 -0
- package/dist/deps/build-raptor-core/hasher.js +93 -0
- package/dist/deps/build-raptor-core/index.d.ts +9 -0
- package/dist/deps/build-raptor-core/index.js +26 -0
- package/dist/deps/build-raptor-core/model.d.ts +17 -0
- package/dist/deps/build-raptor-core/model.js +40 -0
- package/dist/deps/build-raptor-core/nop-asset-publisher.d.ts +6 -0
- package/dist/deps/build-raptor-core/nop-asset-publisher.js +12 -0
- package/dist/deps/build-raptor-core/performance-report.d.ts +5 -0
- package/dist/deps/build-raptor-core/performance-report.js +3 -0
- package/dist/deps/build-raptor-core/phase.d.ts +1 -0
- package/dist/deps/build-raptor-core/phase.js +3 -0
- package/dist/deps/build-raptor-core/planner.d.ts +12 -0
- package/dist/deps/build-raptor-core/planner.js +43 -0
- package/dist/deps/build-raptor-core/purger.d.ts +11 -0
- package/dist/deps/build-raptor-core/purger.js +65 -0
- package/dist/deps/build-raptor-core/slot-index.d.ts +6 -0
- package/dist/deps/build-raptor-core/slot-index.js +17 -0
- package/dist/deps/build-raptor-core/step-by-step-transmitter.d.ts +15 -0
- package/dist/deps/build-raptor-core/step-by-step-transmitter.js +94 -0
- package/dist/deps/build-raptor-core/tar-stream.d.ts +20 -0
- package/dist/deps/build-raptor-core/tar-stream.js +194 -0
- package/dist/deps/build-raptor-core/task-executor.d.ts +32 -0
- package/dist/deps/build-raptor-core/task-executor.js +321 -0
- package/dist/deps/build-raptor-core/task-store-cli.d.ts +1 -0
- package/dist/deps/build-raptor-core/task-store-cli.js +61 -0
- package/dist/deps/build-raptor-core/task-store-event.d.ts +17 -0
- package/dist/deps/build-raptor-core/task-store-event.js +3 -0
- package/dist/deps/build-raptor-core/task-store.d.ts +41 -0
- package/dist/deps/build-raptor-core/task-store.js +302 -0
- package/dist/deps/build-raptor-core/task-summary.d.ts +12 -0
- package/dist/deps/build-raptor-core/task-summary.js +3 -0
- package/dist/deps/build-raptor-core/task-tracker.d.ts +23 -0
- package/dist/deps/build-raptor-core/task-tracker.js +97 -0
- package/dist/deps/build-raptor-core/task.d.ts +30 -0
- package/dist/deps/build-raptor-core/task.js +90 -0
- package/dist/deps/build-raptor-core/updatable-task-output-registry.d.ts +13 -0
- package/dist/deps/build-raptor-core/updatable-task-output-registry.js +75 -0
- package/dist/deps/build-raptor-core/validate-task-infos.d.ts +3 -0
- package/dist/deps/build-raptor-core/validate-task-infos.js +53 -0
- package/dist/deps/build-raptor-core-testkit/build-raptor-core-testkit.d.ts +1 -0
- package/dist/deps/build-raptor-core-testkit/build-raptor-core-testkit.js +18 -0
- package/dist/deps/build-raptor-core-testkit/driver.d.ts +119 -0
- package/dist/deps/build-raptor-core-testkit/driver.js +305 -0
- package/dist/deps/build-raptor-core-testkit/index.d.ts +3 -0
- package/dist/deps/build-raptor-core-testkit/index.js +20 -0
- package/dist/deps/build-raptor-core-testkit/repo-protocol-testkit.d.ts +35 -0
- package/dist/deps/build-raptor-core-testkit/repo-protocol-testkit.js +226 -0
- package/dist/deps/build-raptor-core-testkit/simple-node-repo-protocol.d.ts +27 -0
- package/dist/deps/build-raptor-core-testkit/simple-node-repo-protocol.js +140 -0
- package/dist/deps/build-run-id/build-run-id.d.ts +3 -0
- package/dist/deps/build-run-id/build-run-id.js +13 -0
- package/dist/deps/build-run-id/index.d.ts +1 -0
- package/dist/deps/build-run-id/index.js +18 -0
- package/dist/deps/core-types/core-types.d.ts +29 -0
- package/dist/deps/core-types/core-types.js +81 -0
- package/dist/deps/core-types/index.d.ts +1 -0
- package/dist/deps/core-types/index.js +18 -0
- package/dist/deps/logger/index.d.ts +1 -0
- package/dist/deps/logger/index.js +18 -0
- package/dist/deps/logger/logger.d.ts +26 -0
- package/dist/deps/logger/logger.js +152 -0
- package/dist/deps/misc/arrays.d.ts +7 -0
- package/dist/deps/misc/arrays.js +67 -0
- package/dist/deps/misc/camelize-record.d.ts +6 -0
- package/dist/deps/misc/camelize-record.js +16 -0
- package/dist/deps/misc/clean-directory.d.ts +4 -0
- package/dist/deps/misc/clean-directory.js +80 -0
- package/dist/deps/misc/constructs.d.ts +106 -0
- package/dist/deps/misc/constructs.js +131 -0
- package/dist/deps/misc/directory-scanner.d.ts +49 -0
- package/dist/deps/misc/directory-scanner.js +165 -0
- package/dist/deps/misc/executor.d.ts +39 -0
- package/dist/deps/misc/executor.js +59 -0
- package/dist/deps/misc/file-system-storage-client.d.ts +23 -0
- package/dist/deps/misc/file-system-storage-client.js +93 -0
- package/dist/deps/misc/folderify.d.ts +8 -0
- package/dist/deps/misc/folderify.js +86 -0
- package/dist/deps/misc/graph.d.ts +29 -0
- package/dist/deps/misc/graph.js +200 -0
- package/dist/deps/misc/in-memory-storage-client.d.ts +21 -0
- package/dist/deps/misc/in-memory-storage-client.js +75 -0
- package/dist/deps/misc/index.d.ts +20 -0
- package/dist/deps/misc/index.js +37 -0
- package/dist/deps/misc/int.d.ts +10 -0
- package/dist/deps/misc/int.js +29 -0
- package/dist/deps/misc/internal/graph-executor.d.ts +15 -0
- package/dist/deps/misc/internal/graph-executor.js +93 -0
- package/dist/deps/misc/maps.d.ts +29 -0
- package/dist/deps/misc/maps.js +47 -0
- package/dist/deps/misc/misc.d.ts +23 -0
- package/dist/deps/misc/misc.js +94 -0
- package/dist/deps/misc/object-map.d.ts +10 -0
- package/dist/deps/misc/object-map.js +26 -0
- package/dist/deps/misc/promises.d.ts +39 -0
- package/dist/deps/misc/promises.js +78 -0
- package/dist/deps/misc/records.d.ts +11 -0
- package/dist/deps/misc/records.js +40 -0
- package/dist/deps/misc/slurp-dir.d.ts +1 -0
- package/dist/deps/misc/slurp-dir.js +14 -0
- package/dist/deps/misc/storage-client.d.ts +12 -0
- package/dist/deps/misc/storage-client.js +3 -0
- package/dist/deps/misc/stream-to-buffer.d.ts +2 -0
- package/dist/deps/misc/stream-to-buffer.js +26 -0
- package/dist/deps/misc/strings.d.ts +12 -0
- package/dist/deps/misc/strings.js +68 -0
- package/dist/deps/misc/typed-publisher.d.ts +17 -0
- package/dist/deps/misc/typed-publisher.js +65 -0
- package/dist/deps/repo-protocol/index.d.ts +3 -0
- package/dist/deps/repo-protocol/index.js +20 -0
- package/dist/deps/repo-protocol/repo-protocol.d.ts +49 -0
- package/dist/deps/repo-protocol/repo-protocol.js +3 -0
- package/dist/deps/repo-protocol/task-info.d.ts +18 -0
- package/dist/deps/repo-protocol/task-info.js +3 -0
- package/dist/deps/repo-protocol/test-run-summary.d.ts +54 -0
- package/dist/deps/repo-protocol/test-run-summary.js +32 -0
- package/dist/deps/repo-protocol-toolbox/generate-task-infos.d.ts +5 -0
- package/dist/deps/repo-protocol-toolbox/generate-task-infos.js +26 -0
- package/dist/deps/repo-protocol-toolbox/index.d.ts +3 -0
- package/dist/deps/repo-protocol-toolbox/index.js +20 -0
- package/dist/deps/repo-protocol-toolbox/repo-protocol-toolbox.d.ts +10 -0
- package/dist/deps/repo-protocol-toolbox/repo-protocol-toolbox.js +90 -0
- package/dist/deps/repo-protocol-toolbox/task-definition.d.ts +14 -0
- package/dist/deps/repo-protocol-toolbox/task-definition.js +3 -0
- package/dist/deps/reporter-output/index.d.ts +1 -0
- package/dist/deps/reporter-output/index.js +18 -0
- package/dist/deps/reporter-output/reporter-output.d.ts +49 -0
- package/dist/deps/reporter-output/reporter-output.js +25 -0
- package/dist/deps/s3-storage-client/creds.d.ts +4 -0
- package/dist/deps/s3-storage-client/creds.js +3 -0
- package/dist/deps/s3-storage-client/get-s3-storage-client-factory.d.ts +3 -0
- package/dist/deps/s3-storage-client/get-s3-storage-client-factory.js +45 -0
- package/dist/deps/s3-storage-client/index.d.ts +2 -0
- package/dist/deps/s3-storage-client/index.js +19 -0
- package/dist/deps/s3-storage-client/main.d.ts +1 -0
- package/dist/deps/s3-storage-client/main.js +20 -0
- package/dist/deps/s3-storage-client/s3-storage-client.d.ts +25 -0
- package/dist/deps/s3-storage-client/s3-storage-client.js +134 -0
- package/dist/deps/task-name/index.d.ts +1 -0
- package/dist/deps/task-name/index.js +18 -0
- package/dist/deps/task-name/task-name.d.ts +17 -0
- package/dist/deps/task-name/task-name.js +44 -0
- package/dist/deps/unit-metadata/index.d.ts +1 -0
- package/dist/deps/unit-metadata/index.js +18 -0
- package/dist/deps/unit-metadata/unit-metadata.d.ts +14 -0
- package/dist/deps/unit-metadata/unit-metadata.js +32 -0
- package/dist/deps/yarn-repo-protocol/build-task-record.d.ts +61 -0
- package/dist/deps/yarn-repo-protocol/build-task-record.js +29 -0
- package/dist/deps/yarn-repo-protocol/generate-test-run-summary.d.ts +4 -0
- package/dist/deps/yarn-repo-protocol/generate-test-run-summary.js +26 -0
- package/dist/deps/yarn-repo-protocol/index.d.ts +2 -0
- package/dist/deps/yarn-repo-protocol/index.js +19 -0
- package/dist/deps/yarn-repo-protocol/rerun-list.d.ts +12 -0
- package/dist/deps/yarn-repo-protocol/rerun-list.js +6 -0
- package/dist/deps/yarn-repo-protocol/yarn-repo-protocol-config.d.ts +24 -0
- package/dist/deps/yarn-repo-protocol/yarn-repo-protocol-config.js +34 -0
- package/dist/deps/yarn-repo-protocol/yarn-repo-protocol.d.ts +82 -0
- package/dist/deps/yarn-repo-protocol/yarn-repo-protocol.js +1036 -0
- package/dist/src/build-raptor-cli.d.ts +60 -0
- package/dist/src/build-raptor-cli.js +514 -0
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.js +20 -0
- package/dist/src/main.d.ts +2 -0
- package/dist/src/main.js +23 -0
- package/dist/src/register-asset-request.d.ts +18 -0
- package/dist/src/register-asset-request.js +11 -0
- package/dist/src/task-execution-visualizer.d.ts +17 -0
- package/dist/src/task-execution-visualizer.js +116 -0
- package/package.json +17 -14
- package/build-raptor.js +0 -7259
- package/index.d.ts +0 -22
- package/index.js +0 -7231
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.TaskStore = exports.BlobId = void 0;
|
|
37
|
+
const build_failed_error_1 = require("build-failed-error");
|
|
38
|
+
const core_types_1 = require("core-types");
|
|
39
|
+
const fs = __importStar(require("fs"));
|
|
40
|
+
const fs_1 = require("fs");
|
|
41
|
+
const fse = __importStar(require("fs-extra"));
|
|
42
|
+
const misc_1 = require("misc");
|
|
43
|
+
const path = __importStar(require("path"));
|
|
44
|
+
const stream = __importStar(require("stream"));
|
|
45
|
+
const Tmp = __importStar(require("tmp-promise"));
|
|
46
|
+
const util = __importStar(require("util"));
|
|
47
|
+
const zlib = __importStar(require("zlib"));
|
|
48
|
+
const zod_1 = require("zod");
|
|
49
|
+
const tar_stream_1 = require("./tar-stream");
|
|
50
|
+
const pipeline = util.promisify(stream.pipeline);
|
|
51
|
+
const unzip = util.promisify(zlib.unzip);
|
|
52
|
+
const Metadata = zod_1.z.object({
|
|
53
|
+
/**
|
|
54
|
+
* An array of output locations (paths in repo)
|
|
55
|
+
*/
|
|
56
|
+
outputs: zod_1.z.string().array(),
|
|
57
|
+
/**
|
|
58
|
+
* A record that maps output locations (path in repo) to content hashes. Include output location that were defined in
|
|
59
|
+
* the TaskInfo with isPublic: true. This allows downloading the content from a content-addressable storage.
|
|
60
|
+
*/
|
|
61
|
+
publicFiles: zod_1.z.record(zod_1.z.string(), zod_1.z.string()).default({}),
|
|
62
|
+
});
|
|
63
|
+
function validate(input) {
|
|
64
|
+
if (input.length === 0) {
|
|
65
|
+
throw new Error(`Bad BlobId: <${input}>`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
const BlobId = (s) => {
|
|
69
|
+
validate(s);
|
|
70
|
+
return s;
|
|
71
|
+
};
|
|
72
|
+
exports.BlobId = BlobId;
|
|
73
|
+
class TaskStore {
|
|
74
|
+
constructor(repoRootDir, client, logger, publisher, trace) {
|
|
75
|
+
this.repoRootDir = repoRootDir;
|
|
76
|
+
this.client = client;
|
|
77
|
+
this.logger = logger;
|
|
78
|
+
this.publisher = publisher;
|
|
79
|
+
this.trace = trace;
|
|
80
|
+
this.logger.info(`TaskStore created`);
|
|
81
|
+
}
|
|
82
|
+
async putBlob(content, hint) {
|
|
83
|
+
const ret = blobIdOf(content);
|
|
84
|
+
if (content.length === 0) {
|
|
85
|
+
return ret;
|
|
86
|
+
}
|
|
87
|
+
const key = { type: 'blob', blobId: ret };
|
|
88
|
+
if (await this.client.objectExists(key)) {
|
|
89
|
+
return ret;
|
|
90
|
+
}
|
|
91
|
+
this.trace?.push(`putting object: ${JSON.stringify(ret)} (hint: ${hint})=> ${content.length}`);
|
|
92
|
+
await this.client.putObject(key, content);
|
|
93
|
+
this.logger.info(`>>> uploaded ${hint}`);
|
|
94
|
+
return ret;
|
|
95
|
+
}
|
|
96
|
+
async getBlob(blobId) {
|
|
97
|
+
const nothing = emptyBuffer();
|
|
98
|
+
if (blobId === blobIdOf(nothing)) {
|
|
99
|
+
return nothing;
|
|
100
|
+
}
|
|
101
|
+
return await this.client.getObject({ type: 'blob', blobId }, 'buffer');
|
|
102
|
+
}
|
|
103
|
+
async getIfExists(k) {
|
|
104
|
+
const exists = await this.client.objectExists(k);
|
|
105
|
+
if (!exists) {
|
|
106
|
+
return undefined;
|
|
107
|
+
}
|
|
108
|
+
return await this.client.getObject(k, 'string');
|
|
109
|
+
}
|
|
110
|
+
async putVerdict(taskName, fingerprint, verdict, blobId) {
|
|
111
|
+
const key = { type: 'verdict', taskName, fingerprint, verdict, version: 2 };
|
|
112
|
+
// we put the key in the content for debugging purposes: it allows humans to understand what this object is
|
|
113
|
+
// about when inspecting underlying storage (the key underwhich the object is stored key is likely to be hashed so
|
|
114
|
+
// it is totally unreadable).
|
|
115
|
+
await this.client.putObject(key, JSON.stringify({ key, blobId }));
|
|
116
|
+
}
|
|
117
|
+
async getVerdict(taskName, fingerprint) {
|
|
118
|
+
const baseKey = { type: 'verdict', taskName, fingerprint, version: 2 };
|
|
119
|
+
const [ok, fail] = await Promise.all([
|
|
120
|
+
this.getIfExists({ ...baseKey, verdict: 'OK' }),
|
|
121
|
+
this.getIfExists({ ...baseKey, verdict: 'FAIL' }),
|
|
122
|
+
]);
|
|
123
|
+
const getBlobId = (content) => {
|
|
124
|
+
const parsed = JSON.parse(content);
|
|
125
|
+
// TODO(imaman): use zod to validate parsed
|
|
126
|
+
return (0, exports.BlobId)(parsed.blobId);
|
|
127
|
+
};
|
|
128
|
+
if (ok && fail) {
|
|
129
|
+
return ['FLAKY', getBlobId(ok)];
|
|
130
|
+
}
|
|
131
|
+
if (ok) {
|
|
132
|
+
return ['OK', getBlobId(ok)];
|
|
133
|
+
}
|
|
134
|
+
if (fail) {
|
|
135
|
+
return ['FAIL', getBlobId(fail)];
|
|
136
|
+
}
|
|
137
|
+
return ['UNKNOWN', blobIdOf(emptyBuffer())];
|
|
138
|
+
}
|
|
139
|
+
async bundle(outputs) {
|
|
140
|
+
if (!outputs.length) {
|
|
141
|
+
return { buffer: emptyBuffer(), publicFiles: {} };
|
|
142
|
+
}
|
|
143
|
+
this.trace?.push(`bundling ${JSON.stringify(outputs)}`);
|
|
144
|
+
const pairs = await (0, misc_1.promises)(outputs.filter(o => o.isPublic))
|
|
145
|
+
.map(async (o) => {
|
|
146
|
+
const resolved = this.repoRootDir.resolve(o.pathInRepo);
|
|
147
|
+
const stat = fs.statSync(resolved);
|
|
148
|
+
if (!stat.isFile()) {
|
|
149
|
+
throw new build_failed_error_1.BuildFailedError(`cannot publish an output location that is not a file: "${o.pathInRepo.val}"`);
|
|
150
|
+
}
|
|
151
|
+
const content = fs.readFileSync(resolved);
|
|
152
|
+
const h = await this.client.putContentAddressable(content);
|
|
153
|
+
return [o.pathInRepo.val, h];
|
|
154
|
+
})
|
|
155
|
+
.reify(STORAGE_CONCURRENCY);
|
|
156
|
+
const m = { outputs: outputs.map(o => o.pathInRepo.val), publicFiles: Object.fromEntries(pairs) };
|
|
157
|
+
const metadataBuf = Buffer.from(JSON.stringify(Metadata.parse(m)), 'utf-8');
|
|
158
|
+
if (metadataBuf.length > 100000) {
|
|
159
|
+
// Just for sanity.
|
|
160
|
+
throw new Error('metadata is too big');
|
|
161
|
+
}
|
|
162
|
+
const lenBuf = Buffer.alloc(LEN_BUF_SIZE);
|
|
163
|
+
lenBuf.writeInt32BE(metadataBuf.length);
|
|
164
|
+
const tempFile = await Tmp.file();
|
|
165
|
+
const pack = tar_stream_1.TarStream.pack();
|
|
166
|
+
const scanner = new misc_1.DirectoryScanner(this.repoRootDir.resolve());
|
|
167
|
+
for (const curr of outputs.filter(o => !o.isPublic)) {
|
|
168
|
+
const o = curr.pathInRepo;
|
|
169
|
+
const exists = await fse.pathExists(this.repoRootDir.resolve(o));
|
|
170
|
+
if (!exists) {
|
|
171
|
+
// TODO(imaman): turn this into a user-build-error? move it out of this file?
|
|
172
|
+
throw new Error(`Output location <${o}> does not exist (under <${this.repoRootDir}>)`);
|
|
173
|
+
}
|
|
174
|
+
await scanner.scanTree(o.val, (p, content, stat) => {
|
|
175
|
+
if (stat.isDirectory()) {
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
if (!stat.isSymbolicLink() && !stat.isFile()) {
|
|
179
|
+
throw new Error(`Cannot handle non-files in output: ${p} (under ${this.repoRootDir})`);
|
|
180
|
+
}
|
|
181
|
+
const resolved = this.repoRootDir.resolve((0, core_types_1.PathInRepo)(p));
|
|
182
|
+
// the return value of fs.stat() and friends has counterintuitive behavior: .mtimeMs will undeterministically
|
|
183
|
+
// include fractions of ms (e.g., 1690808418692.3323). Thus we're sticking with .mtime.getTime(). Similarly for
|
|
184
|
+
// atime, ctime.
|
|
185
|
+
const { mtime, atime, ctime } = fs.statSync(resolved);
|
|
186
|
+
this.trace?.push(`adding an entry: ${stat.mode.toString(8)} ${p} ${mtime.toISOString()}`);
|
|
187
|
+
if (stat.isSymbolicLink()) {
|
|
188
|
+
const linkTarget = content.toString('utf-8');
|
|
189
|
+
const resolved = path.isAbsolute(linkTarget) ? linkTarget : path.join(path.dirname(p), linkTarget);
|
|
190
|
+
const normalized = path.normalize(resolved);
|
|
191
|
+
pack.symlink({ from: p, mtime, to: normalized });
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
pack.entry({ path: p, mode: stat.mode, mtime, ctime, atime }, content);
|
|
195
|
+
}
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
const b = pack.toBuffer();
|
|
199
|
+
this.trace?.push(`digest of b is ${(0, misc_1.computeObjectHash)({ data: b.toString('hex') })}`);
|
|
200
|
+
const source = stream.Readable.from(b);
|
|
201
|
+
const gzip = zlib.createGzip();
|
|
202
|
+
const destination = (0, fs_1.createWriteStream)(tempFile.path);
|
|
203
|
+
await pipeline(source, gzip, destination);
|
|
204
|
+
const gzipped = await fse.readFile(tempFile.path);
|
|
205
|
+
this.trace?.push(`gzipped is ${gzipped.length} long`);
|
|
206
|
+
const ret = Buffer.concat([lenBuf, metadataBuf, gzipped]);
|
|
207
|
+
this.trace?.push(`bundling digest of ret is ${(0, misc_1.computeObjectHash)({ data: ret.toString('hex') })}`);
|
|
208
|
+
return { buffer: ret, publicFiles: m.publicFiles };
|
|
209
|
+
}
|
|
210
|
+
async unbundle(buf) {
|
|
211
|
+
if (buf.length === 0) {
|
|
212
|
+
return { files: [], publicFiles: {} };
|
|
213
|
+
}
|
|
214
|
+
const metadataLen = buf.slice(0, LEN_BUF_SIZE).readInt32BE();
|
|
215
|
+
const unparsed = JSON.parse(buf.slice(LEN_BUF_SIZE, LEN_BUF_SIZE + metadataLen).toString('utf-8'));
|
|
216
|
+
const metadata = Metadata.parse(unparsed);
|
|
217
|
+
const outputs = metadata.outputs.map(at => (0, core_types_1.PathInRepo)(at));
|
|
218
|
+
const removeOutputDir = async (o) => await fse.rm(this.repoRootDir.resolve(o), { recursive: true, force: true });
|
|
219
|
+
await (0, misc_1.promises)(outputs)
|
|
220
|
+
.map(async (o) => await removeOutputDir(o))
|
|
221
|
+
.reify(20);
|
|
222
|
+
const source = buf.slice(LEN_BUF_SIZE + metadataLen);
|
|
223
|
+
const unzipped = await unzip(source);
|
|
224
|
+
try {
|
|
225
|
+
await tar_stream_1.TarStream.extract(unzipped, this.repoRootDir.resolve(), this.logger);
|
|
226
|
+
}
|
|
227
|
+
catch (e) {
|
|
228
|
+
throw new Error(`unbundling a buffer (${buf.length} bytes) has failed: ${e}`);
|
|
229
|
+
}
|
|
230
|
+
await (0, misc_1.promises)(Object.keys(metadata.publicFiles)).forEach(STORAGE_CONCURRENCY, async (pir) => {
|
|
231
|
+
const pathInRepo = (0, core_types_1.PathInRepo)(pir);
|
|
232
|
+
const resolved = this.repoRootDir.resolve(pathInRepo);
|
|
233
|
+
const hash = metadata.publicFiles[pathInRepo.val];
|
|
234
|
+
if (!hash) {
|
|
235
|
+
throw new Error(`hash not found for "${pathInRepo}"`);
|
|
236
|
+
}
|
|
237
|
+
const buf = await this.client.getContentAddressable(hash);
|
|
238
|
+
fs.writeFileSync(resolved, buf);
|
|
239
|
+
});
|
|
240
|
+
return { files: outputs, publicFiles: metadata.publicFiles };
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Use only from tests
|
|
244
|
+
*/
|
|
245
|
+
async recordTaskForTesting(taskName, fingerprint, outputs, verdict) {
|
|
246
|
+
await this.recordTask(taskName, fingerprint, outputs.map(o => ({ pathInRepo: o, isPublic: false })), verdict);
|
|
247
|
+
}
|
|
248
|
+
async recordTask(taskName, fingerprint, outputs, verdict) {
|
|
249
|
+
const { blobId, publicFiles } = await this.recordBlob(taskName, outputs);
|
|
250
|
+
this.logger.info(`task=${taskName}, outputs=${JSON.stringify(outputs)}, publicFiles=${JSON.stringify(publicFiles)}`);
|
|
251
|
+
this.putVerdict(taskName, fingerprint, verdict, blobId);
|
|
252
|
+
await Promise.all([
|
|
253
|
+
this.publisher?.publish('taskStore', {
|
|
254
|
+
opcode: 'RECORDED',
|
|
255
|
+
taskName,
|
|
256
|
+
blobId,
|
|
257
|
+
fingerprint,
|
|
258
|
+
files: [...outputs.map(o => o.pathInRepo.val)],
|
|
259
|
+
}),
|
|
260
|
+
this.publisher?.publish('publicFiles', { taskName, publicFiles }),
|
|
261
|
+
]);
|
|
262
|
+
}
|
|
263
|
+
async recordBlob(taskName, outputs) {
|
|
264
|
+
const { buffer, publicFiles } = await this.bundle(outputs);
|
|
265
|
+
const blobId = await this.putBlob(buffer, taskName);
|
|
266
|
+
return { blobId, publicFiles };
|
|
267
|
+
}
|
|
268
|
+
async restoreTask(taskName, fingerprint) {
|
|
269
|
+
const [verdict, blobId] = await this.getVerdict(taskName, fingerprint);
|
|
270
|
+
const { files, publicFiles } = await this.restoreBlob(blobId);
|
|
271
|
+
await Promise.all([
|
|
272
|
+
this.publisher?.publish('taskStore', {
|
|
273
|
+
opcode: 'RESTORED',
|
|
274
|
+
taskName,
|
|
275
|
+
blobId,
|
|
276
|
+
fingerprint,
|
|
277
|
+
files: files.map(o => o.val),
|
|
278
|
+
}),
|
|
279
|
+
this.publisher?.publish('publicFiles', { taskName, publicFiles }),
|
|
280
|
+
]);
|
|
281
|
+
return verdict;
|
|
282
|
+
}
|
|
283
|
+
async restoreBlob(blobId) {
|
|
284
|
+
const buf = await this.getBlob(blobId);
|
|
285
|
+
const ret = await this.unbundle(buf);
|
|
286
|
+
return ret;
|
|
287
|
+
}
|
|
288
|
+
async checkVerdict(taskName, fingerprint) {
|
|
289
|
+
const [verdict] = await this.getVerdict(taskName, fingerprint);
|
|
290
|
+
return verdict;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
exports.TaskStore = TaskStore;
|
|
294
|
+
function emptyBuffer() {
|
|
295
|
+
return Buffer.from('');
|
|
296
|
+
}
|
|
297
|
+
function blobIdOf(buf) {
|
|
298
|
+
return (0, exports.BlobId)((0, misc_1.computeHash)(buf));
|
|
299
|
+
}
|
|
300
|
+
const LEN_BUF_SIZE = 8;
|
|
301
|
+
const STORAGE_CONCURRENCY = 100;
|
|
302
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzay1zdG9yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90YXNrLXN0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUNBLDJEQUFxRDtBQUNyRCwyQ0FBaUQ7QUFDakQsdUNBQXdCO0FBQ3hCLDJCQUFzQztBQUN0Qyw4Q0FBK0I7QUFFL0IsK0JBQXFIO0FBQ3JILDJDQUE0QjtBQUM1QiwrQ0FBZ0M7QUFFaEMsaURBQWtDO0FBQ2xDLDJDQUE0QjtBQUM1QiwyQ0FBNEI7QUFDNUIsNkJBQXVCO0FBR3ZCLDZDQUF3QztBQUt4QyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQTtBQUNoRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQTtBQUV4QyxNQUFNLFFBQVEsR0FBRyxPQUFDLENBQUMsTUFBTSxDQUFDO0lBQ3hCOztPQUVHO0lBQ0gsT0FBTyxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxLQUFLLEVBQUU7SUFDM0I7OztPQUdHO0lBQ0gsV0FBVyxFQUFFLE9BQUMsQ0FBQyxNQUFNLENBQUMsT0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7Q0FDMUQsQ0FBQyxDQUFBO0FBS0YsU0FBUyxRQUFRLENBQUMsS0FBYTtJQUM3QixJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDdkIsTUFBTSxJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsS0FBSyxHQUFHLENBQUMsQ0FBQTtJQUMzQyxDQUFDO0FBQ0gsQ0FBQztBQUVNLE1BQU0sTUFBTSxHQUEwQixDQUFDLENBQVMsRUFBRSxFQUFFO0lBQ3pELFFBQVEsQ0FBQyxDQUFDLENB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
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { TaskName } from 'task-name';
|
|
2
|
+
import { ExecutionType } from './execution-type';
|
|
3
|
+
import { SlotIndex } from './slot-index';
|
|
4
|
+
export interface TaskSummary {
|
|
5
|
+
taskName: TaskName;
|
|
6
|
+
outputFile?: string;
|
|
7
|
+
verdict: 'OK' | 'FAIL' | 'CRASH' | 'UNKNOWN';
|
|
8
|
+
execution: ExecutionType;
|
|
9
|
+
startedAt: SlotIndex;
|
|
10
|
+
endedAt: SlotIndex;
|
|
11
|
+
rootCause?: TaskName;
|
|
12
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzay1zdW1tYXJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rhc2stc3VtbWFyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIn0=
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { ExitStatus } from 'repo-protocol';
|
|
2
|
+
import { TaskName } from 'task-name';
|
|
3
|
+
import { ExecutionPlan } from './execution-plan';
|
|
4
|
+
import { PerformanceReport } from './performance-report';
|
|
5
|
+
import { Task } from './task';
|
|
6
|
+
export declare class TaskTracker {
|
|
7
|
+
private readonly plan;
|
|
8
|
+
private numRunning;
|
|
9
|
+
private readonly usedConcurrencyLevles;
|
|
10
|
+
private numExecuted;
|
|
11
|
+
private counter;
|
|
12
|
+
constructor(plan: ExecutionPlan);
|
|
13
|
+
tasks(): Task[];
|
|
14
|
+
getDependencyTasks(tn: TaskName): Task[];
|
|
15
|
+
hasVerdict(taskName: TaskName): boolean;
|
|
16
|
+
getPerformanceReport(): PerformanceReport;
|
|
17
|
+
changeStatus(taskName: TaskName, status: 'RUNNING' | 'DONE'): void;
|
|
18
|
+
registerCachedVerdict(taskName: TaskName, cachedVerdict: 'OK' | 'FLAKY' | 'FAIL'): void;
|
|
19
|
+
registerVerdict(taskName: TaskName, status: ExitStatus, outputFile: string): void;
|
|
20
|
+
getTask(tn: TaskName): Task;
|
|
21
|
+
get successful(): boolean;
|
|
22
|
+
private propagateFailure;
|
|
23
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TaskTracker = void 0;
|
|
4
|
+
const misc_1 = require("misc");
|
|
5
|
+
const slot_index_1 = require("./slot-index");
|
|
6
|
+
class TaskTracker {
|
|
7
|
+
constructor(plan) {
|
|
8
|
+
this.plan = plan;
|
|
9
|
+
this.numRunning = 0;
|
|
10
|
+
this.usedConcurrencyLevles = [];
|
|
11
|
+
this.numExecuted = 0;
|
|
12
|
+
this.counter = (0, slot_index_1.SlotIndex)(0);
|
|
13
|
+
}
|
|
14
|
+
tasks() {
|
|
15
|
+
return this.plan.tasks();
|
|
16
|
+
}
|
|
17
|
+
getDependencyTasks(tn) {
|
|
18
|
+
return this.plan.taskGraph.neighborsOf(tn).map(tn => this.getTask(tn));
|
|
19
|
+
}
|
|
20
|
+
hasVerdict(taskName) {
|
|
21
|
+
return (0, misc_1.switchOn)(this.getTask(taskName).record.verdict, {
|
|
22
|
+
UNKNOWN: () => false,
|
|
23
|
+
OK: () => true,
|
|
24
|
+
FAIL: () => true,
|
|
25
|
+
CRASH: () => true,
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
getPerformanceReport() {
|
|
29
|
+
return {
|
|
30
|
+
maxUsedConcurrency: Math.max(...this.usedConcurrencyLevles),
|
|
31
|
+
numExecuted: this.numExecuted,
|
|
32
|
+
usedConcurrencyLevles: this.usedConcurrencyLevles,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
changeStatus(taskName, status) {
|
|
36
|
+
const t = this.getTask(taskName);
|
|
37
|
+
this.counter = (0, slot_index_1.SlotIndex)(this.counter, (0, misc_1.switchOn)(status, { RUNNING: () => (0, misc_1.Int)(0), DONE: () => (0, misc_1.Int)(1) }));
|
|
38
|
+
t.changeStatus(status, this.counter);
|
|
39
|
+
if (status === 'RUNNING') {
|
|
40
|
+
this.numRunning += 1;
|
|
41
|
+
this.numExecuted += 1;
|
|
42
|
+
this.usedConcurrencyLevles.push(this.numRunning);
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
if (status === 'DONE') {
|
|
46
|
+
this.numRunning -= 1;
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
(0, misc_1.shouldNeverHappen)(status);
|
|
50
|
+
}
|
|
51
|
+
registerCachedVerdict(taskName, cachedVerdict) {
|
|
52
|
+
const task = this.getTask(taskName);
|
|
53
|
+
if (cachedVerdict === 'OK' || cachedVerdict === 'FLAKY') {
|
|
54
|
+
task.assignVerdict('OK', 'CACHED');
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
if (cachedVerdict == 'FAIL') {
|
|
58
|
+
task.assignVerdict('FAIL', 'CACHED');
|
|
59
|
+
this.propagateFailure(taskName);
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
(0, misc_1.shouldNeverHappen)(cachedVerdict);
|
|
63
|
+
}
|
|
64
|
+
registerVerdict(taskName, status, outputFile) {
|
|
65
|
+
const task = this.getTask(taskName);
|
|
66
|
+
task.assignVerdict(status, 'EXECUTED');
|
|
67
|
+
(0, misc_1.switchOn)(status, {
|
|
68
|
+
CRASH: () => { },
|
|
69
|
+
FAIL: () => task.setOutputFile(outputFile),
|
|
70
|
+
OK: () => task.setOutputFile(outputFile),
|
|
71
|
+
});
|
|
72
|
+
(0, misc_1.switchOn)(status, {
|
|
73
|
+
CRASH: () => { },
|
|
74
|
+
FAIL: () => this.propagateFailure(taskName),
|
|
75
|
+
OK: () => { },
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
getTask(tn) {
|
|
79
|
+
return this.plan.getTask(tn);
|
|
80
|
+
}
|
|
81
|
+
get successful() {
|
|
82
|
+
return this.tasks().every(t => t.record.verdict === 'OK');
|
|
83
|
+
}
|
|
84
|
+
propagateFailure(taskName) {
|
|
85
|
+
const toFail = this.plan.errorPropagationGraph.traverseFrom(taskName, { direction: 'backwards' });
|
|
86
|
+
for (const t of toFail) {
|
|
87
|
+
if (t === taskName) {
|
|
88
|
+
// TODO(imaman): not tested
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
const r = this.getTask(t);
|
|
92
|
+
r.assignVerdict('FAIL', 'CANNOT_START', taskName);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
exports.TaskTracker = TaskTracker;
|
|
97
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzay10cmFja2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rhc2stdHJhY2tlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwrQkFBdUQ7QUFNdkQsNkNBQXdDO0FBR3hDLE1BQWEsV0FBVztJQU10QixZQUE2QixJQUFtQjtRQUFuQixTQUFJLEdBQUosSUFBSSxDQUFlO1FBTHhDLGVBQVUsR0FBRyxDQUFDLENBQUE7UUFDTCwwQkFBcUIsR0FBYSxFQUFFLENBQUE7UUFDN0MsZ0JBQVcsR0FBRyxDQUFDLENBQUE7UUFDZixZQUFPLEdBQWMsSUFBQSxzQkFBUyxFQUFDLENBQUMsQ0FBQyxDQUFBO0lBRVUsQ0FBQztJQUVwRCxLQUFLO1FBQ0gsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFBO0lBQzFCLENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxFQUFZO1FBQzdCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtJQUN4RSxDQUFDO0lBRUQsVUFBVSxDQUFDLFFBQWtCO1FBQzNCLE9BQU8sSUFBQSxlQUFRLEVBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFO1lBQ3JELE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxLQUFLO1lBQ3BCLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJO1lBQ2QsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUk7WUFDaEIsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUk7U0FDbEIsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVELG9CQUFvQjtRQUNsQixPQUFPO1lBQ0wsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLEdB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
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { PathInRepo } from 'core-types';
|
|
2
|
+
import { OutputLocation, TaskInfo } from 'repo-protocol';
|
|
3
|
+
import { TaskName } from 'task-name';
|
|
4
|
+
import { ExecutionRecord } from './execution-record';
|
|
5
|
+
import { Fingerprint } from './fingerprint';
|
|
6
|
+
import { Phase } from './phase';
|
|
7
|
+
import { SlotIndex } from './slot-index';
|
|
8
|
+
export declare class Task {
|
|
9
|
+
private readonly buildRunId;
|
|
10
|
+
readonly taskInfo: TaskInfo;
|
|
11
|
+
readonly labels: readonly string[];
|
|
12
|
+
readonly name: TaskName;
|
|
13
|
+
readonly id: string;
|
|
14
|
+
private fingerprint;
|
|
15
|
+
private readonly executionRecord;
|
|
16
|
+
readonly inputs: readonly PathInRepo[];
|
|
17
|
+
constructor(buildRunId: string, taskInfo: TaskInfo, inputs: PathInRepo[], labels: readonly string[]);
|
|
18
|
+
get unitId(): import("modules/unit-metadata/dist/src").UnitId;
|
|
19
|
+
changeStatus(status: 'RUNNING' | 'DONE', counter: SlotIndex): void;
|
|
20
|
+
getFingerprint(): Fingerprint;
|
|
21
|
+
computeFingerprint(fingerprintsOfInputs: Fingerprint[]): void;
|
|
22
|
+
setPhase(phase: Phase): void;
|
|
23
|
+
getPhase(): Phase;
|
|
24
|
+
hasPhase(): boolean;
|
|
25
|
+
get record(): ExecutionRecord;
|
|
26
|
+
get outputLocations(): OutputLocation[];
|
|
27
|
+
assignVerdict(verdict: 'OK' | 'FAIL' | 'CRASH', executionType: 'EXECUTED' | 'CACHED' | 'CANNOT_START', rootCause?: TaskName): void;
|
|
28
|
+
setOutputFile(outputFile: string): void;
|
|
29
|
+
getDurationMillis(): number | undefined;
|
|
30
|
+
}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Task = void 0;
|
|
4
|
+
const misc_1 = require("misc");
|
|
5
|
+
const task_name_1 = require("task-name");
|
|
6
|
+
const fingerprint_1 = require("./fingerprint");
|
|
7
|
+
const slot_index_1 = require("./slot-index");
|
|
8
|
+
class Task {
|
|
9
|
+
constructor(buildRunId, taskInfo, inputs, labels) {
|
|
10
|
+
this.buildRunId = buildRunId;
|
|
11
|
+
this.taskInfo = taskInfo;
|
|
12
|
+
this.labels = labels;
|
|
13
|
+
this.inputs = (0, misc_1.uniqueBy)((0, misc_1.sortBy)(inputs, t => t.val), t => t.val);
|
|
14
|
+
this.name = taskInfo.taskName;
|
|
15
|
+
this.id = (0, misc_1.computeObjectHash)({ buildRunId: this.buildRunId, name: this.name });
|
|
16
|
+
this.executionRecord = {
|
|
17
|
+
verdict: 'UNKNOWN',
|
|
18
|
+
executionType: 'UNKNOWN',
|
|
19
|
+
startedAt: (0, slot_index_1.SlotIndex)(-1),
|
|
20
|
+
endedAt: (0, slot_index_1.SlotIndex)(-1),
|
|
21
|
+
phases: [],
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
get unitId() {
|
|
25
|
+
return (0, task_name_1.TaskName)().undo(this.name).unitId;
|
|
26
|
+
}
|
|
27
|
+
changeStatus(status, counter) {
|
|
28
|
+
if (status === 'RUNNING') {
|
|
29
|
+
this.executionRecord.startedAt = counter;
|
|
30
|
+
}
|
|
31
|
+
else if (status === 'DONE') {
|
|
32
|
+
this.executionRecord.endedAt = counter;
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
(0, misc_1.shouldNeverHappen)(status);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
getFingerprint() {
|
|
39
|
+
return this.fingerprint ?? (0, misc_1.failMe)(`fingerprint not set in ${this.name}`);
|
|
40
|
+
}
|
|
41
|
+
computeFingerprint(fingerprintsOfInputs) {
|
|
42
|
+
if (this.fingerprint !== undefined) {
|
|
43
|
+
throw new Error(`Fingerprint was already set in ${this.name}`);
|
|
44
|
+
}
|
|
45
|
+
const fp = (0, misc_1.computeObjectHash)({
|
|
46
|
+
fingerprintsOfInputs,
|
|
47
|
+
info: this.taskInfo, // eslint-disable-line @typescript-eslint/consistent-type-assertions
|
|
48
|
+
});
|
|
49
|
+
this.fingerprint = (0, fingerprint_1.Fingerprint)(fp);
|
|
50
|
+
}
|
|
51
|
+
setPhase(phase) {
|
|
52
|
+
this.executionRecord.phases.push({ phase, timestampMillis: Date.now() });
|
|
53
|
+
}
|
|
54
|
+
getPhase() {
|
|
55
|
+
const pos = this.executionRecord.phases.length - 1;
|
|
56
|
+
return pos >= 0 ? this.executionRecord.phases[pos].phase : 'UNSTARTED';
|
|
57
|
+
}
|
|
58
|
+
hasPhase() {
|
|
59
|
+
return this.executionRecord.phases.length > 0;
|
|
60
|
+
}
|
|
61
|
+
get record() {
|
|
62
|
+
return this.executionRecord;
|
|
63
|
+
}
|
|
64
|
+
get outputLocations() {
|
|
65
|
+
return this.taskInfo.outputLocations ?? [];
|
|
66
|
+
}
|
|
67
|
+
assignVerdict(verdict, executionType, rootCause) {
|
|
68
|
+
this.executionRecord.verdict = verdict;
|
|
69
|
+
this.executionRecord.executionType = executionType;
|
|
70
|
+
this.executionRecord.rootCause = rootCause;
|
|
71
|
+
}
|
|
72
|
+
setOutputFile(outputFile) {
|
|
73
|
+
this.executionRecord.outputFile = outputFile;
|
|
74
|
+
}
|
|
75
|
+
getDurationMillis() {
|
|
76
|
+
const phases = this.executionRecord.phases;
|
|
77
|
+
if (phases.length < 2) {
|
|
78
|
+
return undefined;
|
|
79
|
+
}
|
|
80
|
+
// Find the first RUNNING phase and the last phase
|
|
81
|
+
const runningPhase = phases.find(p => p.phase === 'RUNNING');
|
|
82
|
+
const lastPhase = phases[phases.length - 1];
|
|
83
|
+
if (!runningPhase) {
|
|
84
|
+
return undefined;
|
|
85
|
+
}
|
|
86
|
+
return lastPhase.timestampMillis - runningPhase.timestampMillis;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
exports.Task = Task;
|
|
90
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90YXNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLCtCQUErRjtBQUUvRix5Q0FBb0M7QUFJcEMsK0NBQTJDO0FBRTNDLDZDQUF3QztBQUV4QyxNQUFhLElBQUk7SUFPZixZQUNtQixVQUFrQixFQUMxQixRQUFrQixFQUMzQixNQUFvQixFQUNYLE1BQXlCO1FBSGpCLGVBQVUsR0FBVixVQUFVLENBQVE7UUFDMUIsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUVsQixXQUFNLEdBQU4sTUFBTSxDQUFtQjtRQUVsQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUEsZUFBUSxFQUNwQixJQUFBLGFBQU0sRUFBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQzFCLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FDWCxDQUFBO1FBQ0QsSUFBSSxDQUFDLElBQUksR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFBO1FBQzdCLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBQSx3QkFBaUIsRUFBQyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQTtRQUM3RSxJQUFJLENBQUMsZUFBZSxHQUFHO1lBQ3JCLE9BQU8sRUFBRSxTQUFTO1lBQ2xCLGFBQWEsRUFBRSxTQUFTO1lBQ3hCLFNBQVMsRUFBRSxJQUFBLHNCQUFTLEVBQUMsQ0FBQyxDQUFDLENBQUM7WUFDeEIsT0FBTyxFQUFFLElBQUEsc0JBQVMsRUFBQyxDQUFDLENBQUMsQ0FBQztZQUN0QixNQUFNLEVBQUUsRUFBRTtTQUNYLENBQUE7SUFDSCxDQUFDO0lBRUQsSUFBSSxNQUFNO1FBQ1IsT0FBTyxJQUFBLG9CQUFRLEdBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FB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
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { PathInRepo } from 'core-types';
|
|
2
|
+
import { TaskName } from 'task-name';
|
|
3
|
+
export interface TaskOutputRegistry {
|
|
4
|
+
lookup(outputLoc: PathInRepo): TaskName | undefined;
|
|
5
|
+
wideLookup(outputLoc: PathInRepo): TaskName[];
|
|
6
|
+
}
|
|
7
|
+
export declare class UpdateableTaskOutputRegistry implements TaskOutputRegistry {
|
|
8
|
+
private readonly map;
|
|
9
|
+
constructor();
|
|
10
|
+
add(taskName: TaskName, outputLoc: PathInRepo): void;
|
|
11
|
+
lookup(outputLoc: PathInRepo): TaskName | undefined;
|
|
12
|
+
wideLookup(outputLoc: PathInRepo): TaskName[];
|
|
13
|
+
}
|