제가 만든 QualityHub: AI 기반 품질 인텔리전스, 귀하의 릴리스를 위해
Source: Dev.to
위 링크에 포함된 본문을 제공해 주시면, 해당 내용을 한국어로 번역해 드리겠습니다. (코드 블록, URL 및 마크다운 형식은 그대로 유지됩니다.)
🎯 문제
Renault에서 개발자로 일하면서 매일 이 질문에 직면했습니다:
“이 릴리스를 프로덕션에 배포할 수 있을까?”
우리는 테스트 결과, 커버리지 메트릭, SonarQube 보고서를 가지고 있었지만 이 간단한 질문에 답할 단일 진실의 원천이 없었습니다.
그래서 저는 QualityHub를 만들었습니다 – 품질 메트릭을 분석하고 즉시 go/no‑go 결정을 제공하는 AI‑기반 플랫폼입니다.
🚀 QualityHub란?
QualityHub는 오픈‑소스 품질 인텔리전스 플랫폼으로, 다음을 수행합니다:
- 📊 Aggregates any framework (Jest, JUnit, JaCoCo…) 의 테스트 결과
- 🤖 Analyzes AI를 활용한 품질 메트릭
- ✅ Decides 프로덕션에 배포해도 되는지 판단
- 📈 Tracks 아름다운 대시보드에서 시간에 따른 추세를 추적
스택
| 구성 요소 | 기술 |
|---|---|
| 백엔드 | TypeScript, Express, PostgreSQL, Redis |
| 프론트엔드 | Next.js 14, Tailwind CSS |
| CLI | TypeScript with parsers for Jest, JaCoCo, JUnit |
| 배포 | Docker Compose (self‑hostable) |
| 라이선스 | MIT |
💡 작동 방식
1. 범용 포맷 – qa-result.json
특정 도구를 강제하는 대신, QualityHub는 오픈 표준 포맷을 사용합니다:
{
"version": "1.0.0",
"project": {
"name": "my-app",
"version": "2.3.1",
"commit": "a3f4d2c",
"branch": "main",
"timestamp": "2026-01-31T14:30:00Z"
},
"quality": {
"tests": {
"total": 1247,
"passed": 1245,
"failed": 2,
"skipped": 0,
"duration_ms": 45230,
"flaky_tests": ["UserAuthTest.testTimeout"]
},
"coverage": {
"lines": 87.3,
"branches": 82.1,
"functions": 91.2
}
}
}
이 포맷은 모든 테스트 프레임워크와 호환됩니다.
2. CLI 파서
CLI가 테스트 결과를 자동으로 변환합니다:
# Jest (JavaScript/TypeScript)
qualityhub parse jest ./coverage
# JaCoCo (Java)
qualityhub parse jacoco ./target/site/jacoco/jacoco.xml
# JUnit (Java/Kotlin/Python)
qualityhub parse junit ./build/test-results/test
3. 위험 분석 엔진
백엔드가 결과를 분석하고 위험 점수(0‑100)를 계산합니다.
분석된 위험 요인
- 테스트 통과율
- 코드 커버리지(라인, 브랜치, 함수)
- 불안정 테스트
- 커버리지 추세
- 코드 품질 메트릭(가능한 경우)
샘플 출력
{
"risk_score": 85,
"status": "SAFE",
"decision": "PROCEED",
"reasoning": "Test pass rate: 99.8%. Coverage: 87.3%. No critical issues.",
"recommendations": []
}
4. 아름다운 대시보드

