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

added parallel testing; update REAMDME.md

parent e999988d
......@@ -34,11 +34,19 @@
Запуск по пресету:
```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 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`:
```bash
......@@ -96,16 +104,18 @@
- `--eepm-dir <path>`: явный путь к каталогу `eepm`
- `--builder-user <user>`: пользователь для builder64-источника
- `--builder-path <path>`: явный builder64-путь вместо дефолта
- `--preset <all|russian|mainstream>`: добавить набор систем
- `--preset <all|russian|main>`: добавить набор систем
- `--parallel`: запустить все тесты параллельно
- `-j <N>`: запустить не более N тестов одновременно
- `--log-root <path>`: каталог для логов
## Пресеты
Сейчас определены такие пресеты:
- `mainstream`: `fedora`, `debian`, `ubuntu`, `opensuse/leap`, `alpine`, `void`
- `russian`: `alt:sisyphus`
- `all`: `mainstream` + `russian`
- `main`: `fedora`, `debian`, `ubuntu:24.04`, `alt:sisyphus`, `alt:p11`
- `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`: `main` + `russian`
Повторы автоматически удаляются после нормализации имени системы.
......@@ -239,6 +249,8 @@ ayugram-fedora-latest-20260331-185448.log
Если систем было несколько, в конце дополнительно печатается сводная таблица `PASS/FAIL` со ссылкой на лог каждого прогона.
В параллельном режиме (`--parallel` / `-j N`) живой вывод контейнеров подавляется — весь вывод сохраняется только в лог-файлы. В терминал выводятся только короткие статусы запуска и завершения каждого теста.
## Типовые сценарии
Запустить локально, если Docker доступен:
......
......@@ -27,6 +27,7 @@ RUN_TOKEN="$(date +%Y%m%d-%H%M%S)-$$"
SYSTEM_INPUTS=()
PRESET_NAMES=()
TARGET_SYSTEMS=()
PARALLEL_JOBS=0
SUMMARY_SYSTEMS=()
SUMMARY_RESULTS=()
SUMMARY_LOGS=()
......@@ -71,6 +72,8 @@ Options:
--builder-path <path> Explicit builder64 source path
--preset <all|russian|main>
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
-h, --help Show this help
......@@ -693,11 +696,7 @@ run_for_system() {
info "Normalized system: $SYSTEM_IMAGE"
info "Test command: epm $COMMAND $APP_NAME"
if run_once 2>&1 | tee "$LOG_FILE"; then
status=0
else
status=$?
fi
run_once 2>&1 | tee "$LOG_FILE" && status=0 || status=$?
if ((status == 0)); then
printf '\nTest passed: epm %s %s on %s\n' "$COMMAND" "$APP_NAME" "$SYSTEM_IMAGE"
......@@ -712,6 +711,34 @@ run_for_system() {
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() {
local positional=()
......@@ -769,6 +796,15 @@ parse_args() {
PRESET_NAMES+=("$2")
shift 2
;;
--parallel)
PARALLEL_JOBS=-1
shift
;;
-j)
[[ $# -ge 2 ]] || fatal "-j requires a value"
PARALLEL_JOBS="$2"
shift 2
;;
--log-root)
[[ $# -ge 2 ]] || fatal "--log-root requires a value"
LOG_ROOT="$2"
......@@ -834,15 +870,51 @@ main() {
build_target_systems
total="${#TARGET_SYSTEMS[@]}"
for system_image in "${TARGET_SYSTEMS[@]}"; do
((index += 1))
if run_for_system "$system_image" "$index" "$total"; then
run_status=0
if ((PARALLEL_JOBS != 0 && total > 1)); then
local result_dir
local i sys res log
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
run_status=$?
status="$run_status"
info "Running $total tests in parallel"
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
......
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