summaryrefslogtreecommitdiff
path: root/worker/executor/job.ts
blob: 76f0e0c8e8187ffe347c419db0579333c3b8701b (plain)
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();