Local CI guard for flaky tests: parse JUnit XML, retry, and auto-quarantine
Project description
flakewall
Language-agnostic flaky test guard for CI. Parse JUnit XML, score flakiness, quarantine known flakes, and selectively retry tests (pytest/jest) – all via a tiny CLI.
What it does (simple explanation)
Flaky tests are tests that sometimes pass and sometimes fail without code changes. flakewall helps you:
- Identify flaky candidates by scanning JUnit XML across runs
- Prevent known flakes from breaking CI (quarantine)
- Optionally re-run failing tests to prove they’re flaky (then auto-quarantine)
Why it’s useful
- Works with any language that can emit JUnit XML
- No vendor lock-in, no background service – just a small CLI
- Plays nicely with your existing CI and test runner
Install
Pick one of the following (no PyPI required):
From source (recommended for dev):
git clone https://github.com/Cicatriiz/flakewall.git
cd flakewall
make dev # creates venv and installs in editable mode
# or
python -m venv .venv && . .venv/bin/activate && pip install -e .[dev]
pipx (isolated, global CLI without polluting system site-packages):
pipx install git+https://github.com/Cicatriiz/flakewall.git
Docker (no local Python required):
docker run --rm -v "$PWD":/work -w /work python:3.11-slim bash -lc \
"pip install git+https://github.com/Cicatriiz/flakewall.git && flakewall --help"
From PyPI (optional):
pip install flakewall
Quick start
# 1) Generate JUnit XML in your test run
pytest --junitxml=reports/junit.xml
# 2) Initialize config files
flakewall init
# 3) Guard CI: exit non‑zero only if non‑quarantined failures exist
flakewall guard --junit "reports/**/*.xml"
# 4) Score flakiness across multiple reports (optional)
flakewall score --junit "reports/**/*.xml" --min-total 2 --json > flakewall_score.json
# 5) Retry specific failing tests (pytest/jest) and optionally auto‑quarantine
flakewall retry --framework pytest --from-junit "reports/**/*.xml" --max-retries 1 --auto-quarantine
Commands
init– creates.flakewall/config.ymland.flakewall/quarantine.ymlreport– lists current failing test IDs and marks quarantined onesguard– exits 0 if failures ⊆ quarantine; else exits 1score– detects pass/fail flips across JUnit files; supports--jsonauto-quarantine– adds flip-prone tests above a--thresholdto quarantineretry– re-runs tests (pytest/jest) up to--max-retries; can--auto-quarantineproofs of flakiness; supports--json
Configuration
Files created by init under .flakewall/:
config.yml– for example:retries: 0 report_glob: "**/junit*.xml"
quarantine.yml– list of quarantined test IDs:quarantined: - package.module::TestClass::test_name
CI examples
- GitHub Actions:
examples/ci/github-actions.yml - GitLab CI:
examples/ci/gitlab-ci.yml - CircleCI:
examples/ci/circleci-config.yml - Azure Pipelines:
examples/ci/azure-pipelines.yml - Jenkins:
examples/ci/Jenkinsfile
Supported inputs and runners
- Input: JUnit XML (generic, from any language)
- Retry adapters: pytest, jest (dry‑run friendly, configurable base command)
Notes and limitations
- Quarantine is a local YAML list – keep it under review in code review.
- Flake scoring is minimal (requires only JUnit XML). It doesn’t depend on long CI history.
- Jest retry selection uses
-t <name>; include file path in test ID if multiple names collide.
Contributing
See CONTRIBUTING.md for dev setup and releasing.
License
MIT – see LICENSE.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file flakewall-0.1.1.tar.gz.
File metadata
- Download URL: flakewall-0.1.1.tar.gz
- Upload date:
- Size: 11.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5008613a6fa1c73fed109b36328259cbd906ea009fb0fb10af81200d2f6b56ea
|
|
| MD5 |
4feb7d78ba5273d61f0815bb14d51d70
|
|
| BLAKE2b-256 |
9585a5705ef97f8204e001a9c077bfa41b1b8651431eb11a5c59de73c26689e3
|
File details
Details for the file flakewall-0.1.1-py3-none-any.whl.
File metadata
- Download URL: flakewall-0.1.1-py3-none-any.whl
- Upload date:
- Size: 10.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c31a3f8bbcfb1e9aa31db534515e2bb2cef5e5551d60ce6aaa5ab132ffb28145
|
|
| MD5 |
af7c107008dc62064a5ee896cebcffdc
|
|
| BLAKE2b-256 |
c336af4c42b19b3d768341288614265d6c863ebc57ccba61726a55b177fe155a
|