Что такое deploy (развёртывание)?

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

Ответ

Deploy (развёртывание) — это комплексный процесс доставки новой версии программного обеспечения из среды разработки (например, Git-репозитория) на рабочее окружение (production), где оно становится доступным для конечных пользователей. Это ключевой этап жизненного цикла DevOps.

Основные этапы современного деплоя:

  1. Сборка (Build): Преобразование исходного кода в исполняемый артефакт.
    # Пример для PHP-проекта
    composer install --no-dev --optimize-autoloader
    npm run production
    php artisan config:cache
  2. Тестирование (Test): Автоматический прогон тестов (юнит, интеграционных) в CI-пайплайне.
  3. Релиз (Release): Создание версионированного релиз-артефакта (Docker-образ, zip-архив).
  4. Развёртывание (Deploy): Перенос артефакта на production-серверы и его активация.
  5. Верификация и мониторинг: Проверка работоспособности (health checks) и наблюдение за метриками после выкатки.

Стратегии развёртывания (для минимизации простоя и рисков):

  • Blue-Green Deployment: Два идентичных окружения ("синее" — текущее, "зелёное" — новое). После развёртывания на "зелёное" трафик переключается на него. Позволяет мгновенный откат.
  • Canary Release: Новая версия постепенно развёртывается на небольшой процент пользователей (канарейка), затем, при успехе, на всех.
  • Rolling Update: Постепенное обновление инстансов приложения по одному или группами.

Пример команды для простого деплоя через Ansible:

- name: Deploy application
  hosts: webservers
  tasks:
    - name: Pull latest code
      git:
        repo: 'git@github.com:company/app.git'
        dest: /var/www/app
        version: main
    - name: Install dependencies
      composer:
        command: install
        working_dir: /var/www/app
        no_dev: yes
    - name: Restart PHP-FPM
      systemd:
        name: php-fpm
        state: restarted