🔧 Enhanced update script with remote repository selection

- Add support for origin/backup remote selection
- Improved Git conflict handling
- Enhanced backup functionality
- Updated documentation with usage examples
- Better error handling and validation
This commit is contained in:
2025-11-25 06:43:01 +09:00
parent 2e0dc90220
commit bd028d09e6
2 changed files with 97 additions and 32 deletions

View File

@@ -7,7 +7,7 @@
### 🚀 `./update.sh` - Полное обновление проекта ### 🚀 `./update.sh` - Полное обновление проекта
Выполняет полный цикл обновления: Выполняет полный цикл обновления:
- Создание бэкапа в удаленном репозитории - Создание бэкапа в удаленном репозитории
- Обновление кода из Git - Обновление кода из Git (origin или backup)
- Остановка текущих контейнеров - Остановка текущих контейнеров
- Пересборка Docker образов - Пересборка Docker образов
- Запуск новых контейнеров - Запуск новых контейнеров
@@ -17,12 +17,31 @@
**Использование:** **Использование:**
```bash ```bash
./update.sh # Полное обновление ./update.sh # Обновление из origin (по умолчанию)
./update.sh origin # Обновление из origin репозитория
./update.sh backup # Обновление из backup репозитория
./update.sh origin backup # Обновление из origin с бэкапом в backup
./update.sh backup origin # Обновление из backup с бэкапом в origin
./update.sh --help # Показать справку ./update.sh --help # Показать справку
./update.sh --logs # Показать логи без обновления ./update.sh --logs # Показать логи без обновления
./update.sh --status # Показать статус сервисов ./update.sh --status # Показать статус сервисов
``` ```
**Примеры использования удаленных репозиториев:**
```bash
# Стандартное обновление из основного репозитория
./update.sh
# Обновление из резервного репозитория (если основной недоступен)
./update.sh backup
# Обновление из основного репозитория с созданием бэкапа в резервном
./update.sh origin backup
# Переключение на резервный сервер с бэкапом в основной
./update.sh backup origin
```
### ▶️ `./start.sh` - Быстрый запуск ### ▶️ `./start.sh` - Быстрый запуск
Быстро запускает все сервисы проекта: Быстро запускает все сервисы проекта:
- Запуск Docker контейнеров - Запуск Docker контейнеров

View File

