CI/CD для PHP проектов: настройка GitHub Actions
Современная разработка на PHP немыслима без автоматизации процессов тестирования, сборки и развертывания. CI/CD (Continuous Integration / Continuous Deployment) позволяет командам быстрее выпускать обновления, снижать количество ошибок и поддерживать высокое качество кода. В этой статье мы подробно разберем, как настроить пайплайны CI/CD для PHP-проектов с помощью GitHub Actions — встроенного инструмента автоматизации GitHub.
Мы рассмотрим реальные примеры для популярных фреймворков (Laravel, Symfony), научимся запускать тесты, проверять стиль кода, собирать артефакты и автоматически деплоить на сервер. Статья будет полезна как новичкам, так и опытным разработчикам, желающим оптимизировать свой workflow.
1. Основы GitHub Actions для PHP
GitHub Actions — это платформа для автоматизации рабочих процессов прямо в репозитории. Workflow описывается в YAML-файлах, которые хранятся в директории .github/workflows/. Каждый workflow состоит из одного или нескольких job, которые выполняются на виртуальных машинах (runner) при наступлении определенных событий (push, pull request, release и т.д.).
Для PHP-проектов ключевые шаги обычно включают:
- Установка зависимостей через Composer
- Настройка окружения (PHP-версия, расширения, база данных)
- Запуск статического анализа (PHPStan, Psalm)
- Выполнение юнит-тестов (PHPUnit, Pest)
- Проверка стиля кода (PHP CS Fixer, Laravel Pint)
- Сборка и публикация Docker-образа
- Деплой на production/staging сервер
Минимальный workflow для PHP-проекта выглядит так:
name: PHP CI
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: '8.2'
extensions: mbstring, intl, pdo_mysql
coverage: xdebug
- name: Install dependencies
run: composer install --prefer-dist --no-progress
- name: Run tests
run: vendor/bin/phpunit --testdox
Этот workflow запускается при каждом пуше или создании pull request в ветку main. Он проверяет код на соответствие стандартам и выполняет тесты.
2. Продвинутая конфигурация: тестирование, линтинг и статический анализ
Реальный проект требует более глубокой проверки качества кода. Рассмотрим пример для фреймворка Laravel с полным набором инструментов.
Создадим файл .github/workflows/laravel-ci.yml:
name: Laravel CI/CD
on:
push:
branches: [ main, develop ]
pull_request:
branches: [ main ]
jobs:
quality:
runs-on: ubuntu-latest
services:
mysql:
image: mysql:8.0
env:
MYSQL_DATABASE: testing
MYSQL_USER: user
MYSQL_PASSWORD: secret
MYSQL_ROOT_PASSWORD: root
ports:
- 3306:3306
options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3
steps:
- uses: actions/checkout@v4
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: '8.2'
extensions: mbstring, intl, pdo_mysql, bcmath, redis
coverage: pcov
tools: composer:v2
- name: Copy .env
run: |
cp .env.example .env
php artisan key:generate
- name: Install dependencies
run: composer install --no-interaction --prefer-dist
- name: Run Laravel Pint (Code Style)
run: vendor/bin/pint --test
- name: Run PHPStan (Static Analysis)
run: vendor/bin/phpstan analyse --memory-limit=2G
- name: Run migrations
run: php artisan migrate --force
env:
DB_CONNECTION: mysql
DB_HOST: 127.0.0.1
DB_PORT: 3306
DB_DATABASE: testing
DB_USERNAME: user
DB_PASSWORD: secret
- name: Run tests with coverage
run: vendor/bin/phpunit --coverage-clover coverage.xml
env:
DB_CONNECTION: mysql
DB_HOST: 127.0.0.1
DB_PORT: 3306
DB_DATABASE: testing
DB_USERNAME: user
DB_PASSWORD: secret
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v3
with:
files: coverage.xml
fail_ci_if_error: false
Что здесь происходит:
- Services — запускается контейнер MySQL для интеграционных тестов
- Laravel Pint — проверяет стиль кода согласно правилам Laravel
- PHPStan — статический анализ на максимальном уровне (level max)
- PHPUnit — выполняет тесты с генерацией отчета о покрытии
- Codecov — загружает отчет о покрытии для визуализации
Для Symfony-проектов конфигурация будет аналогичной, но с заменой Pint на PHP CS Fixer и использованием PHPStan с конфигом для Symfony.
3. Автоматический деплой с GitHub Actions
После успешного прохождения тестов можно настроить автоматический деплой на сервер. Рассмотрим два популярных подхода: через SSH и через Docker.
Деплой через SSH
Для этого потребуется добавить приватный SSH-ключ в Secrets репозитория (Settings → Secrets and variables → Actions).
deploy:
needs: [quality]
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/main'
steps:
- uses: actions/checkout@v4
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: '8.2'
- name: Install dependencies
run: composer install --no-dev --optimize-autoloader
- name: Deploy via SSH
uses: appleboy/ssh-action@v1.0.3
with:
host: ${{ secrets.DEPLOY_HOST }}
username: ${{ secrets.DEPLOY_USER }}
key: ${{ secrets.DEPLOY_KEY }}
script: |
cd /var/www/project
git pull origin main
composer install --no-dev --optimize-autoloader