diff --git a/packages/server/src/services/deployment.ts b/packages/server/src/services/deployment.ts index 18577a861..fd61fc106 100644 --- a/packages/server/src/services/deployment.ts +++ b/packages/server/src/services/deployment.ts @@ -453,6 +453,19 @@ export const createDeploymentSchedule = async ( schedule.compose?.serverId || schedule.server?.serverId; await removeLastTenDeployments(deployment.scheduleId, "schedule", serverId); + await db + .update(deployments) + .set({ + status: "error", + errorMessage: "Superseded by a new run of this schedule.", + finishedAt: new Date().toISOString(), + }) + .where( + and( + eq(deployments.scheduleId, deployment.scheduleId), + eq(deployments.status, "running"), + ), + ); try { const { SCHEDULES_PATH } = paths(!!serverId); const formattedDateTime = format(new Date(), "yyyy-MM-dd:HH:mm:ss"); diff --git a/packages/server/src/utils/startup/cancel-deployments.ts b/packages/server/src/utils/startup/cancel-deployments.ts index 34766c187..8f1272f43 100644 --- a/packages/server/src/utils/startup/cancel-deployments.ts +++ b/packages/server/src/utils/startup/cancel-deployments.ts @@ -1,4 +1,9 @@ -import { applications, compose, deployments } from "@dokploy/server/db/schema"; +import { + applications, + compose, + deployments, + schedules, +} from "@dokploy/server/db/schema"; import { eq, inArray } from "drizzle-orm"; import { db } from "../../db/index"; @@ -6,15 +11,37 @@ export const initCancelDeployments = async () => { try { console.log("Setting up cancel deployments...."); + const runningDeployments = await db + .select({ + deploymentId: deployments.deploymentId, + scheduleId: deployments.scheduleId, + scheduleType: schedules.scheduleType, + }) + .from(deployments) + .leftJoin(schedules, eq(deployments.scheduleId, schedules.scheduleId)) + .where(eq(deployments.status, "running")); + + const deploymentIdsToCancel = runningDeployments + .filter( + (deployment) => + !deployment.scheduleId || + deployment.scheduleType === "dokploy-server", + ) + .map((deployment) => deployment.deploymentId); + + if (deploymentIdsToCancel.length === 0) { + console.log("Cancelled 0 deployments"); + return; + } + const result = await db .update(deployments) .set({ status: "cancelled", }) - .where(eq(deployments.status, "running")) + .where(inArray(deployments.deploymentId, deploymentIdsToCancel)) .returning(); - // Reset the related services so they don't stay stuck in "running". const applicationIds = [ ...new Set( result