@@ -66,22 +66,49 @@ cleanup_staticfiles() {
# Функция обновления кода # Функция обновления кода
update_code() { update_code() {
log "Обновление кода из репозитория..." local remote_name="${1:-origin}"
log "Обновление кода из репозитория $remote_name..."
# Сохраняем изменения если есть # Проверяем существование удаленного репозитория
if ! git diff --quiet; then if ! git remote | grep -q "^${remote_name}$"; then
error "Удаленный репозиторий '$remote_name' не найден"
log "Доступные репозитории:"
git remote -v
return 1
fi
# Настраиваем стратегию pull если не настроено
if [ -z "$(git config pull.rebase 2>/dev/null)" ]; then
log "Настраиваем стратегию Git pull..."
git config pull.rebase false
fi
# Сохраняем неотслеживаемые изменения
if [ -n "$(git status --porcelain)" ]; then
warning "Обнаружены локальные изменения, сохраняем..." warning "Обнаружены локальные изменения, сохраняем..."
git stash push -m "Auto stash before update $(date)" git add .
git commit -m "Auto commit before update $(date '+%Y-%m-%d %H:%M:%S')" || true
fi fi
# Получаем обновления # Получаем обновления
git fetch origin log "Получение обновлений из $remote_name..."
git fetch $remote_name
# Обновляем текущую ветку # Обновляем текущую ветку
local current_branch=$(git rev-parse --abbrev-ref HEAD) local current_branch
git pull origin $current_branch current_branch=$(git rev-parse --abbrev-ref HEAD)
success "Код обновлен с ветки $current_branch" # Пробуем обновить с обработкой конфликтов
if ! git pull $remote_name $current_branch; then
error "Не удалось обновить код. Возможно есть конфликты."
log "Попробуйте выполнить команды вручную:"
log " git status"
log " git merge --abort # если нужно отменить"
log " git pull $remote_name $current_branch"
return 1
fi
success "Код обновлен с ветки $current_branch из $remote_name"
} }
# Функция остановки контейнеров # Функция остановки контейнеров
@@ -191,9 +218,10 @@ show_logs() {
# Функция бэкапа в удаленный репозиторий # Функция бэкапа в удаленный репозиторий
backup_to_remote() { backup_to_remote() {
log "Создание бэкапа в удаленном репозитории..." local backup_remote="${1:-backup}"
log "Создание бэкапа в удаленном репозитории $backup_remote..."
if git remote | grep -q "backup"; then if git remote | grep -q "^${backup_remote}$"; then
# Проверяем есть ли изменения для коммита # Проверяем есть ли изменения для коммита
if ! git diff --quiet || ! git diff --cached --quiet; then if ! git diff --quiet || ! git diff --cached --quiet; then
git add . git add .
@@ -201,18 +229,28 @@ backup_to_remote() {
fi fi
# Пушим в backup # Пушим в backup
git push backup master if git push $backup_remote master; then
success "Бэкап создан в удаленном репозитории" success "Бэкап создан в удаленном репозитории $backup_remote"
else else
warning "Backup репозиторий не настроен, пропускаем" warning "Не удалось создать бэкап в $backup_remote"
fi
else
warning "$backup_remote репозиторий не настроен, пропускаем"
fi fi
} }
# Главная функция # Главная функция
main() { main() {
local remote_source="${1:-origin}"
local backup_remote="${2:-backup}"
echo "" echo ""
echo "🚀 SmartSolTech - Автоматическое обновление" echo "🚀 SmartSolTech - Автоматическое обновление"
echo "==========================================" echo "=========================================="
echo "📡 Источник: $remote_source"
if git remote | grep -q "^${backup_remote}$"; then
echo "💾 Бэкап: $backup_remote"
fi
echo "" echo ""
# Проверка что мы в правильной директории # Проверка что мы в правильной директории
@@ -221,13 +259,14 @@ main() {
exit 1 exit 1
fi fi
local start_time=$(date +%s) local start_time
start_time=$(date +%s)
# Выполняем все этапы # Выполняем все этапы
check_dependencies check_dependencies
backup_to_remote backup_to_remote "$backup_remote"
cleanup_staticfiles cleanup_staticfiles
update_code update_code "$remote_source"
stop_containers stop_containers
build_images build_images
start_containers start_containers
@@ -235,12 +274,14 @@ main() {
collect_static collect_static
health_check health_check
local end_time=$(date +%s) local end_time
end_time=$(date +%s)
local duration=$((end_time - start_time)) local duration=$((end_time - start_time))
echo "" echo ""
echo "🎉 Обновление завершено успешно!" echo "🎉 Обновление завершено успешно!"
echo "⏱️ Время выполнения: ${duration} секунд" echo "⏱️ Время выполнения: ${duration} секунд"
echo "📡 Источник обновления: $remote_source"
echo "" echo ""
echo "📊 Полезная информация:" echo "📊 Полезная информация:"
echo " • Веб-сайт: http://localhost:8000" echo " • Веб-сайт: http://localhost:8000"
@@ -279,11 +320,20 @@ case "${1:-}" in
echo "SmartSolTech - Скрипт автоматического обновления" echo "SmartSolTech - Скрипт автоматического обновления"
echo "" echo ""
echo "Использование:" echo "Использование:"
echo " $0 - Полное обновление (по умолчанию)" echo " $0 - Полное обновление из origin (по умолчанию)"
echo " $0 origin - Обновление из origin репозитория"
echo " $0 backup - Обновление из backup репозитория"
echo " $0 origin backup - Обновление из origin с бэкапом в backup"
echo " $0 backup origin - Обновление из backup с бэкапом в origin"
echo " $0 --help - Показать эту справку" echo " $0 --help - Показать эту справку"
echo " $0 --logs - Показать логи без обновления" echo " $0 --logs - Показать логи без обновления"
echo " $0 --status - Показать статус без обновления" echo " $0 --status - Показать статус без обновления"
echo "" echo ""
echo "Примеры:"
echo " $0 # обновление из origin"
echo " $0 backup # обновление из backup репозитория"
echo " $0 origin backup # обновление из origin, бэкап в backup"
echo ""
exit 0 exit 0
;; ;;
--logs) --logs)
@@ -295,12 +345,8 @@ case "${1:-}" in
health_check health_check
exit 0 exit 0
;; ;;
"")
main
;;
*) *)
error "Неизвестный параметр: $1" # Передаем все параметры в main
echo "Используйте --help для справки" main "$@"
exit 1
;; ;;
esac esac