1
0
Fork 0
dispatcher/all_repo_copy2.sh
2025-02-23 09:04:08 +03:00

118 lines
8.7 KiB
Bash
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
echo "Копирование данных из репозиториев на сервер 'hub.mos.ru'."
#-----------------------------------------------------------------------------------------------;
prompt="Подтверждение (да/нет): " && read -erp "$prompt" line && echo -ne "\033[1A$prompt\033[K"
case "${line,,}" in y | yes | д | да) echo "ПОДТВЕРЖДЕНИЕ" ;; *) echo "ОТМЕНА" && exit 0 ;; esac
#-----------------------------------------------------------------------------------------------;
export domain="hub.mos.ru"
export owner="pictures"
export user="golovin"
export token && token="$(cat ".token2")"
export basedir="$PWD"
export bash="$PWD/avatars/bash.jpg"
export picture="$PWD/avatars/picture.jpg"
#-----------------------------------------------------------------------------------------------;
time_ms="$(date '+%s%3N')"
# копирование данных
function repo_copy2 {
repo="${1#*:}" && red="\e[91m" && green="\e[92m" && norm="\e[0m"
# соответствующая строка для вывода сообщений по ходу выполнения функции
num="${1%:*}" && pre="\e[${num}A${repo}: " && aft="\e[K\e[${num}B\r"
cd "$repo" || { printf "${pre}${red}%s${norm}${aft}" "Не найден каталог." && return 1; }
# подготовка значений для параметров
avatar="$picture" && private=""
case "$repo" in
"creativity") description="Фотографии без компьютерных эффектов" ;;
"creativity3") description="Фотографии и картинки со смыслом и с юмором" ;;
"dispatcher") description="Управление репозиториями" && avatar="$bash" ;;
"icons") description="Иконки по темам" ;;
"wallpapers") description="Обои для рабочего стола" && private="\"visibility\": \"internal\"," ;;
"wallpapers2") description="Обои для рабочего стола" ;;
*) return ;; # никаких лишних каталогов
esac
# 1. Создание удалённого репозитория на сервере Gitlab.
# 2. Отправка данных из локального репозитория git на сервер Gitlab.
# 3. Проверка корректности получения данных на сервере Gitlab.
for ((ms1 = "$(date '+%s%3N')"; $(date '+%s%3N') - ms1 < 60000; pass = 0)); do
for ((ms2 = "$(date '+%s%3N')"; $(date '+%s%3N') - ms2 < 10000; remote = 0)); do
[ "$remote" != 0 ] && printf "${pre}%s${aft}" "Удаление старого репозитория на сервере."
curl -f -X DELETE "https://$domain/api/v4/projects/$owner%2F$repo" \
-H "PRIVATE-TOKEN: $token" \
-H "Content-Type: application/json" -d "{
\"permanently_remove\": \"true\", \"full_path\": \"$owner/$repo\" }" &>/dev/null \
|| { printf "${pre}%s${aft}" "Не удалось удалить репозиторий на сервере."; }
[ "$remote" != 0 ] && printf "${pre}%s${aft}" "Создание нового репозитория пользователя."
curl -f -X POST "https://$domain/api/v4/projects" \
-H "PRIVATE-TOKEN: $token" \
-H "Content-Type: application/json" -d "{ $private
\"name\": \"${owner}_${repo}\", \"description\": \"$description\" }" &>/dev/null \
|| { printf "${pre}%s${aft}" "Не удалось создать репозиторий на сервере."; }
[ "$remote" != 0 ] && printf "${pre}%s${aft}" "Перемещение репозитория в группу."
curl -f -X PUT "https://$domain/api/v4/projects/$user%2F${owner}_${repo}/transfer?namespace=$owner" \
-H "PRIVATE-TOKEN: $token" &>/dev/null \
|| { printf "${pre}%s${aft}" "Не удалось переместить репозиторий в группу." && continue; }
[ "$remote" != 0 ] && printf "${pre}%s${aft}" "Переименование репозитория на сервере."
curl -f -X PUT "https://$domain/api/v4/projects/$owner%2F${owner}_${repo}" \
-H "PRIVATE-TOKEN: $token" \
-H "Content-Type: application/json" -d "{
\"name\": \"$repo\", \"path\": \"$repo\",
\"emails_disabled\": \"true\", \"issues_access_level\": \"disabled\",
\"merge_requests_access_level\": \"disabled\", \"operations_access_level\": \"disabled\",
\"builds_access_level\": \"disabled\", \"request_access_enabled\": \"false\",
\"keep_latest_artifact\": \"false\", \"ci_forward_deployment_enabled\": \"false\",
\"ci_separated_caches\": \"false\", \"ci_allow_fork_pipelines_to_run_in_parent_project\": \"false\",
\"jobs_enabled\": \"false\", \"public_builds\": \"false\", \"packages_enabled\": \"false\",
\"merge_requests_enabled\": \"false\", \"issues_enabled\": \"false\", \"lfs_enabled\": \"false\",
\"snippets_enabled\": \"false\", \"container_registry_enabled\": \"false\",
\"wiki_access_level\": \"disabled\", \"container_registry_access_level\": \"disabled\",
\"security_and_compliance_access_level\": \"disabled\", \"pages_access_level\": \"disabled\",
\"analytics_access_level\": \"disabled\", \"forking_access_level\": \"disabled\",
\"releases_access_level\": \"disabled\", \"requirements_access_level\": \"disabled\",
\"environments_access_level\": \"disabled\", \"feature_flags_access_level\": \"private\",
\"infrastructure_access_level\": \"private\", \"monitor_access_level\": \"disabled\",
\"snippets_access_level\": \"disabled\", \"auto_devops_enabled\": \"false\",
\"shared_runners_enabled\": \"false\", \"group_runners_enabled\": \"false\" }" &>/dev/null \
|| { printf "${pre}%s${aft}" "Не удалось переименовать репозиторий на сервере." && continue; }
[ "$remote" != 0 ] && printf "${pre}%s${aft}" "Добавление аватарки для репозитория"
curl -f -X PUT "https://$domain/api/v4/projects/$owner%2F$repo" \
-H "PRIVATE-TOKEN: $token" \
-F "avatar=@$avatar" &>/dev/null \
|| { printf "${pre}%s${aft}" "Не удалось добавить аватарку для репозитория." && continue; }
# завершение цикла
remote=1 && break
done
case "$remote" in
1) printf "${pre}%s${aft}" "Отправка данных на сервер." ;;
*) printf "${pre}%s${aft}" "Создание на сервере более 10 секунд." && continue ;;
esac
git remote add "$domain" "git@$domain:$owner/$repo.git" &>/dev/null
git push -u "$domain" "master" &>/dev/null
printf "${pre}%s${aft}" "Проверка доступности данных."
for ((ms2 = "$(date '+%s%3N')"; $(date '+%s%3N') - ms2 < 10000; testing = 0)); do
curl -f -X GET "https://$domain/api/v4/projects/$owner%2F$repo/repository/commits" \
-H "PRIVATE-TOKEN: $token" 2>/dev/null | grep -v '^\[\]$' >/dev/null \
|| { printf "${pre}%s${aft}" "Ожидание данных на сервере." && continue; }
# завершение цикла
testing=1 && break
done
case "$testing" in
1) pass=1 && break ;;
*) printf "${pre}%s${aft}" "Проверка данных более 10 секунд." ;;
esac
done
case "$pass" in
1) printf "${pre}${green}%s${norm}${aft}" "Выполнено." ;;
*) printf "${pre}${red}%s${norm}${aft}" "Ожидание более 60 секунд." ;;
esac
}
export -f repo_copy2
cd .. # выход из репозитория
# поиск всех каталогов на одном уровне с текущим, кроме папки ".idea", сортировка и добавление порядковых номеров для строк
readarray -t folders < <(find . -mindepth 1 -maxdepth 1 -type d -not -name ".idea" -printf '%P\n' | sort -r | grep -n '\S')
# смещение курсора вниз на соответствующее количество строк
printf '%s\n' "${folders[@]#*:}" | sort
# вывод строк массива и параллельный запуск функции для каждого каталога
printf 'repo_copy2 "%s"\0' "${folders[@]}" | xargs -n1 -0 -P0 bash -c
# замер продолжительности выполнения в миллисекундах, пересчёт в минуты, секунды и миллисекунды
tms="$(($(date '+%s%3N') - time_ms))" && min="$((tms / 1000 / 60))" && sec="$((tms / 1000 % 60))"
ms="$((tms % 1000))" && printf 'Общее время выполнения: %02d:%02d.%03d мс.\n' "$min" "$sec" "$ms"