/var/www/html/back/deploy.sh
#!/bin/bash
# Завершение при первой же ошибке
set -euo pipefail
# Коды выхода
MINIKUBE_ERROR=2
DOCKER_COMPOSE_ERROR=3
KUBERNETES_ERROR=4
# Определяем Namespace
NAMESPACE="gitep"
# Логирование
log() {
echo "$(date +'%Y-%m-%d %H:%M:%S') - $1"
}
# Проверка статуса команды
check_status() {
local status=$1
local message=$2
local exit_code=$3
if [ "$status" -ne 0 ]; then
log "Ошибка: $message"
exit "$exit_code"
fi
}
IMAGE_NAME="$NAMESPACE-app:latest"
COMPOSE_FILE="docker-compose.yml"
# Trap для обработки завершения скрипта
trap cleanup EXIT
cleanup() {
log "Выполнение очистки..."
unset DOCKER_TLS_VERIFY DOCKER_HOST DOCKER_CERT_PATH DOCKER_API_VERSION
log "Очистка завершена."
}
if minikube status >/dev/null 2>&1; then
log "Остановка Minikube..."
minikube stop
check_status $? "Не удалось остановить Minikube." $MINIKUBE_ERROR
log "Удаление Minikube..."
minikube delete
check_status $? "Не удалось удалить Minikube." $MINIKUBE_ERROR
fi
log "Запуск Minikube..."
minikube start --driver=docker --docker-opt="bip=172.17.0.1/24"
check_status $? "Не удалось запустить Minikube." $MINIKUBE_ERROR
log "Подключение к окружению Docker Minikube..."
eval $(minikube docker-env)
log "Включение metrics-server..."
minikube addons enable metrics-server
check_status $? "Не удалось включить metrics-server." $MINIKUBE_ERROR
log "Сборка и запуск контейнеров..."
docker compose -f "$COMPOSE_FILE" up --build -d --remove-orphans
check_status $? "Не удалось запустить контейнеры с помощью Docker Compose." $DOCKER_COMPOSE_ERROR
if docker images -q $IMAGE_NAME >/dev/null 2>&1; then
log "Образ $IMAGE_NAME уже существует."
else
log "Сборка Docker-образа..."
docker build -t "$IMAGE_NAME" .
check_status $? "Не удалось собрать Docker-образ." $DOCKER_COMPOSE_ERROR
fi
log "Загрузка Docker-образа в Minikube..."
minikube image load "$IMAGE_NAME"
check_status $? "Не удалось загрузить Docker-образ в Minikube." $MINIKUBE_ERROR
log "Получение UID и GID пользователя www-data..."
APP_UID=$(docker compose exec app id -u www-data)
APP_GID=$(docker compose exec app id -g www-data)
if [ -z "$APP_UID" ] || [ -z "$APP_GID" ]; then
log "Не удалось получить UID или GID."
docker compose logs app
exit 1
fi
log "UID: $APP_UID, GID: $APP_GID"
log "Остановка контейнеров перед изменением прав..."
docker compose -f "$COMPOSE_FILE" down
check_status $? "Не удалось остановить контейнеры с помощью Docker Compose." $DOCKER_COMPOSE_ERROR
# Небольшая пауза для завершения остановки
sleep 3
log "Изменение прав на директорию/файлы..."
sudo chown -R "$APP_UID":"$APP_GID" .
check_status $? "Не удалось изменить права на директорию/файлы." $DOCKER_COMPOSE_ERROR
log "Повторный запуск контейнеров..."
docker compose -f "$COMPOSE_FILE" up -d
check_status $? "Не удалось перезапустить контейнеры с помощью Docker Compose." $DOCKER_COMPOSE_ERROR
log "Проверка наличия Namespace Kubernetes..."
if kubectl get namespace "$NAMESPACE" >/dev/null 2>&1; then
log "Namespace Kubernetes '$NAMESPACE' уже существует."
else
log "Namespace Kubernetes '$NAMESPACE' не существует. Создание..."
kubectl create namespace "$NAMESPACE"
check_status $? "Не удалось создать Namespace Kubernetes." $KUBERNETES_ERROR
fi
log "Применение манифестов Kubernetes..."
kubectl apply -f k8s/ --namespace="$NAMESPACE"
check_status $? "Не удалось применить манифесты Kubernetes." $KUBERNETES_ERROR
log "Ожидание запуска Pod'ов..."
kubectl wait --namespace="$NAMESPACE" --for=condition=ready pod --all --timeout=60s
check_status $? "Не удалось дождаться запуска всех Pod'ов." $KUBERNETES_ERROR
log "Проверка статуса Pod'ов..."
kubectl get pods --namespace="$NAMESPACE"
log "Перезапуск Deployment..."
kubectl rollout restart deployment/app -n "$NAMESPACE"
check_status $? "Не удалось перезапустить Deployment." $KUBERNETES_ERROR
log "Получение URL сервиса..."
MINIKUBE_URL=$(minikube service nginx -n "$NAMESPACE" --url | head -n 1)
check_status $? "Не удалось получить URL сервиса." $MINIKUBE_ERROR
log "Операция успешно завершена!"
echo -e "\nURL сервиса: $MINIKUBE_URL\n"