CI pipelines should start locally

This week, Solomon Hykes (@solomonstre on Twitter) said:

Your CI/CD pipeline should start on the developer's laptop. If it only starts after a git push, you're slowing your team down and throwing money down the drain.

What does this mean?

My interpretation of this is that if a pipeline is going to fail, and fail for something that could been easily tested locally, then it should have been tested and fixed locally rather than waiting to push the changes to a CI pipeline, watch it fail there, and then need to push a fix and go through the process again.

In PHP projects, a common CI pipeline failure after working on a change is that PHPCS (code style) or PHPStan (static analysis) checks will fail - even though the feature, fix or refactor is working. If those checks can be run locally to shorten the feedback loop and allow the error to be fixed before the pipeline runs, it would be better to do so.

My preferred solution

My approach for this is using Git hooks - specifically on a pre-push event.

These are scripts that run automatically before the commits are pushed, and if it fails, it prevents the push and allows you to fix the issue.

They're easy to enable using a command like git config core.hooksPath .githooks (assuming the scripts are in a directory called .githooks), and whilst I wouldn't run everything that I would in a CI pipeline, I would run tasks like PHPCS and PHPStan checks, and maybe the unit and integration tests if they're fast to run.

Anything that would take a longer time to run, like functional or behavioural tests, would only be executed within the pipeline, but for common failures like PHPCS and PHPStan errors, these can be quickly fixed locally and not pushed to a CI pipeline at all.

Here is Solomon's original tweet.