54 lines
3.8 KiB
Bash
Executable file
54 lines
3.8 KiB
Bash
Executable file
#!/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"
|