1
0
Fork 0
bash_scripts/all_repo_copy.sh
2025-02-13 16:17:05 +03:00

97 lines
6.9 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="music"
export user="golovin"
export token && token="$(cat ".token2")"
export basedir="$PWD"
export bash="$PWD/avatars/bash.jpg"
export music="$PWD/avatars/music.jpg"
export time_ms && time_ms="$(date '+%s%3N')"
#-----------------------------------------------------------------------------------------------;
# вывести строку текста в консоль и дописать в конец файла
function info_log { case "$2" in "") echo_tee "$(tee)" "$1" ;; *) echo_tee "$1" "$2" ;; esac }
function echo_tee { echo "$1" | tee -a "$basedir/logs/$domain.$2.log"; }
#-----------------------------------------------------------------------------------------------;
# создание репозиториев
function repo_copy {
repo="${1##*/}"
cd "$repo" || return 1
#-----------------------------------------------------------------------------------------------;
heading+=("1. Вызываем API сервера Gitlab и пересоздаём удалённый репозиторий на сервере.")
heading+=("2. Отправляем данные из локального репозитория git на сервер Gitlab.")
#-----------------------------------------------------------------------------------------------;
avatar="$music"
case "$repo" in
"bash_scripts") description="Управление процессами" && avatar="$bash" ;;
"compilation") description="Случайный порядок / 44 MHz / 128 Kbps" ;;
*) return ;; # никаких лишних каталогов
esac
#-----------------------------------------------------------------------------------------------;
while true; do
printf '%s\n' "${heading[@]}" >"$basedir/logs/$domain.$repo.log"
info_log "Удаление старого репозитория на сервере" "$repo"
curl -i -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\" }" | info_log "$repo"
info_log "" "$repo"
info_log "Создание нового репозитория пользователя" "$repo"
curl -i -X POST "https://$domain/api/v4/projects" \
-H "PRIVATE-TOKEN: $token" \
-H "Content-Type: application/json" -d "{
\"name\": \"$repo\", \"description\": \"$description\" }" | info_log "$repo"
info_log "" "$repo"
info_log "Перемещение репозитория в группу" "$repo"
curl -i -X PUT "https://$domain/api/v4/projects/$user%2F$repo/transfer?namespace=$owner" \
-H "PRIVATE-TOKEN: $token" | info_log "$repo"
info_log "" "$repo"
info_log "Изменение свойств репозитория / отключение ненужного" "$repo"
curl -i -X PUT "https://$domain/api/v4/projects/$owner%2F$repo" \
-H "PRIVATE-TOKEN: $token" \
-H "Content-Type: application/json" -d "{
\"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\" }" | info_log "$repo"
info_log "" "$repo"
info_log "Добавление аватарки для репозитория" "$repo"
curl -i -X PUT "https://$domain/api/v4/projects/$owner%2F$repo" \
-H "PRIVATE-TOKEN: $token" \
-F "avatar=@$avatar" | info_log "$repo"
info_log "" "$repo"
#-----------------------------------------------------------------------------------------------;
# проверка корректности ответов от сервера при создании репозитория
case "$(tail -n+10 "$basedir/logs/$domain.$repo.log" | grep -cE '^HTTP/[1,2].{,2}? [4,5]')" in
0) break ;; *) echo "Ошибка 400-500 при подключении к серверу: $repo" ;;
esac
done
#-----------------------------------------------------------------------------------------------;
info_log "Отправка данных из локального репозитория на сервер" "$repo"
git remote add "$domain" "git@$domain:$owner/$repo.git"
git push -u "$domain" "master" | info_log "$repo"
#-----------------------------------------------------------------------------------------------;
# замер продолжительности выполнения в миллисекундах, пересчёт в минуты, секунды и миллисекунды
tms="$(($(date '+%s%3N') - time_ms))" && min="$((tms / 1000 / 60))" && sec="$((tms / 1000 % 60))"
ms="$((tms % 1000))" && printf 'Общее время выполнения: %02d:%02d.%03d мс.' "$min" "$sec" "$ms" | info_log "$repo"
}
export -f repo_copy info_log echo_tee
cd .. # выход из репозитория
# запуск параллельной обработки всех репозиториев, расположенных на одном уровне с текущим, кроме папки ".idea"
find . -mindepth 1 -maxdepth 1 -type d -not -name ".idea" -printf 'repo_copy "%h/%f"\0' | xargs -n1 -0 -P0 bash -c