feat(deployments): deployment restart özelliği ekle
Deployment projeleri için yeniden başlatma (restart) yeteneği eklendi. Backend servisi, API endpoint'i ve kullanıcı arayüzü butonları güncellendi.
This commit is contained in:
@@ -232,4 +232,18 @@ router.post("/:id/run", async (req, res) => {
|
||||
});
|
||||
});
|
||||
|
||||
router.post("/:id/restart", async (req, res) => {
|
||||
authMiddleware(req, res, async () => {
|
||||
const { id } = req.params;
|
||||
const project = await DeploymentProject.findById(id);
|
||||
if (!project) return res.status(404).json({ message: "Deployment bulunamadı" });
|
||||
const rawMessage = typeof req.body?.message === "string" ? req.body.message.trim() : "";
|
||||
const message = rawMessage || "restart";
|
||||
deploymentService
|
||||
.restartDeployment(id, { message })
|
||||
.catch(() => undefined);
|
||||
return res.json({ queued: true });
|
||||
});
|
||||
});
|
||||
|
||||
export default router;
|
||||
|
||||
@@ -706,6 +706,97 @@ class DeploymentService {
|
||||
}
|
||||
}
|
||||
|
||||
async restartDeployment(projectId: string, options?: { message?: string }) {
|
||||
if (this.running.get(projectId)) {
|
||||
return;
|
||||
}
|
||||
this.running.set(projectId, true);
|
||||
|
||||
const project = await DeploymentProject.findById(projectId);
|
||||
if (!project) {
|
||||
this.running.delete(projectId);
|
||||
return;
|
||||
}
|
||||
|
||||
const normalizedMessage = normalizeCommitMessage(options?.message);
|
||||
const startedAt = Date.now();
|
||||
const runLogs: string[] = [];
|
||||
const pushLog = (line: string) => {
|
||||
runLogs.push(line);
|
||||
this.emitLog(projectId, line);
|
||||
};
|
||||
|
||||
const runDoc = await DeploymentRun.create({
|
||||
project: projectId,
|
||||
status: "running",
|
||||
startedAt: new Date(),
|
||||
message: normalizedMessage ?? options?.message
|
||||
});
|
||||
this.emitRun(projectId, runDoc);
|
||||
await writeRunFile(project.rootPath, runDoc);
|
||||
|
||||
await DeploymentProject.findByIdAndUpdate(projectId, {
|
||||
lastStatus: "running",
|
||||
lastMessage: normalizedMessage ?? options?.message ?? "Restart başlıyor..."
|
||||
});
|
||||
await this.emitStatus(projectId, {
|
||||
lastStatus: "running",
|
||||
lastMessage: normalizedMessage ?? options?.message ?? "Restart başlıyor..."
|
||||
} as DeploymentProjectDocument);
|
||||
|
||||
try {
|
||||
pushLog("Restart komutları çalıştırılıyor...");
|
||||
await runCompose(project, (line) => pushLog(line));
|
||||
const duration = Date.now() - startedAt;
|
||||
await DeploymentProject.findByIdAndUpdate(projectId, {
|
||||
lastStatus: "success",
|
||||
lastDeployAt: new Date(),
|
||||
lastMessage: normalizedMessage ?? options?.message ?? "Restart başarılı"
|
||||
});
|
||||
await this.emitStatus(projectId, {
|
||||
lastStatus: "success",
|
||||
lastDeployAt: new Date(),
|
||||
lastMessage: normalizedMessage ?? options?.message ?? "Restart başarılı"
|
||||
} as DeploymentProjectDocument);
|
||||
await DeploymentRun.findByIdAndUpdate(runDoc._id, {
|
||||
status: "success",
|
||||
finishedAt: new Date(),
|
||||
durationMs: duration,
|
||||
logs: runLogs,
|
||||
message: normalizedMessage ?? options?.message
|
||||
});
|
||||
const updatedRun = await DeploymentRun.findById(runDoc._id);
|
||||
if (updatedRun) this.emitRun(projectId, updatedRun);
|
||||
if (updatedRun) await writeRunFile(project.rootPath, updatedRun);
|
||||
pushLog("Restart tamamlandı: Başarılı");
|
||||
} catch (err) {
|
||||
const duration = Date.now() - startedAt;
|
||||
await DeploymentProject.findByIdAndUpdate(projectId, {
|
||||
lastStatus: "failed",
|
||||
lastDeployAt: new Date(),
|
||||
lastMessage: (err as Error).message
|
||||
});
|
||||
await this.emitStatus(projectId, {
|
||||
lastStatus: "failed",
|
||||
lastDeployAt: new Date(),
|
||||
lastMessage: (err as Error).message
|
||||
} as DeploymentProjectDocument);
|
||||
await DeploymentRun.findByIdAndUpdate(runDoc._id, {
|
||||
status: "failed",
|
||||
finishedAt: new Date(),
|
||||
durationMs: duration,
|
||||
logs: runLogs,
|
||||
message: normalizedMessage ?? options?.message
|
||||
});
|
||||
const updatedRun = await DeploymentRun.findById(runDoc._id);
|
||||
if (updatedRun) this.emitRun(projectId, updatedRun);
|
||||
if (updatedRun) await writeRunFile(project.rootPath, updatedRun);
|
||||
pushLog(`Hata: ${(err as Error).message}`);
|
||||
} finally {
|
||||
this.running.delete(projectId);
|
||||
}
|
||||
}
|
||||
|
||||
async cleanupProjectResources(project: DeploymentProjectDocument) {
|
||||
const composePath = path.join(project.rootPath, project.composeFile);
|
||||
if (!fs.existsSync(composePath)) {
|
||||
|
||||
Reference in New Issue
Block a user