Как происходил деплой в production на вашем проекте?

«Как происходил деплой в production на вашем проекте?» — вопрос из категории DevOps, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

На последнем проекте мы использовали полностью автоматизированный CI/CD пайплайн на GitLab CI. Процесс выглядел так:

  1. Сборка и тестирование: При пуше в ветку main запускался пайплайн:

    # .gitlab-ci.yml
    stages:
      - test
      - build
      - deploy
    
    test:
      stage: test
      script:
        - docker-compose run --rm app npm test
        - docker-compose run --rm app python manage.py test
    
    build:
      stage: build
      script:
        - docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA .
        - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA
  2. Деплой в продакшн: После успешного прохождения тестов и мануального подтверждения в GitLab (manual gate) запускался деплой на Kubernetes-кластер:

    deploy:prod:
      stage: deploy
      environment: production
      script:
        - kubectl set image deployment/my-app app=$CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA -n production
        - kubectl rollout status deployment/my-app -n production --timeout=300s
  3. Стратегия и мониторинг: Мы применяли стратегию rolling update для нулевого простоя. Сразу после деплоя запускались smoke-тесты через Postman, и мы отслеживали метрики в Grafana (ошибки 5xx, latency, RPS) и логи в ELK-стеке. Откат выполнялся командой kubectl rollout undo, если метрики выходили за допустимые пределы.