Как написать bash-скрипт для автоматизации деплоя?

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, чтобы скрипт был безопасным и повторяемым.

Оцени свой прогресс

Честно оцени своё понимание этого вопроса, чтобы мы могли построить твой учебный трек максимально эффективно.
Читать в блоге