Создание CI/CD пайплайна для PHP проекта с использованием GitHub Actions

Создание CI/CD пайплайна для PHP проекта с использованием GitHub Actions

В современном мире разработки, автоматизация - это не прихоть, а необходимость. Ручные процессы сборки, тестирования и развертывания не только занимают время, но и увеличивают вероятность ошибок. CI/CD (Continuous Integration/Continuous Delivery) - это подход, который позволяет автоматизировать эти процессы, повышая эффективность разработки и качество продукта. В этой статье мы разберем, как создать CI/CD пайплайн для вашего PHP проекта с использованием GitHub Actions. GitHub Actions – отличный выбор, особенно если вы уже используете GitHub для хранения вашего кода, так как он предоставляет интегрированную систему CI/CD прямо из коробки. Помимо простого развертывания, мы затронем тестирование, статический анализ кода и формирование артефактов.


Что такое CI/CD и зачем он нужен?

CI/CD – это сокращение от Continuous Integration и Continuous Delivery/Deployment. *Continuous Integration* (CI) предполагает частую интеграцию кода от разных разработчиков в общий репозиторий. При каждой интеграции запускаются автоматические тесты, чтобы убедиться, что изменения не сломали существующую функциональность. *Continuous Delivery/Deployment* (CD) занимается автоматизацией процесса выпуска новых версий приложения в продакшн или тестовые окружения. В Continuous Delivery, процесс выпуска контролируется вручную, а в Continuous Deployment – автоматически.

Преимущества CI/CD очевидны:

* Сокращение времени выхода на рынок: Автоматизация ускоряет процесс от разработки до выпуска.

* Улучшение качества кода: Автоматические тесты выявляют ошибки на ранних стадиях.

* Снижение рисков: Автоматизация уменьшает вероятность человеческих ошибок при развертывании.

* Повышение эффективности команды: Разработчики могут сосредоточиться на написании кода, а не на рутинных задачах.


Настройка GitHub Actions workflow

GitHub Actions определяются в файлах *.yml в папке .github/workflows вашего репозитория. Давайте создадим базовый workflow для PHP проекта.

Создайте файл .github/workflows/ci-cd.yml со следующим содержимым:

name: PHP CI/CD
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up PHP
uses: shivammathur/setup-php@v2
with:
php-version: '8.1'
extensions: pdo,pdo_mysql,mbstring,json,zip
- name: Install dependencies
run: composer install --no-interaction --prefer-dist
- name: Run tests
run: vendor/bin/phpunit
- name: Static analysis

> Важно: Убедитесь, что ваш проект имеет файл composer.json и настроенный phpunit.xml для запуска тестов.

Этот workflow выполняет следующие действия:

1. name: Название вашего workflow.

2. on: Определяет, когда workflow будет запускаться (push на ветку main или pull request на ветку main).

3. jobs: Определяет jobs, которые будут выполняться в workflow. В данном случае у нас один job под названием build.

4. runs-on: Указывает, на какой виртуальной машине будет выполняться job. ubuntu-latest – это последняя версия Ubuntu.

5. steps: Список шагов, которые будут выполняться в job.

* actions/checkout@v3: Извлекает код репозитория.

* shivammathur/setup-php@v2: Настраивает PHP окружение с указанной версией и расширениями.

* composer install: Устанавливает зависимости проекта, используя Composer.

* vendor/bin/phpunit: Запускает тесты с помощью PHPUnit.

* vendor/bin/phpstan analyse: Выполняет статический анализ кода с помощью PHPStan.


Улучшение workflow: Docker

Использование Docker контейнеров обеспечивает более воспроизводимую и изолированную среду для выполнения ваших задач. Это особенно полезно, если у вас есть специфические зависимости или конфигурации, которые сложно воссоздать на стандартных виртуальных машинах GitHub Actions.

В .github/workflows/ci-cd.yml измените секцию jobs:

jobs:
build:
runs-on: ubuntu-latest
container:

И создайте Dockerfile в корне вашего проекта (или в папке docker):

FROM php:8.1-cli
WORKDIR /app
COPY composer.json composer.lock ./
RUN composer install --no-interaction --prefer-dist
COPY . .
RUN apt-get update && apt-get install -y --no-install-recommends git phpunit php-xdebug
RUN cp /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini /usr/local/etc/php/conf.d/

Теперь ваш workflow будет запускаться внутри Docker контейнера, что гарантирует, что у вас будет одинаковая среда разработки на всех этапах пайплайна.


Развертывание на сервер

Чтобы автоматизировать развертывание на сервер, вам понадобится секретный ключ для доступа к вашему серверу (например, SSH ключ). Загрузите этот ключ в настройки GitHub repository (Settings -> Secrets -> Actions). Назовите его, например, SSH_PRIVATE_KEY.

Добавьте новый step в ваш workflow:

- name: Deploy to server
uses: appleboy/ssh-action@master
with:
host: your_server_ip
username: your_username
key: ${{ secrets.SSH_PRIVATE_KEY }}
script: |
cd /var/www/your_project
git pull origin main
composer install --no-interaction --prefer-dist
# Запуск миграций (если необходимо)
php artisan migrate --force
# Очистка кэша (если необходимо)

> Важно: Замените your_server_ip, your_username и SSH_PRIVATE_KEY на ваши реальные значения. --force используйте с осторожностью, только если уверены, что это безопасно.

Этот step подключается к вашему серверу через SSH и выполняет необходимые действия для развертывания нового кода.


Использование артефактов и уведомления

GitHub Actions позволяет сохранять артефакты – файлы, созданные в процессе workflow, которые можно использовать в других jobs или скачать вручную. Например, можно сохранять лог-файлы тестов или сгенерированные файлы.

Чтобы добавить сохранение артефактов, добавьте следующий шаг в ваш workflow:

- name: Archive test results
uses: actions/upload-artifact@v3
with:
name: test-results

Это сохранит папку vendor/phpunit/php-code-coverage, содержащую результаты покрытия кода тестами.

Наконец, чтобы получать уведомления о статусе workflow (успешно, ошибка), вы можете добавить step для отправки уведомлений:

- name: Send notification
uses: actions/github-notify@v1
with:
token: ${{ secrets.GITHUB_TOKEN }}

Это позволит вам быть в курсе, что происходит с вашим проектом, не проверяя вручную логи workflow.


Заключение

В этой статье мы рассмотрели основные шаги по созданию CI/CD пайплайна для PHP проекта с использованием GitHub Actions. Начав с простого workflow, мы улучшили его, используя Docker контейнеры и добавили автоматическое развертывание на сервер, сохранение артефактов и уведомления. Помните, что это лишь базовый пример, и вы можете настроить workflow под свои конкретные потребности и задачи. Автоматизация - это инвестиция в будущее вашего проекта, которая позволит вам разрабатывать быстрее, эффективнее и с большей уверенностью. Не бойтесь экспериментировать и адаптировать пайплайн под свою команду и особенности проекта. Удачи!