Как написать bash-скрипт для автоматизации деплоя?
Подробный ответ
Что должен делать deploy-скрипт
Скрипт деплоя превращает ручную последовательность команд в повторяемый процесс. Для Python-приложения типичный сценарий включает получение конкретной ревизии кода, установку зависимостей, миграции, сборку статических файлов, перезапуск systemd-сервиса и health check.
Безопасная основа скрипта
#!/usr/bin/env bash
set -Eeuo pipefail
APP_DIR="/srv/my-app"
SERVICE_NAME="my-app"
BRANCH="main"
trap 'echo "Deploy failed on line $LINENO" >&2' ERR
cd "$APP_DIR"
git fetch origin
git checkout "$BRANCH"
git pull --ff-only origin "$BRANCH"
"$APP_DIR/.venv/bin/pip" install --requirement requirements.txt
"$APP_DIR/.venv/bin/python" manage.py migrate --noinput
"$APP_DIR/.venv/bin/python" manage.py collectstatic --noinput
sudo systemctl restart "$SERVICE_NAME"
sudo systemctl is-active --quiet "$SERVICE_NAME"
echo "Deploy completed successfully"Зачем нужен set -Eeuo pipefail
-e— завершает скрипт при ошибке команды;-u— завершает скрипт при обращении к неинициализированной переменной;-o pipefail— считает pipeline ошибочным, если упала любая команда внутри него;-E— передаёт trap на ошибки в функции и подкоманды.
Практические правила
использовать абсолютные пути, а не полагаться на текущую директорию и PATH;
кавычить переменные, например
"$APP_DIR";не хранить секреты прямо в скрипте;
фиксировать версию или commit SHA, а не всегда деплоить непроверенный main;
делать резервную копию или продумывать rollback до миграций с разрушительными изменениями;
проверять service status и health endpoint после деплоя.
Запуск
chmod +x deploy.sh
./deploy.shКак ответить на собеседовании
В Bash-скрипте деплоя я автоматизирую одинаковые шаги: обновление кода, зависимости, миграции, сборку, перезапуск сервиса и health check. Добавляю set -Eeuo pipefail, логирование, проверку ошибок, абсолютные пути и заранее продуманную стратегию rollback, чтобы скрипт был безопасным и повторяемым.
Оцени свой прогресс