1
0
Fork 0
dispatcher/bash_scripts/suite_orchestrate.sh
2025-03-31 19:57:16 +03:00

66 lines
5.1 KiB
Bash
Executable file
Raw Permalink 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 "Публикация исходного кода из каталогов проектов."
# выполнение скриптов внутри каталога
function orchestrate {
dir="${1#*:}" && red="\e[91m" && green="\e[92m" && yellow="\e[93m" && norm="\e[0m"
# соответствующая строка для вывода сообщений по ходу выполнения функции
num="${1%:*}" && pre="\e[${num}A${dir} " && aft="\e[K\e[${num}B\r"
cd "${dir// /}" || { printf "${pre}${red}%s${norm} %s${aft}" "[•••••••••]" "Не найден каталог." && return 1; }
for ((ms1 = "$(date '+%s%3N')"; $(date '+%s%3N') - ms1 < 600000; pass = 0)); do
# 1 Создание удалённого репозитория и контроль корректности ответов от сервера
for ((ms2 = "$(date '+%s%3N')"; $(date '+%s%3N') - ms2 < 20000; remote = 0)); do
[ "$pass" != 0 ] && printf "${pre}%s %s${aft}" "[#••••••••]" "Удаление старого репозитория на сервере."
./.repo_publish.sh "delete" &>/dev/null
printf "${pre}%s %s${aft}" "[##•••••••]" "Создание нового репозитория пользователя."
./.repo_publish.sh "create" &>/dev/null
printf "${pre}%s %s${aft}" "[###••••••]" "Перемещение репозитория в группу."
./.repo_publish.sh "transfer" &>/dev/null || continue
printf "${pre}%s %s${aft}" "[####•••••]" "Изменение свойств репозитория."
./.repo_publish.sh "patch" &>/dev/null || continue
printf "${pre}%s %s${aft}" "[#####••••]" "Добавление страницы вики."
./.repo_publish.sh "wiki" &>/dev/null || continue
printf "${pre}%s %s${aft}" "[######•••]" "Добавление аватарки для репозитория."
./.repo_publish.sh "avatar" &>/dev/null || continue
remote=1 && break # завершение цикла
done
case "$remote" in
1) printf "${pre}%s %s${aft}" "[#######••]" "Создание локального репозитория." ;;
*) printf "${pre}${red}%s${norm} %s${aft}" "[•••••••••]" "Создание на сервере более 20 секунд." && continue ;;
esac
# 2 Создание локального репозитория и отправка данных на сервер
./.repo_publish.sh "local" &>/dev/null
printf "${pre}%s %s${aft}" "[########•]" "Отправка локальных данных на сервер."
./.repo_publish.sh "push" &>/dev/null
# 3 Проверка корректности получения данных на сервере
printf "${pre}%s %s${aft}" "[#########]" "Проверка получения данных на сервере."
for ((lap = 1, ms2 = "$(date '+%s%3N')"; $(date '+%s%3N') - ms2 < 20000; lap++, testing = 0)); do
track=9 && shift="$(tr -d '-' <<<$((lap / track % 2 * track - lap % track)))"
progressbar="$(printf "[%$((track - shift))s" | sed 's| |•|g')$(printf "%${shift}s]" | sed 's| |#|g')"
./.repo_publish.sh "testing" &>/dev/null \
|| { printf "${pre}${yellow}%s${norm} %s${aft}" "$progressbar" "Ожидание данных на сервере." && continue; }
testing=1 && break # завершение цикла
done
case "$testing" in
1) pass=1 && break ;;
*) printf "${pre}${red}%s${norm} %s${aft}" "[•••••••••]" "Проверка данных более 20 секунд." ;;
esac
done
case "$pass" in
1) printf "${pre}${green}%s${norm} %s${aft}" "[#########]" "Выполнено." ;;
*) printf "${pre}${red}%s${norm} %s${aft}" "[•••••••••]" "Ожидание более 10 минут." ;;
esac
}
export -f orchestrate
cd ../.. # выход из папки и из репозитория
time_ms="$(date '+%s%3N')"
# поиск всех каталогов на одном уровне с текущим, кроме папки ".idea",
# сортировка списка, выравнивание по левому краю, добавление номеров строк
readarray -t folders < <(find . -mindepth 1 -maxdepth 1 -type d -printf '%P;\n' \
| grep -v '.idea' | sort -r | column -t -s ';' -o '' | grep -n '\S')
# смещение курсора вниз на соответствующее количество строк
printf '%s\n' "${folders[@]#*:}" | sort
# вывод строк массива и параллельный запуск функции для каждого каталога
printf 'orchestrate "%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"