Skip to content

Commit 0f77809

Browse files
authored
Merge branch 'main' into docs/sentry-fix
2 parents f2edd88 + 63a221a commit 0f77809

File tree

118 files changed

+4509
-815
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

118 files changed

+4509
-815
lines changed

.changeset/four-needles-add.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
---
2+
"@trigger.dev/redis-worker": major
3+
"@trigger.dev/react-hooks": major
4+
"@trigger.dev/sdk": major
5+
"trigger.dev": major
6+
"@trigger.dev/python": major
7+
"@trigger.dev/build": major
8+
"@trigger.dev/core": major
9+
"@trigger.dev/rsc": major
10+
---
11+
12+
Trigger.dev v4 release. Please see our upgrade to v4 docs to view the full changelog: https://trigger.dev/docs/upgrade-to-v4

.changeset/nice-colts-boil.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"trigger.dev": patch
3+
---
4+
5+
Improve warm start times by eagerly creating the child TaskRunProcess when a previous run as completed

.changeset/pre.json

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
{
2+
"mode": "pre",
3+
"tag": "v4-beta",
4+
"initialVersions": {
5+
"coordinator": "0.0.1",
6+
"docker-provider": "0.0.1",
7+
"kubernetes-provider": "0.0.1",
8+
"supervisor": "0.0.1",
9+
"webapp": "1.0.0",
10+
"@trigger.dev/build": "3.3.17",
11+
"trigger.dev": "3.3.17",
12+
"@trigger.dev/core": "3.3.17",
13+
"@trigger.dev/python": "3.3.17",
14+
"@trigger.dev/react-hooks": "3.3.17",
15+
"@trigger.dev/redis-worker": "3.3.17",
16+
"@trigger.dev/rsc": "3.3.17",
17+
"@trigger.dev/sdk": "3.3.17"
18+
},
19+
"changesets": [
20+
"breezy-turtles-talk",
21+
"four-needles-add",
22+
"honest-files-decide",
23+
"nice-colts-boil",
24+
"red-wasps-cover",
25+
"smart-coins-hammer",
26+
"weak-jobs-hide"
27+
]
28+
}

.github/workflows/publish-worker-re2.yml

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,16 @@ permissions:
1818
contents: read
1919

2020
jobs:
21-
check-branch:
22-
runs-on: ubuntu-latest
23-
steps:
24-
- name: Fail if re2-prod-* is pushed from a non-main branch
25-
if: startsWith(github.ref_name, 're2-prod-') && github.base_ref != 'main'
26-
run: |
27-
echo "🚫 re2-prod-* tags can only be pushed from the main branch."
28-
exit 1
21+
# check-branch:
22+
# runs-on: ubuntu-latest
23+
# steps:
24+
# - name: Fail if re2-prod-* is pushed from a non-main branch
25+
# if: startsWith(github.ref_name, 're2-prod-') && github.base_ref != 'main'
26+
# run: |
27+
# echo "🚫 re2-prod-* tags can only be pushed from the main branch."
28+
# exit 1
2929
build:
30-
needs: check-branch
30+
# needs: check-branch
3131
strategy:
3232
matrix:
3333
package: [supervisor]

.vscode/launch.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@
138138
"type": "node-terminal",
139139
"request": "launch",
140140
"name": "Debug RunEngine tests",
141-
"command": "pnpm run test ./src/engine/tests/releaseConcurrencyQueue.test.ts -t 'Should manage token bucket and queue correctly'",
141+
"command": "pnpm run test ./src/engine/tests/releaseConcurrencyTokenBucketQueue.test.ts -t 'Should retrieve metrics for all queues via getQueueMetrics'",
142142
"cwd": "${workspaceFolder}/internal-packages/run-engine",
143143
"sourceMaps": true
144144
},

