This commit is contained in:
2025-11-27 13:04:34 +03:00
parent 945c0e7a76
commit 6cc4f8fbb6
19 changed files with 362 additions and 69 deletions

View File

@@ -3,6 +3,7 @@ import path from "path";
import { spawn } from "child_process";
import { Server } from "socket.io";
import { Job, JobDocument, TimeUnit } from "../models/job.js";
import { JobRun } from "../models/jobRun.js";
const repoBaseDir = path.join(process.cwd(), "test-runs");
@@ -107,6 +108,8 @@ class JobService {
private emitLog(jobId: string, line: string) {
if (!this.io) return;
this.io.to(`job:${jobId}`).emit("job:log", { jobId, line });
// İlk koşu sırasında detay ekranı henüz subscribe olmamış olabilir; bu nedenle log'u yayına da gönder.
this.io.except(`job:${jobId}`).emit("job:log", { jobId, line });
}
async runJob(jobId: string) {
@@ -114,15 +117,27 @@ class JobService {
if (!job) return;
const startedAt = Date.now();
const runLogs: string[] = [];
const pushLog = (line: string) => {
runLogs.push(line);
this.emitLog(jobId, line);
};
const runDoc = await JobRun.create({
job: jobId,
status: "running",
startedAt: new Date()
});
await Job.findByIdAndUpdate(jobId, { status: "running", lastMessage: "Çalıştırılıyor..." });
this.emitStatus(jobId, { status: "running", lastMessage: "Çalıştırılıyor..." } as JobDocument);
try {
const repoDir = await cloneOrPull(job, (line) => this.emitLog(jobId, line));
await ensureDependencies(repoDir, (line) => this.emitLog(jobId, line));
this.emitLog(jobId, `Test komutu çalıştırılıyor: ${job.testCommand}`);
await runCommand(job.testCommand, repoDir, (line) => this.emitLog(jobId, line));
this.emitLog(jobId, "Test tamamlandı: Başarılı");
const repoDir = await cloneOrPull(job, (line) => pushLog(line));
await ensureDependencies(repoDir, (line) => pushLog(line));
pushLog(`Test komutu çalıştırılıyor: ${job.testCommand}`);
await runCommand(job.testCommand, repoDir, (line) => pushLog(line));
pushLog("Test tamamlandı: Başarılı");
const duration = Date.now() - startedAt;
await Job.findByIdAndUpdate(jobId, {
status: "success",
@@ -130,6 +145,12 @@ class JobService {
lastDurationMs: duration,
lastMessage: "Başarılı"
});
await JobRun.findByIdAndUpdate(runDoc._id, {
status: "success",
finishedAt: new Date(),
durationMs: duration,
logs: runLogs
});
this.emitStatus(jobId, {
status: "success",
lastRunAt: new Date(),
@@ -144,7 +165,13 @@ class JobService {
lastDurationMs: duration,
lastMessage: (err as Error).message
});
this.emitLog(jobId, `Hata: ${(err as Error).message}`);
await JobRun.findByIdAndUpdate(runDoc._id, {
status: "failed",
finishedAt: new Date(),
durationMs: duration,
logs: runLogs
});
pushLog(`Hata: ${(err as Error).message}`);
this.emitStatus(jobId, {
status: "failed",
lastRunAt: new Date(),