CI/CD для PHP проектов: настройка GitHub Actions с нуля

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

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                

Блоги

Рекомендаций по книгам