我构建了 QualityHub:AI 驱动的质量智能,为你的发布

发布: (2026年2月1日 GMT+8 19:10)
8 min read
原文: Dev.to

I’m ready to translate the article for you, but I need the text you’d like translated. Could you please provide the content (or paste the article) you want converted to Simplified Chinese? Once I have it, I’ll keep the source link unchanged and translate the rest while preserving all formatting and technical terms.

🎯 The Problem

作为 Renault 的开发者,我每天都会面对这个问题:

“我们可以把这个版本发布到生产环境吗?”

我们拥有测试结果、覆盖率指标、SonarQube 报告……但 没有唯一的真相来源 能够回答这个简单的问题。

于是我创建了 QualityHub —— 一个由 AI 驱动的平台,能够分析你的质量指标并即时给出是否发布的决定。

🚀 什么是 QualityHub?

QualityHub 是一个 开源质量情报平台,它:

  • 📊 聚合 来自任何框架(Jest、JUnit、JaCoCo…)的测试结果
  • 🤖 使用 AI 分析 质量指标
  • 决定 是否可以发布到生产环境
  • 📈 在美观的仪表盘中 跟踪 随时间变化的趋势

技术栈

组件技术
后端TypeScript, Express, PostgreSQL, Redis
前端Next.js 14, Tailwind CSS
CLITypeScript 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. 精美仪表盘

QualityHub dashboard

随时间跟踪指标,查看趋势,做出明智决策。

🔧 快速开始

自托管(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

完成! 您的指标会立即显示在仪表板中。

🎨 我为什么构建它

痛点

  • 工具碎片化 – Jest 用于测试,JaCoCo 用于覆盖率,SonarQube 用于质量……每个都有自己的 UI 和格式。
  • 没有统一答案 – “我们可以发布吗?”需要检查多个工具并凭直觉做决定。
  • 缺乏历史记录 – 难以跟踪质量随时间的趋势。
  • 手动流程 – 没有自动化,缺乏 CI/CD 集成。

解决方案

QualityHub 将所有内容聚合到一个仪表盘,并使用 AI 为您做出决策

🏗️ 架构

┌─────────────┐
│     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         │
└─────────────────────────────┘

📊 技术深度解析

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',
        // 自动检测 CI/CD 环境
        timestamp: new Date().toISOString(),
      },
      metadata: {
        ci_provider: this.detectCIProvider(),
        adapters: [adapterName],
      },
    };
  }
}

这使得 添加新解析器变得轻而易举。想要支持 pytest?继承 BaseParser 并实现 parse() 即可。

2. 风险评分算法(MVP)

当前版本使用 基于规则的评分

let score = 100;

// 测试失败
if (tests.failed > 0) {
  score -= tests.failed * 5;
}

// 覆盖率阈值
if (coverage.lines  0) {
  score -= flakyTests.length * 3;
}

// 确保在 0‑100 范围内
score = Math.max(0, Math.min(100, score));

未来:用能够从历史发布中学习的 AI 模型替代当前实现。

3. red analysis(Claude API)用于上下文洞察

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,          -- 灵活的 JSON 存储
    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‑驱动分析 使用 Claude API
  • 📊 趋势检测(覆盖率随时间下降)
  • 🔔 Slack/Email 通知
  • 🔌 GitHub 应用(在 PR 上发表评论)

v1.2(未来)

  • 📈 高级分析(基准、预测)
  • 🔐 企业级 SSO 与 RBAC
  • 🌍 多语言支持
  • 🎨 自定义仪表盘

💡 教训

  1. 开放标准获胜
    qa-result.json 设为 开放标准 是关键。现在任何人都可以构建解析器或集成。

  2. 开发者体验很重要
    CLI 必须极其简单

    qualityhub parse jest ./coverage  # Just works

    没有配置文件,没有设置——直接可用。

  3. 自托管是一项功能
    许多公司 无法 将其指标发送到外部 SaaS。Docker Compose 让自托管变得轻而易举。

🤝 贡献

QualityHub 是 100 % 开源(MIT 许可证)。

想要贡献吗?

  • 🧪 添加解析器(pytest、XCTest、Rust…)
  • 🎨 改进仪表盘
  • 🐛 修复错误
  • 📚 编写文档

查看 Contributing Guide

🔗 链接

  • 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 构建

Back to Blog

相关文章

阅读更多 »