pytest-mergify
Pytest plugin for Mergify Test Engine.
More information at https://mergify.com
Features
- Test tracing — Sends OpenTelemetry traces for every test to Mergify's API
- Flaky test detection — Intelligently reruns tests to detect flakiness with budget constraints
- Test quarantine — Quarantines failing tests so they don't block CI
- Test selection — Runs first the tests a merge-queue bisection step failed in the step above, and stops as soon as one fails again
Installation
Install the package alongside pytest (>= 6.0.0):
pip install pytest-mergify
The plugin is auto-discovered by pytest — no manual registration required.
Configuration
Set the MERGIFY_TOKEN environment variable with your Mergify API token.
The plugin activates automatically when running in CI (detected via the CI environment variable). To enable outside CI, set MERGIFY_CI_ENABLE=true.
Environment Variables
| Variable | Description | Default |
|---|---|---|
MERGIFY_TOKEN |
Mergify API authentication token | (required) |
MERGIFY_API_URL |
Mergify API endpoint | https://api.mergify.com |
MERGIFY_CI_ENABLE |
Force-enable outside CI | false |
MERGIFY_CI_DEBUG |
Print spans to console instead of uploading | false |
MERGIFY_TRACEPARENT |
W3C distributed trace context | — |
MERGIFY_TEST_JOB_NAME |
Mergify test job name | — |
MERGIFY_FAIL_FIRST_ENABLE |
Set to false to never run first what a merge-queue bisection step of this job failed before |
true |
MERGIFY_TEST_RETRY_ENABLE |
Set to false to have this job retry no failing test, whatever the repository sets |
true |
The names these replace, PYTEST_MERGIFY_ENABLE and PYTEST_MERGIFY_DEBUG,
are deprecated: they still work when the new name is not set, and the plugin
says which one to switch to at the end of the session.
For detailed documentation, see the official guide.
Bisection steps: failures first
When Mergify's merge queue splits a failed batch, each bisection step only needs to tell whether it is red. The plugin asks Mergify whether the current run is such a step and, if so, runs first the tests this job failed in the run the step was split from (Fail First). They run before every other test; if one of them fails again, the step is red whatever the rest does, so the run stops there (exit code 1, the remaining tests not run) and the queue can split again without waiting for the suite. If they all pass, the rest of the suite runs as usual. No test is ever skipped, so a green step still comes from a full suite. A test a retry rescued, or a quarantined failure, does not stop the run.
It is on by default: there is nothing to configure, the plugin uses the token and job identity it already has, and Mergify decides. A job that must always run its suite in its usual order turns it off:
- name: Run tests
run: pytest
env:
MERGIFY_TOKEN: ${{ secrets.MERGIFY_TOKEN }}
MERGIFY_FAIL_FIRST_ENABLE: "false"
Such a job never queries the endpoint; everything else the plugin does — test
tracing, flaky detection, quarantine — is unaffected either way. Only a
recognised no (false, no, off, 0) turns it off.
MERGIFY_TEST_SELECTION_ENABLE, its former name, is still read while the new
one is unset or empty, and the summary at the end of the run says to switch.
It only ever asks in a build of a merge-queue batch, the only builds a
bisection step can be: on GitHub Actions, the event of the draft pull request
the queue opened; on any other build, the queue's git note on the branch, one
git ls-remote against origin that runs while the tests are being collected.
Every other build asks nothing and sends nothing. Of a batch's builds, only
those below a failed batch, and not retrying their own checks, ask: the
others cannot be a bisection step, and send their results only when the
batch holds two pull requests or more, so a bisection step may read them, or
when they failed. A build where git cannot answer (no origin, credentials
the test step does not hold) asks, as it would without this.
Every other situation — a run that is not a bisection step, an unreachable API, an answer from a newer Mergify this plugin does not understand — runs the full suite in its usual order. It is also enabled per organization on Mergify's side: until yours has it, every run is served the full suite, says nothing about it, and still sends its results, which show what Fail First would do there.
Under pytest-xdist this works with the load (the default with -n) and
worksteal schedulers; with loadgroup, tests marked xdist_group still run
before them. With loadscope and loadfile, xdist
schedules whole modules or classes by size, so those tests do not run first:
the run still stops once they have all run and one failed again. Workers on a
remote gateway (--tx ssh=…) run to the end.
An opted-in job also tells Mergify what it concluded when its session ends — which tests failed, how many ran — in one small request sent before the test results are uploaded. That is what the next bisection step of the job is answered from, seconds after this one finished, without waiting for the results to be processed. If that request fails, the run's own result is untouched: the terminal says so, and the next step simply runs its full suite in its usual order.
Development
Prerequisites
- Python >= 3.10
- uv
Setup
uv sync
Running Tests
uv run poe test
uv run poe build builds the wheel into dist/; when one is there,
poe test runs against it rather than the project's own install, which is
how CI builds the extension once for every Python version. Every uv-driven
build of the extension uses Cargo's dev profile.
Linting
uv run poe lint
License
Proprietary. Use is governed by the Mergify Terms of Service.
Metadata
Release files for pytest-mergify 2026.10.9
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| pytest_mergify-2026.10.9-cp310-abi3-win_amd64.whl | CPython 3.10 | abi3 | Windows x86-64 | Details |
| pytest_mergify-2026.10.9-cp310-abi3-musllinux_1_2_x86_64.whl | CPython 3.10 | abi3 | Linux musl 1.2+ x86-64 | Details |
| pytest_mergify-2026.10.9-cp310-abi3-musllinux_1_2_aarch64.whl | CPython 3.10 | abi3 | Linux musl 1.2+ ARM64 | Details |
| pytest_mergify-2026.10.9-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl | CPython 3.10 | abi3 | Linux glibc 2.17+ x86-64 | Details |
| pytest_mergify-2026.10.9-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl | CPython 3.10 | abi3 | Linux glibc 2.17+ ARM64 | Details |
| pytest_mergify-2026.10.9-cp310-abi3-macosx_11_0_arm64.whl | CPython 3.10 | abi3 | macOS 11.0+ ARM64 | Details |
| pytest_mergify-2026.10.9-cp310-abi3-macosx_10_12_x86_64.whl | CPython 3.10 | abi3 | macOS 10.12+ x86-64 | Details |
Total release size: 28.2 MB
Release files / pytest_mergify-2026.10.9-cp310-abi3-win_amd64.whl
| Download URL | pytest_mergify-2026.10.9-cp310-abi3-win_amd64.whl |
|---|---|
| Size | 3.9 MB |
| Tags | CPython 3.10 Windows x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
1042c9aba54131a65042a43a2520831acc85c50e3412f635ff00422b24384ab0
|
|
BLAKE2b-256 checksum How to use checksums |
cefafea64fd662a0c81784974daec4bef5e83f2017fc86baf2db87de0499c9e6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 26, 2026.
Transparency logRelease files / pytest_mergify-2026.10.9-cp310-abi3-musllinux_1_2_x86_64.whl
| Download URL | pytest_mergify-2026.10.9-cp310-abi3-musllinux_1_2_x86_64.whl |
|---|---|
| Size | 4.4 MB |
| Tags | CPython 3.10 Linux musl 1.2+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
cea83751ce0303434a2e6ccce0bbc3c5e19826abffabe2a046ee95d90d8c4609
|
|
BLAKE2b-256 checksum How to use checksums |
1b4b52365c86a684c1e2fb0c78c26efd20705ec4039a3fb54bc7ce0cd735fcd8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 26, 2026.
Transparency logRelease files / pytest_mergify-2026.10.9-cp310-abi3-musllinux_1_2_aarch64.whl
| Download URL | pytest_mergify-2026.10.9-cp310-abi3-musllinux_1_2_aarch64.whl |
|---|---|
| Size | 4.1 MB |
| Tags | CPython 3.10 Linux musl 1.2+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
374d5533242a20cca0a7188bf6562c36013c61220a42011d472bc7972c601393
|
|
BLAKE2b-256 checksum How to use checksums |
ed32d28111a2c84be9491f071d42d13a1e5b675551edfb51c367a5a95e2be490
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 26, 2026.
Transparency logRelease files / pytest_mergify-2026.10.9-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | pytest_mergify-2026.10.9-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 4.2 MB |
| Tags | CPython 3.10 Linux glibc 2.17+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
b7d6d75dd67a82feb23083ad5bfdede5967bd24bc3ca33d1ffb91a3cc81bfd37
|
|
BLAKE2b-256 checksum How to use checksums |
a2682c864c056703049bfe54800e1c9143939285a9e3bba4e725c7b397aaeb4b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 26, 2026.
Transparency logRelease files / pytest_mergify-2026.10.9-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
| Download URL | pytest_mergify-2026.10.9-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl |
|---|---|
| Size | 3.9 MB |
| Tags | CPython 3.10 Linux glibc 2.17+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
2a267605b75327a9a54d63fb9990c1e29f0bf7ee7432acfb2f66991d641abff9
|
|
BLAKE2b-256 checksum How to use checksums |
e85ed296be4b76300df4f11f425e8793f803f2558870b7b5d53380cc8b32cc3b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 26, 2026.
Transparency logRelease files / pytest_mergify-2026.10.9-cp310-abi3-macosx_11_0_arm64.whl
| Download URL | pytest_mergify-2026.10.9-cp310-abi3-macosx_11_0_arm64.whl |
|---|---|
| Size | 3.8 MB |
| Tags | CPython 3.10 abi3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
c9809062f5c8b87ca8ce3d0aa05b7af74eccaa9c33d93098c8878336b14b4527
|
|
BLAKE2b-256 checksum How to use checksums |
a5316e853e9326ea007a88e6e601417807b5c5eaadbf15cafb4e5fb6bed742c8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 26, 2026.
Transparency logRelease files / pytest_mergify-2026.10.9-cp310-abi3-macosx_10_12_x86_64.whl
| Download URL | pytest_mergify-2026.10.9-cp310-abi3-macosx_10_12_x86_64.whl |
|---|---|
| Size | 4.0 MB |
| Tags | CPython 3.10 abi3 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
d0fff05717e00d47477fd6c9d0c2f2efa99392291e5db8eb37c029308e7af975
|
|
BLAKE2b-256 checksum How to use checksums |
b2b7b910cdf9a87768f8ae5d3318e24b597157789ba8e69cd9763d3efed8da93
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 26, 2026.
Transparency logSecurity for pytest-mergify 2026.10.9
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 7 files in this release have been uploaded with provenance metadata.
Attestation for pytest_mergify-2026.10.9-cp310-abi3-win_amd64.whl
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 26, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.