Skip to content

Commit b2cdc64

Browse files
committed
fix: inject environment variables at dequeue time for self-hosted deployments
This commit fixes the issue where environment variables configured in the Trigger.dev portal were not being injected into runner pods/containers in self-hosted deployments (GitHub issue #2792). Root Cause: Environment variables were only being fetched during the 'startRunAttempt' phase, which occurs AFTER the runner pod/container has already been created. This meant that pods were created without access to portal-configured environment variables, causing tasks to fail immediately. Solution: Move environment variable fetching from the 'startRunAttempt' phase to the 'dequeue' phase, so that env vars are available when the supervisor creates the runner workload. Changes: 1. Added optional 'envVars' field to DequeuedMessage schema 2. Modified AuthenticatedWorkerInstance.dequeue() to fetch and include environment variables for each dequeued message 3. Added 'envVars' field to WorkloadManagerCreateOptions interface 4. Updated supervisor to pass envVars when creating workloads 5. Modified KubernetesWorkloadManager to inject envVars into pod spec 6. Modified DockerWorkloadManager to inject envVars into container Testing: - Tested in self-hosted Kubernetes deployment (EKS) - Verified environment variables appear in runner pods - Confirmed tasks execute successfully with portal-configured env vars Fixes #2792
1 parent ff80742 commit b2cdc64

File tree

6 files changed

+48
-1
lines changed

6 files changed

+48
-1
lines changed

apps/supervisor/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,7 @@ class ManagedSupervisor {
267267
snapshotId: message.snapshot.id,
268268
snapshotFriendlyId: message.snapshot.friendlyId,
269269
placementTags: message.placementTags,
270+
envVars: message.envVars,
270271
});
271272

272273
// Disabled for now

apps/supervisor/src/workloadManager/docker.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,12 @@ export class DockerWorkloadManager implements WorkloadManager {
110110
});
111111
}
112112

113+
if (opts.envVars) {
114+
Object.entries(opts.envVars).forEach(([key, value]) => {
115+
envVars.push(`${key}=${value}`);
116+
});
117+
}
118+
113119
const hostConfig: Docker.HostConfig = {
114120
AutoRemove: !!this.opts.dockerAutoremove,
115121
};

apps/supervisor/src/workloadManager/kubernetes.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,12 @@ export class KubernetesWorkloadManager implements WorkloadManager {
225225
value: value,
226226
}))
227227
: []),
228+
...(opts.envVars
229+
? Object.entries(opts.envVars).map(([key, value]) => ({
230+
name: key,
231+
value: value,
232+
}))
233+
: []),
228234
],
229235
},
230236
],

apps/supervisor/src/workloadManager/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ export interface WorkloadManagerCreateOptions {
2424
nextAttemptNumber?: number;
2525
dequeuedAt: Date;
2626
placementTags?: PlacementTag[];
27+
envVars?: Record<string, string>;
2728
// identifiers
2829
envId: string;
2930
envType: EnvironmentType;

apps/webapp/app/v3/services/worker/workerGroupTokenService.server.ts

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -370,12 +370,44 @@ export class AuthenticatedWorkerInstance extends WithRunEngine {
370370
}
371371

372372
async dequeue({ runnerId }: { runnerId?: string }): Promise<DequeuedMessage[]> {
373-
return await this._engine.dequeueFromWorkerQueue({
373+
const messages = await this._engine.dequeueFromWorkerQueue({
374374
consumerId: this.workerInstanceId,
375375
workerQueue: this.masterQueue,
376376
workerId: this.workerInstanceId,
377377
runnerId,
378378
});
379+
380+
// Fetch and inject environment variables for each message
381+
const messagesWithEnvVars = await Promise.all(
382+
messages.map(async (message) => {
383+
const defaultMachinePreset = machinePresetFromName(defaultMachine);
384+
385+
const environment = await this._prisma.runtimeEnvironment.findFirst({
386+
where: {
387+
id: message.environment.id,
388+
},
389+
include: {
390+
parentEnvironment: true,
391+
},
392+
});
393+
394+
const envVars = environment
395+
? await this.getEnvVars(
396+
environment,
397+
message.run.id,
398+
message.run.machine ?? defaultMachinePreset,
399+
environment.parentEnvironment ?? undefined
400+
)
401+
: {};
402+
403+
return {
404+
...message,
405+
envVars,
406+
};
407+
})
408+
);
409+
410+
return messagesWithEnvVars;
379411
}
380412

381413
async heartbeatWorkerInstance() {

packages/core/src/v3/schemas/runEngine.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -270,5 +270,6 @@ export const DequeuedMessage = z.object({
270270
id: z.string(),
271271
}),
272272
placementTags: z.array(PlacementTag).optional(),
273+
envVars: z.record(z.string()).optional(),
273274
});
274275
export type DequeuedMessage = z.infer<typeof DequeuedMessage>;

0 commit comments

Comments
 (0)