diff --git a/.changeset/light-dragons-complain.md b/.changeset/light-dragons-complain.md new file mode 100644 index 0000000000..ebc7cea8f3 --- /dev/null +++ b/.changeset/light-dragons-complain.md @@ -0,0 +1,5 @@ +--- +"trigger.dev": patch +--- + +Correctly handle self-hosted deploy command errors diff --git a/apps/kubernetes-provider/src/index.ts b/apps/kubernetes-provider/src/index.ts index 5442e0677b..ceb1d62a35 100644 --- a/apps/kubernetes-provider/src/index.ts +++ b/apps/kubernetes-provider/src/index.ts @@ -417,7 +417,11 @@ class KubernetesTaskOperations implements TaskOperations { type: THookType, cause: THookType extends "postStart" ? PostStartCauses : PreStopCauses ) { - return ["/bin/sh", "-c", `sleep 1; wget -q -O- 127.0.0.1:8000/${type}?cause=${cause}`]; + const retries = 5 + + // This will retry sending the lifecycle hook up to `retries` times + // The sleep is required as this may start running before the HTTP server is up + return ["/bin/sh", "-c", `for i in $(seq ${retries}); do sleep 1; wget -q -O- 127.0.0.1:8000/${type}?cause=${cause} && break; done`]; } #getIndexContainerName(suffix: string) { diff --git a/packages/cli-v3/src/Containerfile.prod b/packages/cli-v3/src/Containerfile.prod index d56c3ea206..706deb330b 100644 --- a/packages/cli-v3/src/Containerfile.prod +++ b/packages/cli-v3/src/Containerfile.prod @@ -1,7 +1,10 @@ -FROM node:20-alpine@sha256:bf77dc26e48ea95fca9d1aceb5acfa69d2e546b765ec2abfb502975f1a2d4def AS base +FROM node:20-bookworm-slim@sha256:d4cdfc305abe5ea78da7167bf78263c22596dc332f2654b662890777ea166224 AS base -RUN apk add --no-cache dumb-init +ENV DEBIAN_FRONTEND=noninteractive +RUN apt-get update && apt-get install -y --no-install-recommends dumb-init && rm -rf /var/lib/apt/lists/* +# Create and set workdir with appropriate permissions +RUN mkdir /app && chown node:node /app WORKDIR /app # copy all the files just in case anything is needed in postinstall diff --git a/packages/cli-v3/src/commands/deploy.ts b/packages/cli-v3/src/commands/deploy.ts index 8c68ddc77e..586e2343db 100644 --- a/packages/cli-v3/src/commands/deploy.ts +++ b/packages/cli-v3/src/commands/deploy.ts @@ -792,7 +792,7 @@ async function buildAndPushSelfHostedImage( let digest: string | undefined; try { - await new Promise((res, rej) => { + const processCode = await new Promise((res, rej) => { // For some reason everything is output on stderr, not stdout buildProcess.stderr?.on("data", (data: Buffer) => { const text = data.toString(); @@ -802,9 +802,17 @@ async function buildAndPushSelfHostedImage( }); buildProcess.on("error", (e) => rej(e)); - buildProcess.on("close", () => res()); + buildProcess.on("close", (code) => res(code)); }); + if (processCode !== 0) { + return { + ok: false as const, + error: "Error building image", + logs: extractLogs(errors), + }; + } + digest = extractImageDigest(errors); span.setAttributes({ @@ -835,7 +843,7 @@ async function buildAndPushSelfHostedImage( }); try { - await new Promise((res, rej) => { + const processCode = await new Promise((res, rej) => { pushProcess.stdout?.on("data", (data: Buffer) => { const text = data.toString(); @@ -849,9 +857,17 @@ async function buildAndPushSelfHostedImage( }); pushProcess.on("error", (e) => rej(e)); - pushProcess.on("close", () => res()); + pushProcess.on("close", (code) => res(code)); }); + if (processCode !== 0) { + return { + ok: false as const, + error: "Error pushing image", + logs: extractLogs(errors), + }; + } + span.end(); } catch (e) { recordSpanException(span, e); diff --git a/packages/cli-v3/src/workers/prod/backgroundWorker.ts b/packages/cli-v3/src/workers/prod/backgroundWorker.ts index 7c0dc8b8b8..dff2167144 100644 --- a/packages/cli-v3/src/workers/prod/backgroundWorker.ts +++ b/packages/cli-v3/src/workers/prod/backgroundWorker.ts @@ -267,9 +267,6 @@ export class ProdBackgroundWorker { const result = await taskRunProcess.executeTaskRun(payload); - // Kill the worker if the task was successful or if it's not going to be retried); - await taskRunProcess.cleanup(result.ok || result.retry === undefined); - if (result.ok) { return result; } diff --git a/packages/cli-v3/src/workers/prod/entry-point.ts b/packages/cli-v3/src/workers/prod/entry-point.ts index 2672d196b8..3ebe88bcbd 100644 --- a/packages/cli-v3/src/workers/prod/entry-point.ts +++ b/packages/cli-v3/src/workers/prod/entry-point.ts @@ -356,8 +356,6 @@ class ProdWorker { this.completed.add(executionPayload.execution.attempt.id); - await this.#backgroundWorker.flushTelemetry(); - const { willCheckpointAndRestore, shouldExit } = await this.#coordinatorSocket.socket.emitWithAck("TASK_RUN_COMPLETED", { version: "v1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e464f5c509..832b33b3bf 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -3071,6 +3071,9 @@ importers: stripe: specifier: ^12.14.0 version: 12.14.0 + yt-dlp-wrap: + specifier: ^2.3.12 + version: 2.3.12 devDependencies: '@trigger.dev/tsconfig': specifier: workspace:* @@ -33547,6 +33550,10 @@ packages: stacktracey: 2.1.8 dev: true + /yt-dlp-wrap@2.3.12: + resolution: {integrity: sha512-P8fJ+6M1YjukyJENCTviNLiZ8mokxprR54ho3DsSKPWDcac489OjRiStGEARJr6un6ETS6goTn4CWl/b/rM3aA==} + dev: false + /zod-error@1.5.0: resolution: {integrity: sha512-zzopKZ/skI9iXpqCEPj+iLCKl9b88E43ehcU+sbRoHuwGd9F1IDVGQ70TyO6kmfiRL1g4IXkjsXK+g1gLYl4WQ==} dependencies: diff --git a/references/v3-catalog/package.json b/references/v3-catalog/package.json index 40d7c7e908..fa2d50e68f 100644 --- a/references/v3-catalog/package.json +++ b/references/v3-catalog/package.json @@ -9,11 +9,12 @@ "@opentelemetry/api": "^1.8.0", "@sindresorhus/slugify": "^2.2.1", "@traceloop/instrumentation-openai": "^0.3.9", - "@trigger.dev/sdk": "workspace:^3.0.0-beta.0", "@trigger.dev/core": "workspace:^3.0.0-beta.0", + "@trigger.dev/sdk": "workspace:^3.0.0-beta.0", "msw": "^2.2.1", "openai": "^4.28.0", - "stripe": "^12.14.0" + "stripe": "^12.14.0", + "yt-dlp-wrap": "^2.3.12" }, "devDependencies": { "@trigger.dev/tsconfig": "workspace:*", diff --git a/references/v3-catalog/src/trigger/binaries.ts b/references/v3-catalog/src/trigger/binaries.ts new file mode 100644 index 0000000000..dcb025ad88 --- /dev/null +++ b/references/v3-catalog/src/trigger/binaries.ts @@ -0,0 +1,22 @@ +import { logger, task } from "@trigger.dev/sdk/v3"; +import { chmod } from "node:fs/promises"; +import YTDlpWrap from "yt-dlp-wrap"; + +export const ytDlp = task({ + id: "yt-dlp", + run: async () => { + const releaseArtifact = "yt-dlp_linux"; + const filePath = `./${releaseArtifact}`; + const fileURL = `https://github.com/yt-dlp/yt-dlp/releases/latest/download/${releaseArtifact}`; + + await YTDlpWrap.downloadFile(fileURL, filePath); + await chmod(filePath, "777"); + + logger.log("downloaded", { filePath, fileURL }); + + const ytDlpWrap = new YTDlpWrap(filePath); + const version = await ytDlpWrap.getVersion(); + + logger.log("version", { version }); + }, +});