시간에 따라 메트릭을 추적하고, 추세를 확인하며, 정보에 기반한 결정을 내립니다.
🔧 빠른 시작
자체 호스팅 (5 분)
# Clone repo
git clone https://github.com/ybentlili/qualityhub.git
cd qualityhub
# Start everything with Docker
docker-compose up -d
# ✅ Backend: http://localhost:8080
# ✅ Frontend: http://localhost:3000
CLI 사용
# Install
npm install -g qualityhub-cli
# Initialize
qualityhub init
# Parse your test results
qualityhub parse jest ./coverage
# Push to QualityHub
qualityhub push qa-result.json
완료! 메트릭이 대시보드에 즉시 표시됩니다.
🎨 Why I Built This
The Pain Points
- Fragmented tools – 테스트를 위한 Jest, 커버리지를 위한 JaCoCo, 품질을 위한 SonarQube… 각각 고유한 UI와 포맷을 가짐.
- No single answer – “배포해도 될까?” 라는 질문에 여러 도구를 확인하고 직감에 의존해야 함.
- No history – 시간에 따른 품질 추세를 추적하기 어려움.
- Manual process – 자동화 없음, CI/CD 연동 없음.
The Solution
QualityHub aggregates everything into one dashboard and uses AI to make the decision for you.
🏗️ 아키텍처
┌─────────────┐
│ CLI │ ← Parse test results
└──────┬──────┘
│ POST /api/v1/results
↓
┌─────────────────────────────┐
│ Backend (API) │
│ • Express + TypeScript │
│ • PostgreSQL + Redis │
│ • Risk Analysis Engine │
└──────────────┬──────────────┘
│
↓
┌─────────────────────────────┐
│ Frontend (Dashboard) │
│ • Next.js 14 │
│ • Real‑time metrics │
└─────────────────────────────┘
Source: …
📊 기술 심층 분석
1. 파서 아키텍처
각 파서는 기본 클래스를 확장합니다:
export abstract class BaseParser {
abstract parse(filePath: string): Promise;
protected buildBaseResult(adapterName: string) {
return {
version: '1.0.0',
project: {
name: this.projectInfo.name,
commit: process.env.GIT_COMMIT || 'unknown',
// Auto‑detect CI/CD environment
timestamp: new Date().toISOString(),
},
metadata: {
ci_provider: this.detectCIProvider(),
adapters: [adapterName],
},
};
}
}
이렇게 하면 새 파서를 추가하는 것이 매우 간단해집니다. pytest 지원이 필요하나요? BaseParser를 상속하고 parse()를 구현하면 됩니다.
2. 위험 점수 알고리즘 (MVP)
현재 버전은 규칙 기반 점수 매기기를 사용합니다:
let score = 100;
// Test failures
if (tests.failed > 0) {
score -= tests.failed * 5;
}
// Coverage thresholds
if (coverage.lines < 80) {
score -= (80 - coverage.lines) * 0.5;
}
if (coverage.branches < 70) {
score -= (70 - coverage.branches) * 0.5;
}
if (coverage.functions < 75) {
score -= (75 - coverage.functions) * 0.5;
}
// Flaky tests
if (flakyTests.length > 0) {
score -= flakyTests.length * 3;
}
// Ensure 0‑100 range
score = Math.max(0, Math.min(100, score));
향후 계획: 과거 릴리스 데이터를 학습하는 AI 기반 모델로 교체합니다.
3. red analysis (Claude API) for contextual insights
4. 데이터베이스 스키마
단순하고 효율적입니다:
CREATE TABLE projects (
id UUID PRIMARY KEY,
name VARCHAR(255) UNIQUE NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE qa_results (
id UUID PRIMARY KEY,
project_id UUID REFERENCES projects(id),
version VARCHAR(50),
commit VARCHAR(255),
branch VARCHAR(255),
timestamp TIMESTAMP,
metrics JSONB, -- Flexible JSON storage
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE risk_analyses (
id UUID PRIMARY KEY,
qa_result_id UUID REFERENCES qa_results(id),
risk_score INTEGER,
status VARCHAR(50),
reasoning TEXT,
risks JSONB,
recommendations JSONB,
decision VARCHAR(50)
);
JSONB는 스키마 마이그레이션 없이도 유연한 메트릭 저장을 가능하게 합니다.
🚀 다음은?
v1.1 (예정)
- 🤖 AI‑Powered Analysis Claude API와 함께
- 📊 Trend Detection (시간에 따라 커버리지가 감소)
- 🔔 Slack/Email Notifications
- 🔌 GitHub App (PR에 대한 코멘트)
v1.2 (미래)
- 📈 Advanced Analytics (벤치마킹, 예측)
- 🔐 SSO & RBAC 기업용
- 🌍 Multi‑language support
- 🎨 Custom dashboards
💡 Lessons Learned
-
Open Standards Win
qa-result.json을 오픈 표준으로 만든 것이 핵심이었습니다. 이제 누구나 파서나 통합을 만들 수 있습니다. -
Developer Experience Matters
CLI 극도로 간단해야 합니다:qualityhub parse jest ./coverage # Just works설정 파일도 없고, 설정도 필요 없습니다—그냥 작동합니다.
-
Self‑Hosting is a Feature
많은 기업이 메트릭을 외부 SaaS에 전송할 수 없습니다. Docker Compose를 사용하면 셀프 호스팅이 매우 간단해집니다.
🤝 Contributing
QualityHub는 100 % 오픈‑소스 (MIT License)입니다.
기여하고 싶으신가요?
- 🧪 파서 추가 (pytest, XCTest, Rust…)
- 🎨 대시보드 개선
- 🐛 버그 수정
- 📚 문서 작성
기여 가이드를 확인하세요.
🔗 링크
- GitHub:
- CLI:
- npm:
🎯 지금 바로 시도해 보세요
# Self‑host in 5 minutes
git clone https://github.com/ybentlili/qualityhub.git
cd qualityhub
docker-compose up -d
# Or just the CLI
npm install -g qualityhub-cli
qualityhub parse jest ./coverage
💬 어떻게 생각하시나요?
이걸 사용하시겠어요? 어떤 기능을 보고 싶으신가요?
유용하다고 생각하시면 GitHub에서 ⭐를 남겨 주세요!
❤️와 TypeScript로 제작