Commit 94b10240 authored by Ivan Mazhukin's avatar Ivan Mazhukin

add --follow

parent a481bf15
......@@ -54,6 +54,7 @@
./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
./epm-docker-test.sh -j 3 --follow ayugram --preset all
```
Запуск с явным путём к `eepm`:
......@@ -118,6 +119,7 @@
- `--exec <cmd>`: выполнить произвольную shell-команду вместо `epm play` после bootstrap системы
- `--parallel`: запустить все тесты параллельно
- `-j <N>`: запустить не более N тестов одновременно
- `--follow`: показывать live-вывод параллельных тестов с префиксами
- `--log-root <path>`: каталог для логов
## Пресеты
......@@ -262,7 +264,9 @@ ayugram-fedora-latest-20260331-185448.log
Если систем было несколько, в конце дополнительно печатается сводная таблица `PASS/FAIL` со ссылкой на лог каждого прогона.
В параллельном режиме (`--parallel` / `-j N`) живой вывод контейнеров подавляется — весь вывод сохраняется только в лог-файлы. В терминал выводятся только короткие статусы запуска и завершения каждого теста.
В параллельном режиме (`--parallel` / `-j N`) живой вывод контейнеров по умолчанию подавляется — весь вывод сохраняется только в лог-файлы. В терминал выводятся только короткие статусы запуска и завершения каждого теста.
Если добавить `--follow`, вывод параллельных тестов будет показываться в терминале с префиксами вида `[2/5] fedora:latest | ...` и одновременно сохраняться в соответствующие лог-файлы. Для `--exec` live-вывод начинается после bootstrap; полный bootstrap остаётся в лог-файле.
## Типовые сценарии
......
......@@ -7,6 +7,7 @@ SCRIPT_PATH="$(realpath "$SCRIPT_REF" 2>/dev/null || printf '%s\n' "$SCRIPT_REF"
DEFAULT_REMOTE_HOST="${EPM_DOCKER_TEST_REMOTE_HOST:-builder64}"
DEFAULT_REMOTE_USER="${EPM_DOCKER_TEST_REMOTE_USER:-builder-robot}"
DEFAULT_LOG_ROOT="${XDG_STATE_HOME:-$HOME/.local/state}/epm-docker-test"
EXEC_OUTPUT_MARKER="__EPM_DOCKER_TEST_EXEC_OUTPUT_BEGIN__"
COMMAND="play"
PLAY_FLAGS=()
......@@ -30,6 +31,7 @@ SYSTEM_INPUTS=()
PRESET_NAMES=()
TARGET_SYSTEMS=()
PARALLEL_JOBS=0
FOLLOW_LOGS=0
EFFECTIVE_RUN_MODE=""
SUMMARY_SYSTEMS=()
SUMMARY_RESULTS=()
......@@ -80,6 +82,7 @@ Options:
--exec <cmd> Run arbitrary shell command after bootstrap
--parallel Run tests in parallel (all at once)
-j <N> Run up to N tests in parallel
--follow Stream parallel test output with prefixes
--log-root <path> Directory for saved logs
-h, --help Show this help
......@@ -547,6 +550,9 @@ case "$TEST_COMMAND" in
exec bash ./bin/eepm play --auto "$@" "$APP_NAME"
;;
exec)
if [ "${EPM_DOCKER_TEST_EXEC_MARKER:-0}" = 1 ]; then
printf '%s\n' "__EPM_DOCKER_TEST_EXEC_OUTPUT_BEGIN__" >&2
fi
exec sh -c "$1"
;;
*)
......@@ -599,6 +605,12 @@ run_container_locally() {
--hostname epm-docker-test
)
if [[ -n "$EXEC_COMMAND" && "$FOLLOW_LOGS" -eq 1 ]]; then
docker_args+=(
--env EPM_DOCKER_TEST_EXEC_MARKER=1
)
fi
if [[ -n "$resolved_source" ]]; then
docker_args+=(
--workdir /work/eepm
......@@ -628,6 +640,9 @@ build_remote_args() {
local target
REMOTE_ARGS=(--internal-local-run --mode local "${PLAY_FLAGS[@]}")
if ((FOLLOW_LOGS)); then
REMOTE_ARGS+=(--follow)
fi
REMOTE_SYNC_DIR=""
target="$(remote_target)"
......@@ -816,17 +831,40 @@ run_for_system_parallel() {
local total="$3"
local result_dir="$4"
local status
local show_output=0
local -a pipeline_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 ((FOLLOW_LOGS)); then
if run_once 2>&1 | while IFS= read -r line || [[ -n "$line" ]]; do
if [[ -n "$EXEC_COMMAND" ]]; then
if [[ "$show_output" -eq 0 && "$line" == "$EXEC_OUTPUT_MARKER" ]]; then
show_output=1
continue
fi
printf '%s\n' "$line"
[[ "$show_output" -eq 1 ]] || continue
else
printf '%s\n' "$line"
fi
printf '[%d/%d] %s | %s\n' "$index" "$total" "$SYSTEM_IMAGE" "$line" >&2
done >"$LOG_FILE"; then
status=0
else
pipeline_status=("${PIPESTATUS[@]}")
status="${pipeline_status[0]}"
fi
else
if run_once >"$LOG_FILE" 2>&1; then
status=0
else
status=$?
fi
fi
if ((status == 0)); then
printf '[%d/%d] %sPASS%s %s\n' "$index" "$total" "$COLOR_PASS" "$COLOR_RESET" "$SYSTEM_IMAGE" >&2
......@@ -899,6 +937,10 @@ parse_args() {
PARALLEL_JOBS=-1
shift
;;
--follow)
FOLLOW_LOGS=1
shift
;;
-j)
[[ $# -ge 2 ]] || fatal "-j requires a value"
PARALLEL_JOBS="$2"
......@@ -991,7 +1033,11 @@ main() {
else
info "Running $total tests in parallel"
fi
if ((FOLLOW_LOGS)); then
info "Live output is enabled; prefixed output will also be saved to log files"
else
info "Live output is suppressed in parallel mode; logs will be saved to files"
fi
for system_image in "${TARGET_SYSTEMS[@]}"; do
((index += 1))
......
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