CI/CD (Continuous Integration/Continuous Deployment) — это практика автоматизации процессов интеграции кода и его развертывания. Для PHP-проектов это включает тестирование, анализ кода и деплой.
Популярные решения:
Типичный пайплайн включает этапы:
name: PHP CI
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
test:
runs-on: ubuntu-latest
services:
mysql:
image: mysql:5.7
env:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: test_db
ports:
- 3306:3306
options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3
steps:
- uses: actions/checkout@v2
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: '8.2'
extensions: mbstring, xml, mysql, intl
coverage: pcov
- name: Install dependencies
run: composer install --no-progress --prefer-dist --optimize-autoloader
- name: Run tests
run: vendor/bin/phpunit --coverage-clover=coverage.xml
- name: Upload coverage
uses: codecov/codecov-action@v1
with:
token: ${{ secrets.CODECOV_TOKEN }}
file: coverage.xml
- name: PHPStan analysis
run: vendor/bin/phpstan analyse
- name: Psalm
run: vendor/bin/psalm --output-format=github
Пример деплоя через rsync после успешных тестов:
deploy:
needs: test
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/main'
steps:
- uses: actions/checkout@v2
- name: Install SSH key
uses: webfactory/ssh-agent@v0.5.0
with:
ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }}
- name: Deploy via rsync
run: |
rsync -avz --delete --exclude='.env' --exclude='.git' \
./ user@production-server:/var/www/my-app/
ssh user@production-server "cd /var/www/my-app && php artisan migrate --force"
- name: Cache Composer packages
uses: actions/cache@v2
with:
path: vendor
key: ${{ runner.os }}-php-${{ hashFiles('**/composer.lock') }}
strategy:
matrix:
php: ['7.4', '8.0', '8.1', '8.2']
experimental: [false]
include:
- php: '8.3'
experimental: true
- name: Upload build artifacts
uses: actions/upload-artifact@v2
with:
name: php-build
path: |
vendor
bootstrap/cache
Пример сборки и пуша Docker-образа:
- name: Build and push Docker image
uses: docker/build-push-action@v2
with:
push: true
tags: user/my-app:${{ github.sha }}
build-args: |
PHP_VERSION=8.2
- name: Notify Slack
uses: rtCamp/action-slack-notify@v2
env:
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}
SLACK_COLOR: ${{ job.status == 'success' && '#36a64f' || '#ff0000' }}
SLACK_TITLE: 'Deployment status: ${{ job.status }}'
- name: Laravel setup
run: |
cp .env.example .env
php artisan key:generate
php artisan storage:link
- name: Symfony cache warmup
run: php bin/console cache:warmup --env=test
- name: Security check
run: vendor/bin/security-checker security:check
composer audit
Настройка CI/CD для PHP-проекта требует понимания инструментов автоматизации, процессов тестирования и специфики деплоя PHP. Грамотно настроенный пайплайн значительно повышает надежность доставки кода и сокращает время между правкой и ее выходом в production.