Расскажи про опыт работы с CI/CD.

«Расскажи про опыт работы с CI/CD.» — вопрос из категории DevOps, который задают на 31% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Я настраивал и поддерживал CI/CD-пайплайны для PHP-проектов, что позволило сократить время от коммита до продакшена и повысить стабильность релизов.

Мой стек и практики:

  • Инструменты: GitLab CI/CD (основной опыт), GitHub Actions, Bitbucket Pipelines.
  • Контейнеризация: Сборка Docker-образов с многоступенчатыми билдами для уменьшения размера.
  • Тестирование: Параллельный запуск юнит- и функциональных тестов (PHPUnit, Pest), статический анализ (PHPStan, Psalm).
  • Деплой: Автоматический деплой в разные среды (staging/production) с ручным подтверждением для прода. Использовал Ansible для конфигурации серверов и деплоя на VPS, а также Helm для Kubernetes.

Пример .gitlab-ci.yml для Laravel-проекта:

stages:
  - test
  - build
  - deploy

variables:
  DOCKER_IMAGE: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA

# 1. Стадия тестирования
php-tests:
  stage: test
  image: php:8.2-fpm
  services:
    - mysql:8.0
    - redis:alpine
  script:
    - apt-get update && apt-get install -y git unzip libzip-dev
    - docker-php-ext-install pdo_mysql zip
    - curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
    - composer install --no-progress --no-interaction
    - cp .env.testing .env
    - php artisan key:generate
    - php artisan migrate --force
    - php artisan db:seed
    - vendor/bin/phpunit --coverage-text --colors=never

# 2. Стадия сборки Docker-образа
build-image:
  stage: build
  image: docker:latest
  services:
    - docker:dind
  script:
    - docker build -t $DOCKER_IMAGE .
    - docker push $DOCKER_IMAGE
  only:
    - main
    - develop

# 3. Стадия деплоя на staging
deploy-to-staging:
  stage: deploy
  image: alpine:latest
  script:
    - apk add --no-cache openssh-client
    - echo "$SSH_PRIVATE_KEY" > key.pem && chmod 600 key.pem
    - ssh -i key.pem -o StrictHostKeyChecking=no deploy@staging-server "docker pull $DOCKER_IMAGE && docker-compose up -d"
  environment:
    name: staging
    url: https://staging.example.com
  only:
    - develop

Основной результат — полная автоматизация процесса от пулл-реквеста до продакшена, где ручное вмешательство требуется только для подтверждения деплоя на production.

Видео-ответы