Тести, що працюють з базою, найкраще ганяти на тій самій СУБД, що й на продакшені: SQLite пропускає помилки, специфічні для PostgreSQL чи MySQL (суворіший GROUP BY, типи, регістр у LIKE).
Service containers - Docker-контейнери, які GitHub Actions піднімає поруч із job:
jobs:
tests:
runs-on: ubuntu-latest
services:
postgres:
image: postgres:18
env:
POSTGRES_DB: testing
POSTGRES_USER: app
POSTGRES_PASSWORD: secret
ports: ["5432:5432"]
options: >-
--health-cmd pg_isready
--health-interval 5s
--health-timeout 5s
--health-retries 10
redis:
image: redis:8-alpine
ports: ["6379:6379"]
env:
DB_CONNECTION: pgsql
DB_HOST: 127.0.0.1
DB_DATABASE: testing
DB_USERNAME: app
DB_PASSWORD: secret
REDIS_HOST: 127.0.0.1
steps:
- uses: actions/checkout@v7
- uses: shivammathur/setup-php@v2
with:
php-version: '8.5'
extensions: pdo_pgsql, redis
- id: composer-cache
run: echo "dir=$(composer config cache-files-dir)" >> "$GITHUB_OUTPUT"
- uses: actions/cache@v6
with:
path: ${{ steps.composer-cache.outputs.dir }}
key: composer-${{ hashFiles('composer.lock') }}
restore-keys: composer-
- run: composer install --no-interaction --prefer-dist
- run: php artisan test --parallel
Ключові моменти:
- healthcheck у
options- GitHub чекає, доки база стане здоровою, перш ніж запускати кроки. Без нього тести можуть стартувати раніше, ніж PostgreSQL готовий; - адреса: job працює прямо на runner-і, тому сервіси доступні як
127.0.0.1через опубліковані порти. Якщо job сам виконується в контейнері (container:), сервіси доступні за назвою (postgres), і порти публікувати не треба; - кеш Composer за хешем
composer.lock- залежності не завантажуються щоразу; кешується каталог завантажень Composer, а неvendor/; - змінні
envперекривають.env- конфігурація тестів без окремого файла.
Прискорення: --parallel для тестів, окремі jobs для стилю (Pint) і статичного аналізу (PHPStan), щоб вони йшли паралельно з тестами, і concurrency з cancel-in-progress: true - скасовувати застарілі запуски при новому push у ту саму гілку.
Докладніше в документації: GitHub Actions: service containers