TECHDEV · Flagship · Công cụ mã nguồn mở
ci-failure-detective
CI của bạn bị lỗi. Đó là lỗi thật, hay chỉ là test flaky? Và lỗi nằm chính xác ở đâu? CI Failure Detective đọc log CI bị lỗi và trả lời ba câu hỏi: lỗi thật đầu tiên là gì, mỗi test lỗi là flaky hay thực sự hỏng, và lỗi này đã từng xảy ra trước đây hay chưa.
GitHub Action + CLI (cifd) · v0.1.0 · Không cần thư viện ngoài · Node 18+ · MIT · Chạy hoàn toàn bên trong runner của bạn — log không bao giờ rời khỏi repo, không cần đăng ký, không có phí SaaS.
Công cụ cho bạn biết gì
| Câu hỏi | Cách trả lời |
|---|---|
| Thực ra lỗi ở đâu? | Dòng lỗi đầu tiên + ngữ cảnh stack, được phân loại (test / compile / dependency / OOM / timeout / lint) |
| Flaky hay thật? | Kết luận cho từng test — flaky, real, hoặc unknown — kèm điểm tin cậy, dựa trên lịch sử chạy |
| Đã gặp lỗi này chưa? | Chữ ký lỗi ổn định dài 12 ký tự; các lần lặp lại được gom nhóm kèm ngày gặp lần đầu / lần cuối |
| Nên làm gì? | Chỉ gợi ý hành động — gợi ý quarantine, hướng dẫn retry, chỉ tới lỗi đầu tiên. Không có gì được áp dụng tự động |
Các bước tiếp theo được gợi ý chỉ mang tính tham khảo — không có gì được áp dụng tự động. Quarantine chỉ dừng ở mức gợi ý theo thiết kế: tự động retry hoặc tự động tắt tiếng lỗi sẽ che giấu lỗi thật.
Kết luận flaky được quyết định thế nào
- Flaky, độ tin cậy 0,95: một test vừa lỗi vừa pass trên cùng một commit.
- Flaky, độ tin cậy 0,70: một test đổi kết quả thường xuyên qua các lần chạy gần đây.
- Real, độ tin cậy 0,80: một test lỗi đều đặn trên một commit mà trước đó nó từng pass — một regression thật.
- Unknown: chưa có lịch sử. Công cụ không bao giờ đoán.
Phát hiện flaky cần lịch sử: commit file .cifd-history.jsonl vào repo và ghi thêm mỗi lần chạy. Kết luận cùng-commit cần bản ghi pass của từng test, vì vậy hãy chạy test ở chế độ verbose (jest --verbose, pytest -v) để các test pass hiện rõ trong log. Log thường (không verbose) chỉ ghi lại lỗi, nên bằng chứng cùng-commit không có trong đó — kết luận theo tần suất đổi kết quả và kết luận regression vẫn hoạt động.
Framework được hỗ trợ — và mọi log thô
Phân tích kết quả test: Jest, pytest, go test, Mocha (best-effort — parser khớp nhất sẽ thắng). Nhưng bạn không cần framework test nào cả: phân loại lỗi và trích xuất lỗi đầu tiên hoạt động trên mọi log thô — lỗi cài đặt npm/pip/go, lỗi tsc, lỗi build Docker, lỗi OOM kill.
Cách dùng
# Dạng GitHub Action (khuyên dùng) — thêm một bước sau lệnh test
- name: Run tests
run: npm test 2>&1 | tee ci.log
- name: Diagnose failures
if: failure()
uses: techdevfun/ci-failure-detective@v1
with:
log-file: ci.log# Dạng CLI — không cần thư viện ngoài, Node.js 18+
npx ci-failure-detective analyze ci.log
cifd analyze ci.log --format md >> $GITHUB_STEP_SUMMARY
# Đưa output của lần chạy trực tiếp vào báo cáo
npm test 2>&1 | tee ci.log | npx ci-failure-detective analyze --format md# Ghi lại lịch sử, rồi xem các cụm lỗi
cifd record --history .cifd-history.jsonl --commit $GITHUB_SHA < ci.log
cifd history # show failure clustersLệnh chép đúng từ README của ci-failure-detective (v0.1.0). README chỉ cho các lệnh npx / CLI này và bước Action @v1; README không nêu bước cài đặt npm riêng, nên trang này không khẳng định bước đó.
Input, output của Action
| Input | Mặc định | Mô tả |
|---|---|---|
log-file | — | Đường dẫn tới log CI (bắt buộc) |
history-file | .cifd-history.jsonl | File lịch sử chạy |
commit | $GITHUB_SHA | SHA commit dùng để chấm điểm flaky |
fail-on-real | false | Thoát với mã 1 khi kết luận là real-failure |
summary | true | Ghi báo cáo markdown vào $GITHUB_STEP_SUMMARY |
Output: verdict, signature, report-json.
Tham chiếu CLI
cifd analyze [logfile] [--format json|md] [--history FILE] [--commit SHA]
cifd record --commit SHA [--history FILE] < logfile
cifd history [--history FILE]Ví dụ output (demo trong README, không phải benchmark)
Ví dụ mẫu trong README là một kết luận flaky của Jest, ghi lại từ một phiên terminal thật trên log fixture của chính repo. Ví dụ này chỉ minh họa định dạng báo cáo — không phải số liệu đo hiệu năng:
- Category: Test failure · Framework: jest
- Signature:
a3f9c1e2b4d6— đã gặp 12 lần trước đó (lần đầu 2026-10-18) - First error (dòng 47):
Cart pricing › applies bulk discount over 10 items— “At least one test failed — see the first failing test below.” - Test lỗi:
Cart pricing › applies bulk discount over 10 items(src/cart/pricing.test.js) — 🟡 flaky: lỗi trên abc1234 nhưng từng pass trên cùng commit trước đó — flake điển hình, không có thay đổi code ở giữa. - Bước tiếp theo được gợi ý: 1 test flaky — gợi ý quarantine (không áp dụng); cân nhắc quarantine qua
--testPathIgnorePatternshoặcjest.retryTimes.
README không chứa số liệu độ trễ, benchmark độ chính xác, hay số lượng test, nên trang này không khẳng định các số đó. Demo còn cho thấy một kết luận infra cho lỗi npm install và lịch sử cụm lỗi.
Đây KHÔNG phải gì — và đối thủ hơn chúng ta ở đâu
- CI Failure Detective không có dashboard và không có alerting — đây là một bước triage local, không phải một nền tảng.
- BuildPulse / Trunk / Datadog / Mergify (18–99 USD/tháng, so sánh kiểm chứng ngày 2026-10-24) hơn về độ rộng: dashboard đầy đủ, phân tích xu hướng, tự động quarantine và tự động retry, cảnh báo Slack/PagerDuty. Chúng yêu cầu tải toàn bộ dữ liệu test và log lên cloud của họ.
- Gradle Develocity hơn về gom nhóm lỗi bằng AI qua nhiều build và chọn test dự đoán — bán theo mô hình enterprise, nặng theo thiết kế.
- gh-failmap (mã nguồn mở) là đối thủ trực tiếp gần nhất về gom nhóm lỗi, nhưng chỉ có CLI, cần Python + đăng nhập
gh, chỉ dùng cho GitHub, và không có kết luận flaky. - flakestat (mã nguồn mở, không cần thư viện ngoài) là đối thủ gần nhất về triết lý — săn flaky theo hướng local-first — nhưng chỉ săn flake (qua chạy lại hoặc JUnit XML); không gom nhóm lỗi và không đọc log.
- ci-why / ci-log-triage giải thích lỗi bằng LLM — nghĩa là log của bạn được gửi tới API bên thứ ba và bạn trả phí theo mỗi lần chạy.
Như README nêu: CI Failure Detective là GitHub Action + CLI không cần thư viện ngoài duy nhất làm cả ba việc — gom nhóm lỗi lặp lại, tách flaky khỏi lỗi thật, chỉ tới lỗi đầu tiên — mà không để một byte log nào rời khỏi runner.
Giới hạn và roadmap
Giới hạn nêu trong README: phát hiện flaky cần lịch sử chạy (không có lịch sử, kết luận là unknown); kết luận cùng-commit cần log verbose; phân tích framework là best-effort. Không có gì được áp dụng tự động.
Roadmap — chưa phải tính năng đã ship: JUnit XML làm input bổ sung (bên cạnh log thô); output Slack webhook; thêm framework (PHPUnit, RSpec, .NET); output SARIF để tích hợp code scanning.
Công cụ liên quan
Các công cụ mã nguồn mở khác của TECHDEV: sessguard, runverdict, gheist-guard, vetgate, context-diet, agent-seatbelt, devsecops-os, env-doctor, skill-audit, logtrim, testguard, breakcheck, keymap, memgraph, ggufit, leaseguard, factfence, jsonfold
Đóng góp ý kiến
Bình chọn cho công cụ này, đề xuất tính năng, hoặc thảo luận với các vận hành khác trên bảng cộng đồng.