98 lines
6.9 KiB
Bash
98 lines
6.9 KiB
Bash
|
#!/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
|