Commit 1a26a6c8 authored by Ivan Mazhukin's avatar Ivan Mazhukin

added parallel testing; update REAMDME.md

parent e999988d
...@@ -34,11 +34,19 @@ ...@@ -34,11 +34,19 @@
Запуск по пресету: Запуск по пресету:
```bash ```bash
./epm-docker-test.sh ayugram --preset mainstream ./epm-docker-test.sh ayugram --preset main
./epm-docker-test.sh ayugram --preset russian ./epm-docker-test.sh ayugram --preset russian
./epm-docker-test.sh ayugram --preset all ./epm-docker-test.sh ayugram --preset all
``` ```
Параллельный запуск:
```bash
./epm-docker-test.sh --parallel ayugram fedora debian alt:p11
./epm-docker-test.sh --parallel ayugram --preset main
./epm-docker-test.sh -j 3 ayugram --preset all
```
Запуск с явным путём к `eepm`: Запуск с явным путём к `eepm`:
```bash ```bash
...@@ -96,16 +104,18 @@ ...@@ -96,16 +104,18 @@
- `--eepm-dir <path>`: явный путь к каталогу `eepm` - `--eepm-dir <path>`: явный путь к каталогу `eepm`
- `--builder-user <user>`: пользователь для builder64-источника - `--builder-user <user>`: пользователь для builder64-источника
- `--builder-path <path>`: явный builder64-путь вместо дефолта - `--builder-path <path>`: явный builder64-путь вместо дефолта
- `--preset <all|russian|mainstream>`: добавить набор систем - `--preset <all|russian|main>`: добавить набор систем
- `--parallel`: запустить все тесты параллельно
- `-j <N>`: запустить не более N тестов одновременно
- `--log-root <path>`: каталог для логов - `--log-root <path>`: каталог для логов
## Пресеты ## Пресеты
Сейчас определены такие пресеты: Сейчас определены такие пресеты:
- `mainstream`: `fedora`, `debian`, `ubuntu`, `opensuse/leap`, `alpine`, `void` - `main`: `fedora`, `debian`, `ubuntu:24.04`, `alt:sisyphus`, `alt:p11`
- `russian`: `alt:sisyphus` - `russian`: `alt:sisyphus`, `alt:p11`, `rosa-2021.1`, `rosalab/rosa2021.1`, `registry.red-soft.ru/redos7c/ubi`, `registry.red-soft.ru/redos8c/ubi`, `registry.astralinux.ru/library/alse:1.7`
- `all`: `mainstream` + `russian` - `all`: `main` + `russian`
Повторы автоматически удаляются после нормализации имени системы. Повторы автоматически удаляются после нормализации имени системы.
...@@ -239,6 +249,8 @@ ayugram-fedora-latest-20260331-185448.log ...@@ -239,6 +249,8 @@ ayugram-fedora-latest-20260331-185448.log
Если систем было несколько, в конце дополнительно печатается сводная таблица `PASS/FAIL` со ссылкой на лог каждого прогона. Если систем было несколько, в конце дополнительно печатается сводная таблица `PASS/FAIL` со ссылкой на лог каждого прогона.
В параллельном режиме (`--parallel` / `-j N`) живой вывод контейнеров подавляется — весь вывод сохраняется только в лог-файлы. В терминал выводятся только короткие статусы запуска и завершения каждого теста.
## Типовые сценарии ## Типовые сценарии
Запустить локально, если Docker доступен: Запустить локально, если Docker доступен:
......
...@@ -27,6 +27,7 @@ RUN_TOKEN="$(date +%Y%m%d-%H%M%S)-$$" ...@@ -27,6 +27,7 @@ RUN_TOKEN="$(date +%Y%m%d-%H%M%S)-$$"
SYSTEM_INPUTS=() SYSTEM_INPUTS=()
PRESET_NAMES=() PRESET_NAMES=()
TARGET_SYSTEMS=() TARGET_SYSTEMS=()
PARALLEL_JOBS=0
SUMMARY_SYSTEMS=() SUMMARY_SYSTEMS=()
SUMMARY_RESULTS=() SUMMARY_RESULTS=()
SUMMARY_LOGS=() SUMMARY_LOGS=()
...@@ -71,6 +72,8 @@ Options: ...@@ -71,6 +72,8 @@ Options:
--builder-path <path> Explicit builder64 source path --builder-path <path> Explicit builder64 source path
--preset <all|russian|main> --preset <all|russian|main>
Add a named system preset Add a named system preset
--parallel Run tests in parallel (all at once)
-j <N> Run up to N tests in parallel
--log-root <path> Directory for saved logs --log-root <path> Directory for saved logs
-h, --help Show this help -h, --help Show this help
...@@ -693,11 +696,7 @@ run_for_system() { ...@@ -693,11 +696,7 @@ run_for_system() {
info "Normalized system: $SYSTEM_IMAGE" info "Normalized system: $SYSTEM_IMAGE"
info "Test command: epm $COMMAND $APP_NAME" info "Test command: epm $COMMAND $APP_NAME"
if run_once 2>&1 | tee "$LOG_FILE"; then run_once 2>&1 | tee "$LOG_FILE" && status=0 || status=$?
status=0
else
status=$?
fi
if ((status == 0)); then if ((status == 0)); then
printf '\nTest passed: epm %s %s on %s\n' "$COMMAND" "$APP_NAME" "$SYSTEM_IMAGE" printf '\nTest passed: epm %s %s on %s\n' "$COMMAND" "$APP_NAME" "$SYSTEM_IMAGE"
...@@ -712,6 +711,34 @@ run_for_system() { ...@@ -712,6 +711,34 @@ run_for_system() {
return "$status" return "$status"
} }
run_for_system_parallel() {
local system_image="$1"
local index="$2"
local total="$3"
local result_dir="$4"
local status
SYSTEM_IMAGE="$system_image"
LOG_FILE="$(create_log_file)"
printf '[%d/%d] started %s -> %s\n' "$index" "$total" "$SYSTEM_IMAGE" "$LOG_FILE" >&2
if run_once >"$LOG_FILE" 2>&1; then
status=0
else
status=$?
fi
if ((status == 0)); then
printf '[%d/%d] %sPASS%s %s\n' "$index" "$total" "$COLOR_PASS" "$COLOR_RESET" "$SYSTEM_IMAGE" >&2
else
printf '[%d/%d] %sFAIL%s %s\n' "$index" "$total" "$COLOR_ERROR" "$COLOR_RESET" "$SYSTEM_IMAGE" >&2
fi
printf '%s\t%s\t%s\n' "$system_image" "$status" "$LOG_FILE" >"$result_dir/$index.result"
return 0
}
parse_args() { parse_args() {
local positional=() local positional=()
...@@ -769,6 +796,15 @@ parse_args() { ...@@ -769,6 +796,15 @@ parse_args() {
PRESET_NAMES+=("$2") PRESET_NAMES+=("$2")
shift 2 shift 2
;; ;;
--parallel)
PARALLEL_JOBS=-1
shift
;;
-j)
[[ $# -ge 2 ]] || fatal "-j requires a value"
PARALLEL_JOBS="$2"
shift 2
;;
--log-root) --log-root)
[[ $# -ge 2 ]] || fatal "--log-root requires a value" [[ $# -ge 2 ]] || fatal "--log-root requires a value"
LOG_ROOT="$2" LOG_ROOT="$2"
...@@ -834,15 +870,51 @@ main() { ...@@ -834,15 +870,51 @@ main() {
build_target_systems build_target_systems
total="${#TARGET_SYSTEMS[@]}" total="${#TARGET_SYSTEMS[@]}"
for system_image in "${TARGET_SYSTEMS[@]}"; do if ((PARALLEL_JOBS != 0 && total > 1)); then
((index += 1)) local result_dir
if run_for_system "$system_image" "$index" "$total"; then local i sys res log
run_status=0 result_dir="$(mktemp -d "${TMPDIR:-/tmp}/epm-docker-test-results.XXXXXX")"
if ((PARALLEL_JOBS > 0)); then
info "Running $total tests in parallel (max $PARALLEL_JOBS)"
else else
run_status=$? info "Running $total tests in parallel"
status="$run_status"
fi fi
done info "Live output is suppressed in parallel mode; logs will be saved to files"
for system_image in "${TARGET_SYSTEMS[@]}"; do
((index += 1))
run_for_system_parallel "$system_image" "$index" "$total" "$result_dir" &
if ((PARALLEL_JOBS > 0)); then
while (( $(jobs -rp | wc -l) >= PARALLEL_JOBS )); do
wait -n 2>/dev/null || true
done
fi
done
wait
for ((i = 1; i <= total; i++)); do
if [[ -f "$result_dir/$i.result" ]]; then
IFS=$'\t' read -r sys res log < "$result_dir/$i.result"
record_summary_result "$sys" "$res" "$log"
((res == 0)) || status="$res"
fi
done
rm -rf "$result_dir"
else
for system_image in "${TARGET_SYSTEMS[@]}"; do
((index += 1))
if run_for_system "$system_image" "$index" "$total"; then
run_status=0
else
run_status=$?
status="$run_status"
fi
done
fi
print_summary_table print_summary_table
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment