Compare commits

..

2 Commits

Author SHA1 Message Date
2ad6431a28 Merge pull request 'refactor(ui,docs): Job terimini Test olarak güncelle' (#2) from deployment-dev into master
Reviewed-on: #2
2026-01-18 13:42:59 +00:00
0961751f4d refactor(ui,docs): Job terimini Test olarak güncelle
UI ve dokümantasyon boyunca "Job" terimleri "Test" olarak değiştirildi.
Bu değişiklik, uygulamanın terminolojisini tutarlı hale getirmek
ve kullanıcı arayüzünde daha doğru bir isimlendirme sağlamak için
yapıldı. Tüm etiketler, başlıklar, bildirimler ve dokümantasyon
güncellendi.
2026-01-18 16:42:36 +03:00
5 changed files with 40 additions and 40 deletions

View File

@@ -21,7 +21,7 @@
- **Korumalı Endpoint'ler**: JWT middleware ile korunan API endpoint'leri
- **Environment Security**: Hassas bilgilerin güvenli .env dosyasında saklanması
### 📊 Job Yönetim Sistemi
### 🧪 Test Yönetim Sistemi
- **Repository Otomasyonu**: Otomatik git clone/pull işlemleri
- **Zaman Tabanlı Çalıştırma**: Dakika/saat/gün bazında otomatik test çalıştırma
- **Real-time Durum Güncellemesi**: Socket.io ile anlık durum takibi
@@ -38,7 +38,7 @@
### ⚡ Gerçek Zamanlı İletişim
- **WebSocket Bağlantısı**: Socket.io ile sürekli iletişim
- **Sayaç Yayınınlaması**: Global sayaç ve işlemler
- **Canlı Güncellemeler**: Job durumlarının anlık bildirilmesi
- **Canlı Güncellemeler**: Test durumlarının anlık bildirilmesi
- **Ping/Pong**: Bağlantı kontrolü
### 🎨 Modern Arayüz
@@ -202,24 +202,24 @@ docker compose up -d --build
- **Şifre**: `supersecret`
3. Giriş yap butonuna tıklayın
### Job Yönetimi
### Test Yönetimi
#### Yeni Job Oluşturma
1. **Dashboard** menüsünden **Jobs** sayfasına gidin
2. **Yeni Job** butonuna tıklayın
3. Job bilgilerini girin:
- **Job Adı**: Tanımlayıcı bir isim
#### Yeni Test Oluşturma
1. **Dashboard** menüsünden **Tests** sayfasına gidin
2. **Yeni Test** butonuna tıklayın
3. Test bilgilerini girin:
- **Test Adı**: Tanımlayıcı bir isim
- **Repository URL**: GitHub repository adresi
- **Test Komutu**: Çalıştırılacak komut (örn: `npm test`)
- **Kontrol Aralığı**: Test sıklığı (dakika/saat/gün)
- **Kontrol Değeri**: Sayısal değer
4. Kaydet butonuna tıklayın
#### Job İzleme
- **Jobs Listesi**: Tüm job'ların durumunu gösterir
#### Test İzleme
- **Tests Listesi**: Tüm test'lerin durumunu gösterir
- **Real-time Durum**: Socket.io ile anlık güncellemeler
- **Log Akışı**: Test çıktılarını canlı izleme
- **Manuel Çalıştırma**: Job'u anında tetikleme
- **Manuel Çalıştırma**: Test'i anında tetikleme
### Deployment Yönetimi
1. **Deployments** sayfasına gidin
@@ -250,7 +250,7 @@ docker compose up -d --build
### 📖 API Referansı
- **Authentication API'leri**: `/auth/login`, `/auth/me`
- **Job Yönetim API'leri**: CRUD operasyonları, manuel çalıştırma
- **Test Yönetim API'leri**: CRUD operasyonları, manuel çalıştırma
- **Deployment API'leri**: `/deployments`, `/deployments/:id`, `/deployments/scan`, `/deployments/branches`
- **Webhook Endpoint**: `/api/deployments/webhook/:token`
- **WebSocket Olayları**: Real-time iletişim ve durum güncellemeleri
@@ -393,12 +393,12 @@ docker compose logs mongo
### Mevcut Durum (v1.0)
- ✅ Temel CI/CD platformu
- ✅ Real-time job yönetimi
- ✅ Real-time test yönetimi
- ✅ Modern web arayüzü
- ✅ Konteyner orkestrasyonu
### Gelecek Planlar
- 🔄 **Multi-branch Support**: Farklı branch'ler için job yönetimi
- 🔄 **Multi-branch Support**: Farklı branch'ler için test yönetimi
- 🔔 **Bildirim Sistemi**: E-posta ve Slack bildirimleri
- 📊 **Dashboard İstatistikleri**: Performans ve kullanım metrikleri
- 🛡️ **Güvenlik İyileştirmeleri**: 2FA ve rate limiting
@@ -406,7 +406,7 @@ docker compose logs mongo
- 📝 **Custom Test Commands**: Esnek test komutu yapılandırması
### E-post Listesi
- 📊 **Dashboard İstatistikleri**: Job performans grafikleri
- 📊 **Dashboard İstatistikleri**: Test performans grafikleri
- 🔔 **Bildirim Kanalları**: Slack, Discord, Teams entegrasyonu
- 🔄 **Pipeline Integration**: GitHub Actions, GitLab CI entegrasyonu
- 🏗️ **Template System**: Hazır proje şablonları

View File

@@ -22,7 +22,7 @@ export function DashboardLayout() {
const navigation = useMemo(
() => [
{ label: "Home", to: "/home", icon: faHouse },
{ label: "Jobs", to: "/jobs", icon: faFlaskVial },
{ label: "Tests", to: "/jobs", icon: faFlaskVial },
{ label: "Deployments", to: "/deployments", icon: faRocket },
{ label: "Settings", to: "/settings", icon: faGear }
],

View File

@@ -54,7 +54,7 @@ export function HomePage() {
recentRuns: [],
totals: { successRate: 0, totalRuns: 0 }
});
setError("Job metrikleri alınamadı");
setError("Test metrikleri alınamadı");
}
if (deployResult.status === "fulfilled") {

View File

@@ -79,7 +79,7 @@ export function JobDetailPage() {
checkUnit: data.job.checkUnit
});
})
.catch(() => setError("Job bulunamadı"))
.catch(() => setError("Test bulunamadı"))
.finally(() => setLoading(false));
}, [id]);
@@ -174,14 +174,14 @@ export function JobDetailPage() {
const handleDelete = async () => {
if (!job?._id) return;
const ok = window.confirm("Bu job'ı silmek istediğinize emin misiniz?");
const ok = window.confirm("Bu testi silmek istediğinize emin misiniz?");
if (!ok) return;
try {
await deleteJob(job._id);
toast.success("Job silindi");
toast.success("Test silindi");
navigate("/jobs", { replace: true });
} catch (err) {
toast.error("Job silinemedi");
toast.error("Test silinemedi");
}
};
@@ -203,7 +203,7 @@ export function JobDetailPage() {
return;
}
await updateJob(job._id, payload);
toast.success("Job güncellendi");
toast.success("Test güncellendi");
setJob((prev) =>
prev
? {
@@ -281,8 +281,8 @@ export function JobDetailPage() {
className="h-10 w-10 transition hover:bg-emerald-100"
onClick={handleEdit}
disabled={!job}
title="Job'ı düzenle"
aria-label="Job'ı düzenle"
title="Testi düzenle"
aria-label="Testi düzenle"
>
<FontAwesomeIcon icon={faPen} className="h-4 w-4 text-foreground" />
</Button>
@@ -292,8 +292,8 @@ export function JobDetailPage() {
className="h-10 w-10 transition hover:bg-red-100"
onClick={handleDelete}
disabled={!job}
title="Job'ı sil"
aria-label="Job'ı sil"
title="Testi sil"
aria-label="Testi sil"
>
<FontAwesomeIcon icon={faTrash} className="h-4 w-4 text-foreground" />
</Button>
@@ -317,7 +317,7 @@ export function JobDetailPage() {
</div>
)}
<div className="flex w-full items-center gap-2">
<CardTitle>{job?.name || "Job Detayı"}</CardTitle>
<CardTitle>{job?.name || "Test Detayı"}</CardTitle>
<span className="inline-flex items-center gap-2 rounded-full border border-border bg-muted/50 px-3 py-1 text-xs font-semibold text-foreground">
<FontAwesomeIcon icon={faRepeat} className="h-3.5 w-3.5 text-foreground/80" />
{runCount} test
@@ -368,7 +368,7 @@ export function JobDetailPage() {
<div className="w-full max-w-lg rounded-lg border border-border bg-card card-shadow">
<div className="flex items-center justify-between border-b border-border px-5 py-4">
<div className="space-y-1">
<div className="text-lg font-semibold text-foreground">Job Güncelle</div>
<div className="text-lg font-semibold text-foreground">Test Güncelle</div>
<div className="text-sm text-muted-foreground">Değişiklikler kaydedildiğinde test yeniden tetiklenecek.</div>
</div>
<Button variant="ghost" size="icon" onClick={() => setEditOpen(false)}>
@@ -377,7 +377,7 @@ export function JobDetailPage() {
</div>
<div className="space-y-4 px-5 py-4">
<div className="space-y-2">
<Label htmlFor="name">Job Name</Label>
<Label htmlFor="name">Test Name</Label>
<Input
id="name"
value={form.name}

View File

@@ -58,7 +58,7 @@ export function JobsPage() {
const data = await fetchJobs();
setJobs(data);
} catch (err) {
toast.error("Jobs alınamadı");
toast.error("Testler alınamadı");
} finally {
setLoading(false);
}
@@ -145,11 +145,11 @@ export function JobsPage() {
j._id === updated._id ? { ...updated, runCount: j.runCount ?? updated.runCount } : j
)
);
toast.success("Job güncellendi");
toast.success("Test güncellendi");
} else {
const created = await createJob(payload);
setJobs((prev) => [{ ...created, runCount: created.runCount ?? 0 }, ...prev]);
toast.success("Job oluşturuldu");
toast.success("Test oluşturuldu");
}
setModalOpen(false);
} catch (err) {
@@ -163,9 +163,9 @@ export function JobsPage() {
setRunningId(id);
try {
await runJob(id);
toast.success("Job çalıştırılıyor");
toast.success("Test çalıştırılıyor");
} catch {
toast.error("Job çalıştırılamadı");
toast.error("Test çalıştırılamadı");
} finally {
setRunningId(null);
}
@@ -185,18 +185,18 @@ export function JobsPage() {
<>
<div className="flex items-center justify-between gap-4">
<div>
<h2 className="text-xl font-semibold text-foreground">Jobs</h2>
<h2 className="text-xl font-semibold text-foreground">Tests</h2>
</div>
<Button onClick={handleOpenNew} className="gap-2">
<FontAwesomeIcon icon={faPlus} className="h-4 w-4" />
New Job
New Test
</Button>
</div>
<div className="grid gap-4">
{loading && (
<div className="rounded-md border border-border bg-muted/30 px-4 py-3 text-sm text-muted-foreground">
Jobs yükleniyor...
Testler yükleniyor...
</div>
)}
{!loading && jobs.length === 0 && (
@@ -280,9 +280,9 @@ export function JobsPage() {
<div className="w-full max-w-lg rounded-lg border border-border bg-card card-shadow">
<div className="flex items-center justify-between border-b border-border px-5 py-4">
<div className="space-y-1">
<div className="text-lg font-semibold text-foreground">{isEdit ? "Job Güncelle" : "Yeni Job"}</div>
<div className="text-lg font-semibold text-foreground">{isEdit ? "Test Güncelle" : "Yeni Test"}</div>
<div className="text-sm text-muted-foreground">
Detayları girin, Jobs listesi canlı olarak güncellenecek.
Detayları girin, Tests listesi canlı olarak güncellenecek.
</div>
</div>
<Button variant="ghost" size="icon" onClick={handleClose}>
@@ -291,7 +291,7 @@ export function JobsPage() {
</div>
<div className="space-y-4 px-5 py-4">
<div className="space-y-2">
<Label htmlFor="name">Job Name</Label>
<Label htmlFor="name">Test Name</Label>
<Input
id="name"
value={form.name}