1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
import {
getStdout,
type ITraceable,
LogLevel,
type LogMetricTraceSupplier,
memoize,
Metric,
TraceUtil,
validateExecutionEntries,
} from "@emprespresso/pengueno";
import type { Job } from "@emprespresso/ci-model";
const jobTypeMetric = memoize((type: string) => Metric.fromName(`run.${type}`));
export const executeJob = (tJob: ITraceable<Job, LogMetricTraceSupplier>) =>
tJob
.bimap(TraceUtil.withMetricTrace(jobTypeMetric(tJob.get().type)))
.peek((tJob) =>
tJob.trace.trace(`let's do this little job ok!! ${tJob.get()}`),
)
.map((tJob) =>
validateExecutionEntries(tJob.get().arguments)
.mapLeft((badEntries) => {
tJob.trace.addTrace(LogLevel.ERROR).trace(badEntries.toString());
return new Error("invalid job arguments");
})
.flatMapAsync((args) =>
getStdout(tJob.move(tJob.get().type), { env: args }),
),
)
.peek(
TraceUtil.promiseify((q) =>
q.trace.trace(
q
.get()
.fold(
(err, _val) =>
jobTypeMetric(tJob.get().type)[err ? "failure" : "success"],
),
),
),
)
.get();
|