132 lines
6.5 KiB
Django/Jinja
132 lines
6.5 KiB
Django/Jinja
#!/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
|