libredb-websiteprojesinin geliştirme araç zinciri (toolchain) ve kalite kapıları (quality gates) referansı. Hangi kütüphane neden kuruldu, nasıl konfigüre edildi ve hangi aşamada çalıştığını açıklar.
Bu site Astro ile üretilen, GitHub Pages'e deploy edilen statik bir sitedir. Sunucu çalışma zamanı (runtime) yoktur — bütün çıktı build sırasında HTML/CSS/JS olarak üretilir. Araç zinciri buna göre seçilmiştir: hızlı, statik analize dayalı, runtime maliyeti olmayan araçlar.
| Öğe | Değer | Dosya |
|---|---|---|
| Paket yöneticisi & test runner | Bun | bunfig.toml, bun.lock |
| Sabitlenen sürüm | 1.3.14 |
.bun-version |
Neden Bun?
- Tek araçta paket yöneticisi + test runner + script çalıştırıcı.
bun testiçin ayrı bir test framework'ü (Vitest/Jest) kurmaya gerek kalmıyor. - CI'da
oven-sh/setup-bunile.bun-versiondosyasından okunarak yerel ve CI ortamı birebir aynı Bun sürümünü kullanır (deterministik).
Nasıl konfigüre edildi — bunfig.toml:
[install]
exact = trueexact = true, bun add ile eklenen her bağımlılığı caret (^) aralığı
olmadan, tam sürümle kaydeder. Böylece bir bağımlılık sessizce yeni bir
minor sürüme "kayamaz". package.json içindeki tüm sürümler bu nedenle tam
sabitlenmiştir (astro: 7.0.3, oxlint: 1.71.0 …). Sürüm yükseltmeleri
yalnızca Dependabot üzerinden, açıkça PR olarak gelir.
Reprodüklenebilir kurulum: CI hem
ci.ymlhemdeploy.ymliçindebun install --frozen-lockfilekullanır —bun.lockile birebir uyumsuz bir kurulum varsa build başarısız olur.
package.json > dependencies (yalnızca build çıktısında rol alanlar):
| Paket | Sürüm | Rolü |
|---|---|---|
astro |
7.0.3 | Statik site üreteci (SSG) |
@astrojs/sitemap |
3.7.3 | sitemap-index.xml otomatik üretimi |
tailwindcss + @tailwindcss/vite |
4.3.1 | Stil; Tailwind v4 Vite eklentisi olarak çalışır |
@libredb/libredb |
0.1.3 | /playground OPFS editörünün kullandığı LibreDB istemcisi |
Astro konfigürasyonu — astro.config.mjs:
site: 'https://libredb.org'→ sitemap ve kanonik URL üretimi için zorunlu.redirects: { '/databases': '/providers' }→ eski URL'in kalıcı yönlendirmesi.integrations: [sitemap(...)]→ her build'delastmoddamgalı sitemap.vite.plugins: [tailwindcss()]→ Tailwind v4 artık PostCSS yerine Vite eklentisi olarak entegre (v4'ün önerdiği yol).build.assets: 'assets'→ üretilen statik varlıklarassets/altına yazılır.
İlk satırdaki // @ts-check, bu yapılandırma dosyasının da tip kontrolünden
geçmesini sağlar.
Projedeki merkezi sözleşme package.json içindeki gate script'idir:
"gate": "bun run typecheck && bun run format && bun run lint && bun run knip && bun run test"Beş aşamadan herhangi biri başarısız olursa zincir durur (&&). Aynı komut
hem yerel pre-push hook'unda hem CI'da çalışır — yani "bende geçiyordu" durumu
oluşmaz. Aşağıda her aşama tek tek:
- Araç:
@astrojs/check(0.9.9) +typescript(6.0.3) - Ne yapar:
.astrobileşenleri dahil tüm projede tip kontrolü. - Konfig —
tsconfig.json:astro/tsconfigs/strict→strict+ Astro'ya özgü ek katılıklar.types: ["bun"]→*.test.tsdosyalarındakibun:testimportları ve@types/bunüzerinden gelen Node global'leri tanınır. (Astro'nun kendi ambient tipleri.astro/types.d.tstriple-slash ile yüklenir;typesdizisi bunu kapatmaz, bu yüzden ayrıca eklemeye gerek yok.)
- Araç:
prettier(3.9.0) +prettier-plugin-astro+prettier-plugin-tailwindcss - Ne yapar: Biçim tutarlılığını kontrol eder (yazmaz). Düzeltmek için
bun run format:fix. - Konfig —
.prettierrc.json:singleQuote: true,printWidth: 120.prettier-plugin-astro→.astrodosyalarını biçimlendirir.prettier-plugin-tailwindcss→ Tailwind sınıflarını kanonik sıraya dizer;tailwindStylesheet: "./src/styles/global.css"ile v4 sınıf sırasını okur.
.prettierignore:dist,.astro,node_modules,bun.lock,public(verbatim sunulan statik varlıklar),docs(HTML mockup + plan dosyaları) vesrc/data/docker-compose.example.yml(sync adımıyla çakışmaması için).
- Araç:
oxlint(1.71.0) — Rust ile yazılmış, ESLint'e göre çok hızlı linter. - Neden ESLint değil: Statik bir sitede ESLint'in ağır plugin ekosistemine ihtiyaç yok; oxlint kurulum/çalışma maliyeti neredeyse sıfır ve tek binary.
- Konfig —
.oxlintrc.json:Stil kategorileri kapalı çünkü biçim Prettier'ın sorumluluğunda — iki araç aynı konuda çatışmasın diye sınırlar net çizilmiş.{ "plugins": ["typescript", "oxc"], "categories": { "correctness": "error", // gerçek hatalar → build'i durdurur "suspicious": "warn", "perf": "off", "pedantic": "off", "style": "off" // stil Prettier'ın işi }, "rules": { "no-underscore-dangle": "off" }, "ignorePatterns": ["dist/**", ".astro/**", "node_modules/**", "public/**"] }
- Araç:
knip(6.22.0) - Ne yapar: Kullanılmayan dosya, export ve
package.jsonbağımlılıklarını bulur. Bağımlılık şişmesini (dependency bloat) önler. - Konfig —
knip.json:secretlint preset'i yalnızca{ "ignoreDependencies": ["@secretlint/secretlint-rule-preset-recommend"] }.secretlintrc.jsoniçinden (statik analizle görünmeyen şekilde) referanslandığı için knip onu "kullanılmıyor" sanır → açıkça ignore edilmiş.
- Araç: Bun'un yerleşik test runner'ı (ayrı framework yok).
- Kapsam:
**/*.test.tsdosyaları — ör.github-stars.test.ts,sections.test.ts,deploy-targets.test.ts,playground/engine.test.ts,lib/filter.test.ts,lib/export.test.ts… - Veri katmanı (sections, deploy targets), playground motoru/protokolü ve yardımcı script'ler için birim testleri.
Bunlar gate içinde değil çünkü ayrı kaygıları var (gizli sızıntı taraması
ve danışma niteliğinde audit), ama hook'larda ve CI'da koşarlar.
- Araç:
secretlint(13.0.2) +@secretlint/secretlint-rule-preset-recommend - Ne yapar: Commit'lenecek dosyalarda API anahtarı, token, kimlik bilgisi sızıntısı arar.
- Konfig —
.secretlintrc.json:preset-recommendkuralı aktif. .secretlintignore:dist,.astro,node_modules,bun.lockve**/docker-compose.example.yml— buradakipostgres:postgres@...bir yorum satırı şablon varsayılanı, gerçek sır değil (yanlış pozitif).
- Ne yapar: Bilinen güvenlik advisory'lerini raporlar.
- Önemli: Bloklamaz.
pre-pushhook'undabun audit || true, CI'dabun run audit || echo "::notice::..."ile non-blocking. Gerekçe: mevcut advisory'ler build-time transitive bağımlılıklar (picomatch/js-yaml) — statik sitede saldırı yüzeyi yok; Dependabot upstream'de düzeltir.
Hook'lar core.hooksPath .githooks ile bağlanır. Bu ayar package.json'daki
prepare script'i tarafından (her bun install sonrası) otomatik kurulur:
"prepare": "git config core.hooksPath .githooks"| Hook | Çalıştırdığı | Amaç |
|---|---|---|
pre-commit |
bun run secrets + bun run format |
Hızlı kontroller — sır sızıntısı ve biçim. Commit'i geciktirmeyecek kadar hafif. |
pre-push |
bun run gate + bun audit || true |
Tam doğrulama — CI'nın enforce ettiğinin aynısı. Push'tan önce her şeyi yakalar. |
Tasarım mantığı (katmanlı): Ucuz kontroller her commit'te (pre-commit),
pahalı tam gate ise yalnızca push'ta (pre-push) çalışır. Böylece sık commit
akışı yavaşlamaz ama hatalı kod uzağa (remote) gitmeden yakalanır.
İki ayrı workflow; build doğrulama ile production deploy kasıtlı olarak ayrılmıştır.
- Tetik:
pull_request,push: main,workflow_dispatch. - Deploy ETMEZ — sadece doğrular.
- Adımlar: checkout → Node 24 → Bun (
.bun-version'dan) →bun install --frozen-lockfile→bun run gate→bun run secrets→bun run audit(non-blocking) →bun run build→ job summary tablosu (Bun/Node/Astro sürümü, üretilen sayfa sayısı, commit). permissions: contents: read→ en az ayrıcalık (least privilege).concurrencyile aynı ref'in eski koşumları iptal edilir.
- Tetik:
release: published(veya manuelworkflow_dispatch).main'e push deploy tetiklemez. Canlıya çıkış = git tag + GitHub release. - İzinler:
pages: write,id-token: write(GitHub Pages OIDC deploy için). - Akış:
buildjob (aynı kurulum,dist'iupload-pages-artifactile yükler) →deployjob (actions/deploy-pages,github-pagesenvironment). concurrency: group: pages, cancel-in-progress: false→ eşzamanlı deploy yarışı önlenir; süren deploy yarıda kesilmez.
Güvenlik notu — SHA pin: Tüm action'lar @<sha> # vX.Y.Z formatında tam
commit SHA'sına sabitlenmiş (ör. actions/checkout@9c091bb… # v7.0.0). Bu,
tag'in kötü niyetle yeniden işaret etmesine (supply-chain) karşı korur.
Dependabot bu SHA pin'lerini ve yorumlarını güncel tutar.
İki ekosistem:
bun— haftalık, en fazla 5 açık PR, commit prefixchore(deps).minor+patchgüncellemeler tek PR'da gruplanır (review gürültüsü azalır).- Major bump'lar tek tek gelir (manuel inceleme gerektirir).
bun.lockkaynak doğruluk (source of truth); Bun ≥ 1.1.39 gerektirir.
github-actions— haftalık, commit prefixci, hepsi tek grupta. SHA pin'leri ve# vX.Y.Zyorumlarını günceller.
build script'i Astro'dan önce çalışır:
"build": "node scripts/sync-docker-compose.mjs && astro build"Bu script, ayrı libredb-studio reposundaki kanonik
docker-compose.example.yml dosyasını siteye çeker ve iki yere yazar:
src/data/docker-compose.example.yml→ sayfa tarafından?rawimport edilir.public/docker-compose.example.yml→curl/wgetile ham indirilir.
Çözümleme sırası (ilk başaran kazanır), build'i asla kırmayacak biçimde:
- Uzak GitHub raw URL (CI'da çalışır; 8 sn timeout'lu
fetch). - Yerel kardeş checkout
../libredb-studio/...(hızlı yerel geliştirme). - Mevcut commit'li kopya (offline / upstream henüz push'lanmamışsa).
Hiçbiri olmaz ve commit'li kopya da yoksa exit(1). Aksi halde mevcut kopya
korunur ve sadece uyarı verilir — upstream geçici erişilemez diye build düşmez.
⚠️ Geliştirici notu: Bu script iki takip edilen (tracked) dosyayı her build'de yeniden yazar. Branch'i temiz tutmak için build sonrası bu iki dosyayıgit checkoutile geri al. (Bkz. proje hafıza notu "Build mutates tracked compose files".)
IDE'den bağımsız temel kurallar: utf-8, lf satır sonu, 2 boşluk girinti,
dosya sonunda satır, trailing whitespace temizliği. İstisna: *.md dosyalarında
trailing whitespace korunur (Markdown'da satır sonu zorlamak için kullanılır).
Bu, Prettier'ın yapmadığı dil-agnostik tabanı sağlar.
Geliştirici Yerel Hook'lar CI (ci.yml) Deploy (deploy.yml)
────────── ────────────── ─────────── ───────────────────
git commit ──────► pre-commit (push/PR tetikler)
├─ secrets
└─ format
git push ──────► pre-push ──────────► gate (release tetikler)
├─ gate ├─ typecheck
│ ├─ typecheck ├─ format
│ ├─ format ├─ lint
│ ├─ lint ├─ knip
│ ├─ knip ├─ test
│ └─ test ├─ secrets
└─ audit (uyarı) ├─ audit (uyarı)
└─ build ──────► build + deploy
(GitHub Pages, OIDC)
README.md bir süre "Any push to the main branch will trigger an automatic
build and deployment" diyordu; gerçek davranış ise deploy.yml'de
release: published ile kapılıdır. README'nin Deployment bölümü, iki
workflow'un ayrımını ve tag + release akışını anlatacak şekilde güncellendi —
artık bu belgeyle tutarlı.
{ "extends": "astro/tsconfigs/strict", // Astro'nun en katı preset'i "compilerOptions": { "types": ["bun"] },// bun:test ve Node global'leri "include": [".astro/types.d.ts", "**/*"], "exclude": ["dist"] }