apps/supervisor/src/env.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ const Env = z.object({
3131
// Dequeue settings (provider mode)
3232
TRIGGER_DEQUEUE_ENABLED: BoolEnv.default("true"),
3333
TRIGGER_DEQUEUE_INTERVAL_MS: z.coerce.number().int().default(1000),
34+
TRIGGER_DEQUEUE_MAX_RUN_COUNT: z.coerce.number().int().default(10),
3435

3536
// Optional services
3637
TRIGGER_WARM_START_URL: z.string().optional(),
@@ -50,6 +51,7 @@ const Env = z.object({
5051
// Kubernetes specific settings
5152
KUBERNETES_FORCE_ENABLED: BoolEnv.default(false),
5253
KUBERNETES_NAMESPACE: z.string().default("default"),
54+
KUBERNETES_WORKER_NODETYPE_LABEL: z.string().default("v4-worker"),
5355
EPHEMERAL_STORAGE_SIZE_LIMIT: z.string().default("10Gi"),
5456
EPHEMERAL_STORAGE_SIZE_REQUEST: z.string().default("2Gi"),
5557

apps/supervisor/src/index.ts

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,10 @@ class ManagedSupervisor {
9999
this.logger.warn("[ManagedWorker] Failed pod handler disabled");
100100
}
101101

102-
this.resourceMonitor = new KubernetesResourceMonitor(createK8sApi(), "");
102+
this.resourceMonitor = new KubernetesResourceMonitor(
103+
createK8sApi(),
104+
env.TRIGGER_WORKER_INSTANCE_NAME
105+
);
103106
this.workloadManager = new KubernetesWorkloadManager(workloadManagerOptions);
104107
} else {
105108
this.resourceMonitor = new DockerResourceMonitor(new Docker());
@@ -113,10 +116,11 @@ class ManagedSupervisor {
113116
managedWorkerSecret: env.MANAGED_WORKER_SECRET,
114117
dequeueIntervalMs: env.TRIGGER_DEQUEUE_INTERVAL_MS,
115118
queueConsumerEnabled: env.TRIGGER_DEQUEUE_ENABLED,
119+
maxRunCount: env.TRIGGER_DEQUEUE_MAX_RUN_COUNT,
116120
runNotificationsEnabled: env.TRIGGER_WORKLOAD_API_ENABLED,
117121
preDequeue: async () => {
118122
if (this.isKubernetes) {
119-
// TODO: Test k8s resource monitor and remove this
123+
// Not used in k8s for now
120124
return {};
121125
}
122126

@@ -220,6 +224,7 @@ class ManagedSupervisor {
220224

221225
try {
222226
await this.workloadManager.create({
227+
dequeuedAt: message.dequeuedAt,
223228
envId: message.environment.id,
224229
envType: message.environment.type,
225230
image: message.image,
@@ -234,10 +239,11 @@ class ManagedSupervisor {
234239
snapshotFriendlyId: message.snapshot.friendlyId,
235240
});
236241

237-
this.resourceMonitor.blockResources({
238-
cpu: message.run.machine.cpu,
239-
memory: message.run.machine.memory,
240-
});
242+
// Disabled for now
243+
// this.resourceMonitor.blockResources({
244+
// cpu: message.run.machine.cpu,
245+
// memory: message.run.machine.memory,
246+
// });
241247
} catch (error) {
242248
this.logger.error("[ManagedWorker] Failed to create workload", { error });
243249
}

apps/supervisor/src/util.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,13 @@ export function getDockerHostDomain() {
44

55
return isMacOs || isWindows ? "host.docker.internal" : "localhost";
66
}
7+
8+
export function getRunnerId(runId: string, attemptNumber?: number) {
9+
const parts = ["runner", runId.replace("run_", "")];
10+
11+
if (attemptNumber && attemptNumber > 1) {
12+
parts.push(`attempt-${attemptNumber}`);
13+
}
14+
15+
return parts.join("-");
16+
}

apps/supervisor/src/workloadManager/docker.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
import { SimpleStructuredLogger } from "@trigger.dev/core/v3/utils/structuredLogger";
2-
import { RunnerId } from "@trigger.dev/core/v3/isomorphic";
32
import {
43
type WorkloadManager,
54
type WorkloadManagerCreateOptions,
65
type WorkloadManagerOptions,
76
} from "./types.js";
87
import { x } from "tinyexec";
98
import { env } from "../env.js";
10-
import { getDockerHostDomain } from "../util.js";
9+
import { getDockerHostDomain, getRunnerId } from "../util.js";
1110

1211
export class DockerWorkloadManager implements WorkloadManager {
1312
private readonly logger = new SimpleStructuredLogger("docker-workload-provider");
@@ -23,11 +22,14 @@ export class DockerWorkloadManager implements WorkloadManager {
2322
async create(opts: WorkloadManagerCreateOptions) {
2423
this.logger.log("[DockerWorkloadProvider] Creating container", { opts });
2524

26-
const runnerId = RunnerId.generate();
25+
const runnerId = getRunnerId(opts.runFriendlyId, opts.nextAttemptNumber);
26+
2727
const runArgs = [
2828
"run",
2929
"--detach",
3030
`--network=${env.DOCKER_NETWORK}`,
31+
`--env=TRIGGER_DEQUEUED_AT_MS=${opts.dequeuedAt.getTime()}`,
32+
`--env=TRIGGER_POD_SCHEDULED_AT_MS=${Date.now()}`,
3133
`--env=TRIGGER_ENV_ID=${opts.envId}`,
3234
`--env=TRIGGER_RUN_ID=${opts.runFriendlyId}`,
3335
`--env=TRIGGER_SNAPSHOT_ID=${opts.snapshotFriendlyId}`,

apps/supervisor/src/workloadManager/kubernetes.ts

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@ import {
44
type WorkloadManagerCreateOptions,
55
type WorkloadManagerOptions,
66
} from "./types.js";
7-
import { RunnerId } from "@trigger.dev/core/v3/isomorphic";
87
import type { EnvironmentType, MachinePreset } from "@trigger.dev/core/v3";
98
import { env } from "../env.js";
109
import { type K8sApi, createK8sApi, type k8s } from "../clients/kubernetes.js";
10+
import { getRunnerId } from "../util.js";
1111

1212
type ResourceQuantities = {
1313
[K in "cpu" | "memory" | "ephemeral-storage"]?: string;
@@ -31,7 +31,7 @@ export class KubernetesWorkloadManager implements WorkloadManager {
3131
async create(opts: WorkloadManagerCreateOptions) {
3232
this.logger.log("[KubernetesWorkloadManager] Creating container", { opts });
3333

34-
const runnerId = RunnerId.generate().replace(/_/g, "-");
34+
const runnerId = getRunnerId(opts.runFriendlyId, opts.nextAttemptNumber);
3535

3636
try {
3737
await this.k8s.core.createNamespacedPod({
@@ -61,6 +61,14 @@ export class KubernetesWorkloadManager implements WorkloadManager {
6161
],
6262
resources: this.#getResourcesForMachine(opts.machine),
6363
env: [
64+
{
65+
name: "TRIGGER_DEQUEUED_AT_MS",
66+
value: opts.dequeuedAt.getTime().toString(),
67+
},
68+
{
69+
name: "TRIGGER_POD_SCHEDULED_AT_MS",
70+
value: Date.now().toString(),
71+
},
6472
{
6573
name: "TRIGGER_RUN_ID",
6674
value: opts.runFriendlyId,
@@ -97,7 +105,11 @@ export class KubernetesWorkloadManager implements WorkloadManager {
97105
},
98106
{
99107
name: "TRIGGER_WORKER_INSTANCE_NAME",
100-
value: env.TRIGGER_WORKER_INSTANCE_NAME,
108+
valueFrom: {
109+
fieldRef: {
110+
fieldPath: "spec.nodeName",
111+
},
112+
},
101113
},
102114
{
103115
name: "OTEL_EXPORTER_OTLP_ENDPOINT",
@@ -217,7 +229,7 @@ export class KubernetesWorkloadManager implements WorkloadManager {
217229
automountServiceAccountToken: false,
218230
imagePullSecrets: this.getImagePullSecrets(),
219231
nodeSelector: {
220-
nodetype: "worker-re2",
232+
nodetype: env.KUBERNETES_WORKER_NODETYPE_LABEL,
221233
},
222234
};
223235
}

0 commit comments

Comments
 (0)