Skip to content

CI has been red since 10 June: Pest exits 1 before running a single test #119

Description

@SimonBarrettACT

run-tests has failed on every push and pull request since 10 June 2026. All six matrix jobs — PHP 8.3 and 8.4 across Laravel 11, 12 and 13 — fail identically, and the failure is not a failing test:

WARN  No code coverage driver available
##[error]Process completed with exit code 1.

That is the entire output of the Execute tests step. No test names, no counts, no assertion failures. vendor/bin/pest --ci is exiting 1 before it runs anything. The coverage warning is a red herring — the workflow sets coverage: none deliberately, so it is expected and harmless.

When it started, and why

The first failing run is the one for 4281b73 "Add Laravel 13 support: modernise dev toolchain and CI matrix" on 10 June. The run 17 minutes earlier, on f48e382, passed. That commit widened the Pest constraint:

-        "pestphp/pest": "^v3.2.2",
+        "pestphp/pest": "^3.8 || ^4.0",

CI installs dependencies with composer update --prefer-stable, so from that commit on it resolves Pest 4. The suite has never run under Pest 4 successfully.

Locally it still passes, which is why this went unnoticed:

  • composer.lock pins pestphp/pest v3.7.1
  • on 3.7.1, vendor/bin/pest --ci — the exact CI command — runs the full suite and exits 0

So local and CI are running different major versions of the test runner, and only one of them works.

A second, related problem

The locked v3.7.1 does not satisfy the declared ^3.8 || ^4.0. The lockfile was never regenerated when the constraint changed, so composer.json and composer.lock disagree about what this package is even testable against. Whatever is decided below, the lock needs regenerating.

Why it matters

2.4.2 shipped on 7 September with no CI verification at all — the fix in #118 was verified only locally and in the consuming application. Every release since 10 June has been in the same position. A package with a red pipeline that nobody can act on is worse than one with no pipeline: the signal is there and everyone has learned to ignore it.

What to do

Two routes, and the choice is worth making deliberately:

  1. Make the suite Pest 4 compatible. Right if the package should support current tooling. Needs someone to run Pest 4 locally and find out what actually breaks — the silent exit is not self-explaining and may be a phpunit.xml.dist incompatibility rather than the --ci flag.
  2. Pin back to ^3.8 and regenerate the lock. Gets CI green quickly and honestly, and defers Pest 4 to its own piece of work.

Either way, regenerate composer.lock so local and CI agree.

Reproducing

The failure is not reproducible on a normal checkout, because the lock protects you. To see it:

composer update --prefer-stable
vendor/bin/pest --ci

That is what CI does, and it is the shortest path to the real error message.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions