Skip to main content

Welcome to php-ci

· 2 min read
Himanshu Ramavat
Maintainer of php-ci

If you maintain PHP projects, you've probably written the same CI boilerplate more times than you'd like to admit: install PHP, add the right extensions, pull in Composer, configure a coverage driver — and then copy that block into the next repository. php-ci exists to delete that boilerplate.

What it is

php-ci is a reusable Docker image for CI/CD pipelines. It bundles PHP 8.1–8.4, Composer 2, and the extensions and system libraries commonly needed for CI. Install your project-level test/QA tooling via Composer (./vendor/bin/*). Point your pipeline at one image tag and your config collapses to a few lines:

jobs:
test:
runs-on: ubuntu-latest
container:
image: himanshuramavat/php-ci:8.3
steps:
- uses: actions/checkout@v4
- run: composer install --no-interaction --no-progress
- run: ./vendor/bin/phpunit

Why we built it

Three problems kept coming up across TYPO3, Laravel and library projects:

  1. Duplication. Every repo carried its own provisioning steps that drifted over time.
  2. Slow cold starts. Installing extensions on every job wasted minutes.
  3. Non-reproducibility. "Works on my pipeline" because the runner happened to have the right PHP patch.

A version-pinned image solves all three: one place to maintain, extensions baked in, identical bytes everywhere.

Goals for the project

  • Stay small and predictable. A tight, well-documented tag convention — no surprise breaking changes.
  • Be provider-agnostic. The same image works on GitHub Actions, GitLab CI and Bitbucket Pipelines.
  • Track PHP closely. New PHP minor lines land as new tags so you can test forward compatibility early.
  • Document everything. That's what this site is for.

Get started

Feedback and contributions are very welcome — see the Contributing guide. Happy shipping!