μ¬ν΄ λΈλΌμ°μ λͺ¨λν°λ§μ μΈμ’ λ μκ°μ μ² λμ°λ―Έ μ¬ν΄(ALLCLL) μλΉμ€μ λ°μ΄ν° μ΅μ μ±κ³Ό UI 무결μ±μ κ²μ¦νκΈ° μν Playwright κΈ°λ°μ E2E ν μ€νΈ λ° λͺ¨λν°λ§ λꡬμ λλ€.
νμλ€μκ² μ νν μκ°μ μ² μ 보λ₯Ό μ 곡νκΈ° μν΄, μ€μ μλΉμ€ νκ²½μμ λ°μ΄ν°κ° μ μμ μΌλ‘ κ°±μ λκ³ μλμ§ 24μκ° κ°μν©λλ€.
μ΄ νλ‘μ νΈλ μ¬ν΄ μλΉμ€μ μ λ’°μ±μ 보μ₯νκΈ° μν΄ λ κ°μ§ ν΅μ¬ λͺ©μ μ κ°μ§λλ€.
- CI ν μ€νΈ (μ μ κ²μ¦): κ°λ° λ¨κ³μμ μλ μκ° UI λ‘μ§(μ: "5λΆ μ ")μ΄ κΉ¨μ§μ§ μμλμ§ κ²μ¦ν©λλ€.
- μ΄μ λͺ¨λν°λ§ (λμ κ²μ¦): μ€μ μ΄μ νκ²½μμ ν¬λ‘€λ§ λ°μ΄ν°κ° νμ©λ μ§μ° μκ° λ΄μ κ°±μ λκ³ μλμ§ μ£ΌκΈ°μ μΌλ‘ νμΈν©λλ€.
- μκ°μ μ² κΈ°κ° λμ κ°μ₯ μ€μν κ²μ **"μ€μκ° μ¬μ μ 보"**μ λλ€.
- μ΄ λꡬλ
data-crawled-atνμμ€ν¬νλ₯Ό νμΈνμ¬, λ°μ΄ν°κ° νμ¬ μκ° κΈ°μ€μΌλ‘ 1μκ°(κΈ°λ³Έκ°) μ΄λ΄μ κ°±μ λμλμ§ κ²μ¦ν©λλ€. - λ§μ½ λ°μ΄ν° κ°±μ μ΄ λ©μΆκ±°λ μ§μ°λλ©΄, μ¦μ κ΄λ¦¬μμκ² μλ¦Όμ 보λ λλ€.
- μ¬μ©μμκ² "λ°©κΈ μ ", "5λΆ μ "κ³Ό κ°μ΄ μ§κ΄μ μΈ μκ° μ 보λ₯Ό μ 곡νλ UIκ° μ¬λ°λ₯΄κ² μλνλμ§ ν μ€νΈν©λλ€.
- CI νκ²½μμλ μκ°μ κ³ μ (Mocking)νμ¬ λ‘μ§μ μ νμ±μ 보μ₯ν©λλ€.
- GitHub Actionsλ₯Ό ν΅ν΄ μκ°μ μ² κΈ°κ°(λ μ§, μκ°)μ λ§μΆ° μλμΌλ‘ λͺ¨λν°λ§μ΄ μ€νλ©λλ€.
- μ₯μ λ°μ μ Discord Webhookμ ν΅ν΄ λ¬Έμ μ μ¬κ°λ(INFO, WARNING, CRITICAL)μ λ°λΌ μλ¦Όμ μ μ‘ν©λλ€.
- Framework: Playwright
- Language: TypeScript
- CI/CD: GitHub Actions
- Notification: Discord Webhook
- Node.js (v18 μ΄μ)
- pnpm (λλ npm/yarn)
git clone https://github.com/allcll/allcll-browser-monitoring.git
cd allcll-browser-monitoring
pnpm install1. CI ν μ€νΈ (λ‘μ§ κ²μ¦)
UI λ‘μ§μ΄ μ¬λ°λ₯Έμ§ νμΈνλ μ μ ν μ€νΈμ λλ€.
pnpm test:ci
# λλ
npx playwright test --grep-invert @monitoring2. λͺ¨λν°λ§ ν μ€νΈ (μ΄μ νκ²½ κ²μ¦)
μ€μ λΌμ΄λΈ μλ²λ₯Ό λμμΌλ‘ λ°μ΄ν° κ°±μ μ¬λΆλ₯Ό νμΈν©λλ€.
pnpm test:monitor
# λλ
npx playwright test --grep @monitoringλͺ¨λν°λ§ λμμ νκ²½ λ³μλ₯Ό ν΅ν΄ μ μ΄ν μ μμ΅λλ€. μκ°μ μ² κΈ°κ°μ λ§μΆ° μ μ°νκ² λ³κ²½ κ°λ₯ν©λλ€.
| λ³μλͺ | μ€λͺ | μμ |
|---|---|---|
MONITOR_START_DATE |
λͺ¨λν°λ§ μμμΌ (YYYY-MM-DD) | 2024-03-01 |
MONITOR_END_DATE |
λͺ¨λν°λ§ μ’ λ£μΌ (YYYY-MM-DD) | 2024-03-05 |
MONITOR_START_HOUR |
μΌμΌ μμ μκ° (0-23) | 10 |
MONITOR_END_HOUR |
μΌμΌ μ’ λ£ μκ° (0-23) | 17 |
DISCORD_WEBHOOK_URL |
μλ¦Όμ λ°μ Discord Webhook URL | https://discord.com/... |
| λ³μλͺ | νμ μ¬λΆ | μ€λͺ | κΈ°λ³Έκ°/μμ¬ |
|---|---|---|---|
DISCORD_WEBHOOK_URL |
β | μλ¦Όμ λ°μ Discord Webhook URL | https://discord.com/... |
| λ³μλͺ | νμ μ¬λΆ | μ€λͺ | κΈ°λ³Έκ°/μμ¬ |
|---|---|---|---|
BASE_URL |
λͺ¨λν°λ§ λμ (URL) | https://allcll.kr |
|
MONITOR_START_DATE |
β | λͺ¨λν°λ§ μμμΌ (YYYY-MM-DD) | 2024-03-01 |
MONITOR_END_DATE |
β | λͺ¨λν°λ§ μ’ λ£μΌ (YYYY-MM-DD) | 2024-03-05 |
MONITOR_START_HOUR |
μΌμΌ μμ μκ° (0-23) | 10 |
|
MONITOR_END_HOUR |
μΌμΌ μ’ λ£ μκ° (0-23) | 17 |
|
MAX_DELAY_MS |
κ³Όλͺ© ν¬λ‘€λ§ μ§μ° μκ° Limit (ms) | 3600000 (1 hour) |
λͺ¨λν°λ§ ν
μ€νΈλ νμ¬ μκ°(now)κ³Ό λ°μ΄ν° κ°±μ μκ°(data-crawled-at)μ μ°¨μ΄λ₯Ό κ³μ°ν©λλ€.
μ§μ° μκ° = νμ¬ μκ° - λ°μ΄ν° κ°±μ μκ°
- μ μ: μ§μ° μκ° <= νμ© μκ³κ° (κΈ°λ³Έ 1μκ°)
- μ₯μ : μ§μ° μκ° > νμ© μκ³κ° (λ°μ΄ν° κ°±μ μ€λ¨ μμ¬)
μ§μ μ μΈ SSE μ°κ²° μ΄λ²€νΈλ³΄λ€λ, **"κ²°κ³Όμ μΌλ‘ λ°μ΄ν°κ° κ°±μ λμλκ°"**λ₯Ό νμΈνμ¬ μ€μ μ¬μ©μ κ²½νμ κΈ°λ°ν μ₯μ μ¬λΆλ₯Ό νλ¨ν©λλ€.
νΉμ, μ¬ν΄ μλΉμ€μ κ΄μ¬μ΄ μκΈ°μ ¨λ€λ©΄ Starλ₯Ό λλ¬μ£ΌμΈμ. βοΈ
μμ κ΄μ¬μ΄ μλΉμ€ μ΄μμ ν° λμμ΄ λ©λλ€! κ°μ¬ν©λλ€. :)
