1
0
Fork 0
dispatcher/bash_scripts/suite_orchestrate.sh
2025-02-28 19:13:07 +03:00

54 lines
3.8 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 "Параллельное выполнение скриптов и публикация репозиториев для каталогов проектов."
# выполнение скриптов внутри каталога
function orchestrate {
dir="${1#*:}" && red="\e[91m" && green="\e[92m" && norm="\e[0m"
# соответствующая строка для вывода сообщений по ходу выполнения функции
num="${1%:*}" && pre="\e[${num}A${dir}: " && aft="\e[K\e[${num}B\r"
cd "$dir" || return
pattern="^HTTP/[1,2].{,2}? [4,5]"
printf "${pre}%s${aft}" "Создание репозитория на сервере."
for ((ms1 = "$(date '+%s%3N')"; $(date '+%s%3N') - ms1 < 60000; pass = 0)); do
# 1 Создание удалённого репозитория и проверка корректности ответов от сервера
for ((dot = 1, ms2 = "$(date '+%s%3N')"; $(date '+%s%3N') - ms2 < 10000; dot++, remote = 0)); do
ellipsis="$(seq -s '.' 0 "$dot" | tr -d '0-9')"
case "$(./.repo_remote.sh 2>/dev/null | tail -n+10 | grep -cE "$pattern")" in
0) remote=1 && break ;; *) printf "${pre}%s${aft}" "Ошибка 400-500 при подключении к серверу${ellipsis}" ;;
esac
done
case "$remote" in
1) printf "${pre}%s${aft}" "Создание локального репозитория." ;;
*) printf "${pre}%s${aft}" "Создание на сервере более 10 секунд." && continue ;;
esac
# 2 Создание локального репозитория и отправка данных на сервер
./.repo_local.sh &>/dev/null
# 3 Проверка доступности данных в вёб-интерфейсе на сервере
printf "${pre}%s${aft}" "Проверка доступности данных."
for ((dot = 1, ms2 = "$(date '+%s%3N')"; $(date '+%s%3N') - ms2 < 10000; dot++, testing = 0)); do
ellipsis="$(seq -s '.' 0 "$dot" | tr -d '0-9')"
case "$(./.repo_testing.sh 2>/dev/null | grep -cF "[91m")" in
0) testing=1 && break ;; *) printf "${pre}%s${aft}" "Ожидание данных на сервере${ellipsis}" ;;
esac
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 orchestrate
cd ../.. # выход из папки и из репозитория
time_ms="$(date '+%s%3N')"
# поиск всех каталогов на одном уровне с текущим, кроме папки ".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 '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"