ansible_playbooks/roles/magos/templates/upload_logs.sh.j2
2026-07-21 14:37:34 +03:00

132 lines
6.5 KiB
Django/Jinja
Executable file
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
set -euo pipefail
BRANCH=$(hostname)-logs
LOGS_DIR="{{ magos_log_dir }}"
REPO_URL="https://{{ git_token }}@svc-git.cirex.ru/cloudstack/ptaf_config_logs.git"
echo "$(date '+%Y-%m-%d %H:%M:%S') Начинаем синхронизацию логов в ветку '$BRANCH'"
cd "$LOGS_DIR"
# Если это не git-репозиторий — инициализируем новый
if [ ! -d ".git" ]; then
echo "$(date '+%Y-%m-%d %H:%M:%S') Инициализируем новый локальный git-репозиторий"
git init
git config user.name "ptaf-sync-script"
git config user.email "ptaf-sync-script@$(hostname)"
fi
# Настраиваем пользователя
git config user.name "ptaf-sync-script" 2>/dev/null || true
git config user.email "ptaf-sync-script@$(hostname)" 2>/dev/null || true
# Настраиваем стратегию разрешения конфликтов
git config pull.rebase true
git config rebase.autoStash true
# Добавляем/проверяем remote origin
if ! git remote | grep -q '^origin$'; then
echo "$(date '+%Y-%m-%d %H:%M:%S') Добавляем remote origin: $REPO_URL"
git remote add origin "$REPO_URL"
else
# Обновляем URL на случай изменения токена
git remote set-url origin "$REPO_URL"
fi
# Очищаем возможные битые ссылки перед fetch
echo "$(date '+%Y-%m-%d %H:%M:%S') Очищаем старые ссылки"
git remote prune origin 2>/dev/null || true
# КЛЮЧЕВОЕ ИЗМЕНЕНИЕ: Получаем только нашу ветку, а не все ветки
echo "$(date '+%Y-%m-%d %H:%M:%S') Получаем информацию только о ветке '$BRANCH'"
if git ls-remote --heads origin "$BRANCH" | grep -q "$BRANCH"; then
# Ветка существует на сервере - получаем только её
git fetch origin "$BRANCH:refs/remotes/origin/$BRANCH" --force 2>/dev/null || {
echo "$(date '+%Y-%m-%d %H:%M:%S') Ошибка при fetch, пытаемся очистить и повторить"
rm -f .git/refs/remotes/origin/"$BRANCH"
git fetch origin "$BRANCH:refs/remotes/origin/$BRANCH" --force 2>/dev/null || true
}
BRANCH_EXISTS_REMOTE=true
else
echo "$(date '+%Y-%m-%d %H:%M:%S') Ветка '$BRANCH' ещё не существует на сервере"
BRANCH_EXISTS_REMOTE=false
fi
# Проверяем, существует ли ветка локально
if ! git show-ref --verify --quiet refs/heads/"$BRANCH"; then
echo "$(date '+%Y-%m-%d %H:%M:%S') Создаём локальную ветку '$BRANCH'"
if [ "$BRANCH_EXISTS_REMOTE" = true ]; then
# Создаём ветку на основе удалённой
git checkout -b "$BRANCH" "origin/$BRANCH"
else
# Создаём новую ветку (может быть пустой или на основе текущего HEAD)
git checkout --orphan "$BRANCH" 2>/dev/null || git checkout -b "$BRANCH"
# Очищаем индекс для orphan ветки
git rm -rf . 2>/dev/null || true
fi
else
git checkout "$BRANCH" 2>/dev/null || {
echo "$(date '+%Y-%m-%d %H:%M:%S') Ошибка переключения на ветку, принудительно переключаемся"
git checkout -f "$BRANCH"
}
fi
# Добавляем все изменения
echo "$(date '+%Y-%m-%d %H:%M:%S') Добавляем все изменения"
git add -A
# Проверяем, есть ли что коммитить и коммитим СНАЧАЛА
if ! git diff-index --quiet HEAD -- 2>/dev/null; then
COMMIT_MSG="Auto commit $(date '+%Y-%m-%d %H:%M:%S') [host: $(hostname)]"
echo "$(date '+%Y-%m-%d %H:%M:%S') Коммитим локальные изменения ПЕРЕД pull: $COMMIT_MSG"
git commit -m "$COMMIT_MSG"
fi
# Теперь делаем pull/rebase если ветка существует на сервере
if [ "$BRANCH_EXISTS_REMOTE" = true ]; then
echo "$(date '+%Y-%m-%d %H:%M:%S') Синхронизация с удалённой веткой origin/$BRANCH"
# Вариант 1: Пробуем обычный rebase
if git pull --rebase origin "$BRANCH" 2>/dev/null; then
echo "$(date '+%Y-%m-%d %H:%M:%S') Rebase успешен"
else
echo "$(date '+%Y-%m-%d %H:%M:%S') Конфликт при rebase, разрешаем автоматически"
# Прерываем rebase
git rebase --abort 2>/dev/null || true
# Вариант 2: Используем стратегию merge с предпочтением локальных изменений
echo "$(date '+%Y-%m-%d %H:%M:%S') Используем merge стратегию с предпочтением локальных изменений"
if git pull --no-rebase --strategy=recursive --strategy-option=ours origin "$BRANCH" 2>/dev/null; then
echo "$(date '+%Y-%m-%d %H:%M:%S') Merge успешен с предпочтением локальных изменений"
else
echo "$(date '+%Y-%m-%d %H:%M:%S') Merge также не удался, используем force push"
# Вариант 3: Если и merge не сработал - будем пушить с force
fi
fi
fi
# Проверяем снова, есть ли что коммитить после синхронизации
if ! git diff-index --quiet HEAD -- 2>/dev/null; then
echo "$(date '+%Y-%m-%d %H:%M:%S') Есть изменения после синхронизации, коммитим"
git commit -m "Post-sync changes $(date '+%Y-%m-%d %H:%M:%S')"
fi
echo "$(date '+%Y-%m-%d %H:%M:%S') Пушим в origin/$BRANCH"
# Пушим с fallback вариантами
if git push origin "$BRANCH" --set-upstream 2>/dev/null; then
echo "$(date '+%Y-%m-%d %H:%M:%S') Push успешен"
elif git push origin "$BRANCH" --force-with-lease 2>/dev/null; then
echo "$(date '+%Y-%m-%d %H:%M:%S') Push успешен с --force-with-lease"
else
echo "$(date '+%Y-%m-%d %H:%M:%S') Используем force push (локальные изменения приоритетнее)"
git push origin "$BRANCH" --force
fi
echo "$(date '+%Y-%m-%d %H:%M:%S') Успешно закоммичено и запушено"
# Запускаем следующий скрипт
{{ magos_upload_configs_script_path }} &
exit 0