Skip to content

Commit 66fef16

Browse files
fix: sync declarative schedules on deployment rollback
When rolling back a deployment via ChangeCurrentDeploymentService, declarative schedules were not being synced to match the rolled-back deployment's worker metadata. This caused schedules to remain as configured by the most recent deployment instead of reflecting the target deployment's schedule configuration. The fix adds a call to syncDeclarativeSchedules after the deployment promotion is updated, using the target deployment's worker metadata to restore the correct schedule state. Co-Authored-By: nick <55853254+nicktrn@users.noreply.github.com>
1 parent 1a7943c commit 66fef16

1 file changed

Lines changed: 58 additions & 9 deletions

File tree

apps/webapp/app/v3/services/changeCurrentDeployment.server.ts

Lines changed: 58 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1-
import { tryCatch } from "@trigger.dev/core/v3";
1+
import { BackgroundWorkerMetadata, tryCatch } from "@trigger.dev/core/v3";
22
import { CURRENT_DEPLOYMENT_LABEL } from "@trigger.dev/core/v3/isomorphic";
33
import { WorkerDeployment } from "@trigger.dev/database";
44
import { logger } from "~/services/logger.server";
55
import { syncTaskIdentifiers } from "~/services/taskIdentifierRegistry.server";
66
import { BaseService, ServiceValidationError } from "./baseService.server";
7+
import { syncDeclarativeSchedules } from "./createBackgroundWorker.server";
78
import { ExecuteTasksWaitingForDeployService } from "./executeTasksWaitingForDeploy";
89
import { compareDeploymentVersions } from "../utils/deploymentVersions";
910

@@ -53,10 +54,8 @@ export class ChangeCurrentDeploymentService extends BaseService {
5354
switch (direction) {
5455
case "promote": {
5556
if (
56-
compareDeploymentVersions(
57-
currentPromotion.deployment.version,
58-
deployment.version
59-
) >= 0
57+
compareDeploymentVersions(currentPromotion.deployment.version, deployment.version) >=
58+
0
6059
) {
6160
throw new ServiceValidationError(
6261
"Cannot promote a deployment that is older than the current deployment."
@@ -66,10 +65,8 @@ export class ChangeCurrentDeploymentService extends BaseService {
6665
}
6766
case "rollback": {
6867
if (
69-
compareDeploymentVersions(
70-
currentPromotion.deployment.version,
71-
deployment.version
72-
) <= 0
68+
compareDeploymentVersions(currentPromotion.deployment.version, deployment.version) <=
69+
0
7370
) {
7471
throw new ServiceValidationError(
7572
"Cannot rollback to a deployment that is newer than the current deployment."
@@ -118,6 +115,58 @@ export class ChangeCurrentDeploymentService extends BaseService {
118115
logger.error("Error syncing task identifiers on deployment change", { error: syncError });
119116
}
120117

118+
const [scheduleSyncError] = await tryCatch(this.#syncSchedulesForDeployment(deployment));
119+
120+
if (scheduleSyncError) {
121+
logger.error("Error syncing declarative schedules on deployment change", {
122+
error: scheduleSyncError,
123+
});
124+
}
125+
121126
await ExecuteTasksWaitingForDeployService.enqueue(deployment.workerId);
122127
}
128+
129+
async #syncSchedulesForDeployment(deployment: WorkerDeployment) {
130+
const worker = await this._prisma.backgroundWorker.findFirst({
131+
where: { id: deployment.workerId! },
132+
});
133+
134+
if (!worker) {
135+
logger.error("Worker not found for deployment schedule sync", {
136+
deploymentId: deployment.id,
137+
workerId: deployment.workerId,
138+
});
139+
return;
140+
}
141+
142+
const parsed = BackgroundWorkerMetadata.safeParse(worker.metadata);
143+
144+
if (!parsed.success) {
145+
logger.error("Failed to parse worker metadata for schedule sync", {
146+
deploymentId: deployment.id,
147+
workerId: deployment.workerId,
148+
error: parsed.error,
149+
});
150+
return;
151+
}
152+
153+
const environment = await this._prisma.runtimeEnvironment.findFirst({
154+
where: { id: deployment.environmentId },
155+
include: {
156+
project: true,
157+
organization: true,
158+
orgMember: true,
159+
},
160+
});
161+
162+
if (!environment) {
163+
logger.error("Environment not found for deployment schedule sync", {
164+
deploymentId: deployment.id,
165+
environmentId: deployment.environmentId,
166+
});
167+
return;
168+
}
169+
170+
await syncDeclarativeSchedules(parsed.data.tasks, worker, environment, this._prisma);
171+
}
123172
}

0 commit comments

Comments
 (0)