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

add --follow

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