CI Integration
The recommended integration is a single GitHub Actions step using testquorum/action@v0.1.0. The runner discovers what to test from your repository automatically. For other CI systems, results can be submitted directly to the HTTP API.
If you have additional CI needs — a different forge, a different CI system, or anything else — we'd love to hear from you. Schedule a callwith the team and we'll work through it together.
GitHub Actions
Add one step to your existing workflow. The runner downloads automatically and figures out what to test from your repo — no per-language configuration needed.
name: CI
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run tests via TestQuorum
uses: testquorum/action@v0.1.0
env:
TESTQUORUM_API_KEY: ${{ secrets.TESTQUORUM_API_KEY }}What the runner detects
The runner checks your repository for known manifests and turns on the matching test manager automatically:
- Cargo — detected from
Cargo.toml. Enumerates every#[test]and doctest viacargo metadataand runs each individually. - Nix — detected from
flake.nix. Evaluates yourchecksattrset and builds each derivation as a separate check. - treefmt — detected from
treefmt.toml. Runstreefmt --ci.
Multiple managers can be active in the same repo at once — each runs independently. To tweak behaviour (point Nix at a different attrset, disable a manager, use a non-root Cargo.toml) add a .testquorum.tomlto your repository root. Most repos won't need one.
Pinning the action
The latest release is v0.1.0. To pin to a specific commit and have Renovate keep it current automatically:
- uses: testquorum/action@<commit-sha> # kept current by Renovate
Submitting results directly via the API
If you are not using GitHub Actions, results can be submitted directly to the TestQuorum API. The endpoint is POST https://api.testquorum.dev/repos/{repo_id}/test-results where repo_id is your repository identifier (e.g. github:12345).
Each request body is a JSON object with a results array. Each entry describes a single test instance identified by a UUIDv7 you mint once and reuse across its lifecycle transitions:
POST /repos/github:12345/test-results
Authorization: Bearer <api-key>
Content-Type: application/json
{
"results": [
{
"id": "0191e2a0-...",
"test_name": "my_crate::tests::it_works",
"test_manager": "cargo",
"run": {
"head": { "sha": "abc123", "height": 42 },
"kind": { "kind": "post_land", "branch": "main", "trigger": { "kind": "push" } }
},
"state": {
"kind": "passed",
"discovered_at": 1749379200,
"started_at": 1749379201,
"finished_at": 1749379203,
"duration_ms": 1847
}
}
]
}Up to 1,024 results can be submitted per request. The full schema — including all state variants (discovered, running, passed, failed, errored, skipped, cancelled) and run kinds (diff, land, post_land) — is in the API reference.
Tests Dashboard
We're adding a Tests Dashboard feature — a GitHub issue on your repository rebuilt automatically that shows which tests are broken on main and a directory of every tracked test grouped by test manager (cargo, nix, treefmt). This is coming soon.