Вот полная документация по каждому пункту с подробным описанием:
1. Основы автоматизации развертывания
1.1 Текущие методы развертывания кода
Ручные процессы:
-
SCP/SFTP: Вручную копирование файлов на сервер
-
Git/SVN вручную: Логин на сервере и выполнение pull/update
-
Архивирование: Разработчики создают zip-архивы для переноса
Проблемы:
-
Трудоемкость: Требуется постоянное участие админов
-
Медленное развертывание: Среднее время деплоя 30+ минут
-
Ошибки: 47% инцидентов вызваны человеческим фактором
-
Сложный откат: Среднее время восстановления 1.5 часа
1.2 Планирование окружений
Иерархия окружений:
graph LR
A[Dev] --> B[Test]
B --> C[Pre-Prod]
C --> D[Prod]
Характеристики:
Окружение | Назначение | Доступность | Данные | Масштаб |
---|---|---|---|---|
Dev | Разработка | Локально | Mock | 1 сервер |
Test | QA-тесты | Внутренняя | Тестовые | 2-3 сервера |
Pre-Prod | Дымовые тесты | Закрытая | Prod-копия | 20% от Prod |
Prod | Рабочее | Публичная | Реальные | 100% кластер |
Pre-Prod необходимость:
-
Тестирование на реальной БД (версия/конфигурация)
-
Проверка интеграций (платежи, API)
-
Валидация под нагрузкой
1.3 Проектирование системы
Ключевые принципы:
-
Идемпотентность: Повторный деплой не должен ломать систему
-
Atomicity: Все или ничего - при ошибке полный откат
-
Версионность: Четкое управление версиями артефактов
Схема потока:
def deployment_flow(): get_code() if needs_compile(): build_artifacts() prepare_configs() package() distribute() for server in cluster: take_offline(server) deploy(server) test(server) bring_online(server)
1.4 Критичные аспекты
Конфигурации:
-
Разделение: config_dev.json vs config_prod.json
-
Безопасность: Хранение secrets в Vault, не в Git
-
Динамичность: Подстановка переменных во время деплоя
Тестирование:
test_endpoint() { HTTP_STATUS=$(curl -s -o /dev/null -w "%{http_code}" ${URL}) [ "$HTTP_STATUS" -eq 200 ] || fail_deployment }
2. Реализация на Shell-скриптах
2.1 Подготовка инфраструктуры
Требования к серверам:
-
Единый пользователь:
useradd -u 1010 -s /bin/bash www echo "www ALL=(ALL) NOPASSWD: /usr/bin/systemctl" >> /etc/sudoers
-
SSH-ключи:
ssh-keygen -t rsa -b 4096 -C "deployer@company" ssh-copy-id -i ~/.ssh/id_rsa.pub www@web-server
-
Директории:
/deploy ├── code/ # Исходный код ├── config/ # Конфиги ├── tmp/ # Временные файлы └── tar/ # Готовые пакеты
2.2 Полный скрипт деплоя
Архитектура скрипта:
#!/bin/bash # ====================== # DEPLOYMENT SCRIPT v3.2 # ====================== # Конфигурация LOG_FILE="/var/log/deployments/$(date +%Y%m%d).log" LOCK_FILE="/tmp/.deploy_lock" VERSION=$(git rev-parse --short HEAD) # Инициализация init() { trap "cleanup" EXIT set -o errexit -o nounset -o pipefail mkdir -p "$(dirname "$LOG_FILE")" exec > >(tee -a "$LOG_FILE") 2>&1 } # Блокировки acquire_lock() { if [ -f "$LOCK_FILE" ]; then local pid=$(cat "$LOCK_FILE") if ps -p "$pid" > /dev/null; then error "Deployment already running (PID $pid)" fi fi echo $$ > "$LOCK_FILE" } # Основные функции deploy() { log "Starting deployment of version $VERSION" fetch_code || error "Code fetch failed" build_artifacts || error "Build failed" distribute || error "Distribution failed" verify_deployment || error "Verification failed" log "Successfully deployed $VERSION" } # Обработчики ошибок error() { log "ERROR: $1" rollback exit 1 } # Полный листинг всех функций...